Architektur

Die Engine, die nur lesen und antworten kann

Die Analyse-Engine kann genau zwei Dinge: das Modell lesen und auf localhost antworten. Sonst nichts — und das erzwingt der Betriebssystem-Kern, nicht unser Code.

Lesezeit ~6 Min · Architektur

Warum ausgerechnet diese Komponente am stärksten eingesperrt ist

Bewertet PoisonZero eine Änderung on-device, ist die Engine genau die Komponente, die angreiferkontrollierten Text liest — den Memory-Diff, den jemand gebaut haben kann, um auszubrechen. Deshalb behandeln wir sie als die am stärksten exponierte Stelle im System und sperren sie entsprechend ein: Sie ist die am stärksten eingesperrte Komponente, die wir ausliefern. Das Designziel ist nüchtern — ein Engine-Exploit soll zum folgenlosen Prozess-Crash werden, nicht zum Brückenkopf. Und stürzt die Engine ab, zuckt der Daemon nicht mit den Schultern: Er revertet die verdächtige Änderung (fail-closed).

Beachten Sie die bewusste Aufteilung. Der Daemon läuft absichtlich privilegiert — als root-Dienst (LaunchDaemon / systemd) —, weil er geschützte Memory-Dateien überwachen muss, die ihm nicht gehören, und sie an Ort und Stelle reverten muss; das geht ohne Privilegien nicht. Die Engine ist das genaue Gegenteil: Sie fasst nichts an, was der Daemon schützt, sie liest nur den verdächtigen Input — und ist deshalb auf nahezu nichts heruntergestripped. Genau diese Asymmetrie ist die Architektur: Die am stärksten exponierte Komponente ist die am stärksten eingesperrte, und sie zu knacken erreicht den privilegierten Daemon nicht.

Die Engine liest berufsmäßig angreiferkontrollierten Input. Wir nehmen an, dass sie geknackt werden kann — und bauen so, dass das Knacken nichts bringt.

macOS: die Kernel-Sandbox

Auf macOS läuft die Engine in der Kernel-Sandbox (Seatbelt / sandbox-exec) mit einem deny-by-default-Profil: Alles ist verboten, sofern nicht ausdrücklich erlaubt. Das Profil reist mit dem Daemon mit und liegt als auditierbare Datei neben dem Modell — Sie können genau nachlesen, was die Engine darf. Läuft der Dienst als root, fällt die Engine selbst auf einen unprivilegierten Nutzer (nobody) zurück.

Live auf Apple Silicon verifiziert — und die Sandbox kostet keine messbare Latenz: Eine warme Bewertung läuft so oder so in etwa 1,1 Sekunden.

Linux: Landlock, vom Kernel erzwungen

Auf Linux ist der Käfig Landlock, ein Kernel-Sicherheitsmodul (LSM), erneut deny-by-default. Die Engine darf:

Ausgehende Verbindungen verweigert der Kernel mit „permission denied“ — bevor ein einziges Byte das System verlässt. Das ist kein Versprechen in unserem Code; es wird in der CI auf einem echten Kernel bei jedem Build bewiesen. Kein Schreiben auf die Platte, kein Start fremder Programme, kein Netzwerk-Egress.

„Nur die Modell-Datei lesen“ stimmt nur, wenn die Engine sonst wirklich nichts von der Platte braucht. Deshalb ist die Linux-Engine voll-statisch gegen musl gebaut — ohne dynamischen Loader, ohne geteilte libc — auf beiden Architekturen (amd64 und arm64). Ein normal gelinktes Binary müsste beim Start /lib64/ld-linux und die System-libc lesen und ausführen und diese Pfade in die Allowlist zwingen; die statische Engine liest genau eine Datei und führt genau ein Binary aus — sich selbst.

Auf Linux verweigert der Kernel die ausgehende Verbindung der Engine, bevor ein Byte die Maschine verlässt. Die Garantie liegt unter unserem Code — dort, wo angreiferkontrollierter Input nicht hinkommt.

Windows: Restricted Token + Job Object

Auf Windows läuft die Engine unter einem Restricted Token mit einem Kernel-Job-Object — und das ist live und verifiziert, fail-closed genau wie macOS und Linux. Der Token wird so erzeugt, dass jedes Privileg gestrippt ist (nur das harmlose „bei Änderung benachrichtigen“-Privileg bleibt), und der Prozess läuft mit niedriger Integritätsstufe (Low Integrity), kann also keine Objekte mit normaler Integrität schreiben. Das Job-Object lässt die Engine genau einen Prozess ausführen — sie kann keinen Kindprozess spawnen, der Kernel blockiert das — und deckelt ihren Speicher. Sie bindet weiterhin nur an localhost, ohne ausgehende Verbindung.

Live verifiziert auf GitHub Actions windows-latest: Das Spawnen von Kindprozessen wird vom Kernel blockiert, und die echte Windows-Engine lädt und bewertet korrekt unter Token- und Job-Constraints. (Eine noch strengere AppContainer-Stufe steht auf der Roadmap; das aktuelle Profil ist bereits ausgeliefert, live und fail-closed.)

Strikt fail-closed: keine Sandbox, keine Analyse

Auf jeder Plattform gilt dieselbe, strikte Regel: Ist die Sandbox nicht verfügbar, startet die Engine nicht. Es gibt kein stilles Degradieren zu einem ungesicherten Lauf. Stattdessen werden verdächtige Änderungen revertet, statt unbewertet durchgelassen. On-Device-Analyse ohne Kernel-Käfig findet schlicht nicht statt.

Das ist eine ehrliche Grenze — und das ist der Punkt. „Fail-closed“ heißt: Ohne Landlock (oder Seatbelt) gibt es auf diesem Host keine On-Device-Analyse. Wir schützen Sie lieber durch Reverten, als die am stärksten angreiferseitige Komponente ohne ihren Käfig laufen zu lassen. Die Grenze ist das Feature.

Was es von Ihren Maschinen verlangt

macOS: nichts Besonderes — die Kernel-Sandbox ist immer da.

Linux: ein Kernel ≥ 5.13 mit aktivem Landlock. Das deckt Ubuntu ≥ 22.04, Debian ≥ 12 und RHEL ≥ 9.6 ab Werk ab; auf anderen Distributionen aktivieren Sie es mit dem Boot-Parameter lsm=landlock,…. In Containern blockt das Standard-Docker-seccomp-Profil die Landlock-Syscalls — dort ist ein angepasstes Profil nötig.

Windows: nichts Besonderes — Restricted Token und Job-Object sind Standard-Kernel-Funktionen.

Für Umgebungen, in denen Landlock nicht aktivierbar ist, gibt es eine Opt-in-Alternative: Cloud-Bewertung als Remote-Backstop. Der Schutz bleibt; der Datenfluss wird transparent dokumentiert statt versteckt.

Die Kurzfassung

Das vollständige Design, inklusive des überprüfbaren Egress-Vertrags, steht im technischen Whitepaper. Verwandt: Warum fail-closed gewinnt und Memory Poisoning.

Eine Analyse, die nicht gegen Sie verwendet werden kann.

PoisonZero betreibt die On-Device-Engine in einem vom Kernel erzwungenen Käfig — Modell lesen, auf localhost antworten, sonst nichts.

Sign me up

Weiterlesen: Warum Fail-closed gewinnt · Was ist Memory Poisoning? · Claude, MCP & Tool-Poisoning

Alle Artikel