Architektur

Windows: die Engine in einem netzwerk-isolierten AppContainer

Auf Windows betreibt PoisonZero die Analyse-Engine in einem netzwerk-isolierten AppContainer - das Betriebssystem verweigert ihr das Netzwerk kategorisch -, zusätzlich unter einem Restricted Token, niedriger Integrität und einem Job Object.

Lesezeit ~4 Min · Architektur

AppContainer: kein Netzwerk, erzwungen vom Betriebssystem

Auf Windows läuft die Engine in einem netzwerk-isolierten AppContainer - einer vom Betriebssystem erzeugten Zelle ganz ohne Netzwerk-Capability. Die Engine kann keine Netzwerkverbindung öffnen, und nichts kann sie über das Netzwerk erreichen - nicht einmal localhost. Das ist keine Prüfung in unserem Code, sondern eine Grenze, die der Windows-Kernel zieht, nach demselben Prinzip wie Seatbelt auf macOS und Landlock auf Linux: Die On-Device-Analyse hat keinen Weg ins Netz.

Weil der Container keine Netzwerk-Capability hat, sind auch die indirekten Wege geschlossen, die eine einfache localhost-Bindung noch offen ließe. Die Engine spricht mit dem privilegierten Dienst über einen lokalen Socket, den das Betriebssystem auf der Maschine hält - nie über einen Netzwerk-Port.

Eine Ausnahme: GPU-Beschleunigung

Melira Enterprise Ultra rechnet auf der Grafikkarte, und das geht auf Windows im AppContainer nicht: Windows gibt den Zugriff auf den Grafiktreiber nur Programmen mit einer App-Identität, die ein selbst erzeugter Container nicht hat. Der Grafiktreiber lädt in ihm nicht - unabhängig davon, welche Rechte man dem Container gibt. Chromium löst das genauso: sein GPU-Prozess läuft ebenfalls nicht im AppContainer.

Auf Windows läuft die Engine deshalb nur bei GPU-Beschleunigung ohne AppContainer - und zusätzlich ohne die Absenkung der Integritätsstufe. Der Grund ist gemessen: Bei niedriger Integrität verweigert Windows der Engine das Lesen ihrer eigenen Modell- und Schlüsseldatei im Datenverzeichnis; weder ein Integritäts-Label auf der Datei noch ein zusätzlicher Rechte-Eintrag hebt das auf.

SchichtCPU-StartGPU-Start
Netzwerk-isolierter AppContainerjanein
Restricted Token, Privilegien entzogenjaja
Niedrige Integritätjanein
Job Object: ein Prozess, kein Kind, gedeckelter Speicherjaja
Netzsperre am Programm, fail-closed vor dem Startjaja

Beim GPU-Start bleiben also entzogene Privilegien, das Job Object und die Netzsperre erhalten. Die Netzsperre hängt weder am Container noch am Token, sondern an einem Filter auf Ebene des Betriebssystems, der an das Programm gebunden ist und vor dem Start scharf geschaltet wird; schlägt er fehl, startet die Engine nicht. Es entfällt allein die Integritätsstufe, die begrenzt, welche Objekte der Prozess schreiben könnte: Der GPU-Prozess läuft insoweit auf derselben Stufe wie der Dienst, der ihn startet.

Für den Betrieb heißt das: Windows ohne GPU-Beschleunigung ist die stärker abgeschottete Variante - dort kommt der netzwerk-isolierte AppContainer als zusätzliche Schicht hinzu. Wer maximale Isolation der Geschwindigkeit vorzieht, betreibt Melira Enterprise auf der CPU.

Zusätzlich mit Restricted Token, niedriger Integrität und einem Job Object

Innerhalb dieses Containers läuft die Engine zusätzlich unter einem Restricted Token, dem praktisch jedes Privileg entzogen ist (nur das harmlose 'bei Änderung benachrichtigen'-Privileg bleibt), und mit niedriger Integrität, sodass sie keine Objekte mit normaler Integrität schreiben kann. Diese Schichten schließen von vornherein die Wege, auf denen ein geknackter Prozess sich sonst ausbreiten würde.

Der Käfig steht auf vier Säulen:

  • netzwerk-isolierter AppContainer - keine Netzwerk-Capability, kein Egress, nicht einmal localhost;
  • Restricted Token - die Privilegien des Prozesses sind entfernt;
  • niedrige Integrität - keine Schreibzugriffe auf Objekte normaler Integrität;
  • Job Object - genau ein Prozess, kein Kindprozess, gedeckelter Speicher.
Der Windows-Käfig baut auf Standard-Betriebssystem-Mitteln auf: AppContainer, Token, Integritätsstufe und Job Object. Nichts davon muss extra installiert werden - es ist einfach an.

Job Object: genau ein Prozess, kein Kind

Das Job Object lässt die Engine genau einen Prozess ausführen: Sie kann keinen Kindprozess spawnen, der Kernel blockiert das, und ihr Speicher ist gedeckelt. Ein Exploit, der sonst ein Hilfsprogramm nachladen oder starten würde, läuft hier gegen eine Wand: Es gibt kein Netzwerk zu erreichen und keinen zweiten Prozess, in den er entkommen könnte.

Strikt fail-closed

Wie überall gilt: Steht der Käfig nicht, startet die Engine nicht. Lässt sich der AppContainer nicht aufbauen, gibt es kein Ausweichen auf einen weniger isolierten Lauf; die verdächtige Änderung bleibt liegen und wird sichtbar gemacht, statt ungeprüft durchgewunken zu werden (fail-closed).

Wie derselbe Käfig auf macOS und Linux aussieht, steht im Überblick zur Engine-Sandbox.

War das hilfreich?

Analyse, die man nicht gegen Sie wenden kann.

PoisonZero betreibt die On-Device-Engine auf Windows in einem netzwerk-isolierten AppContainer - kein Netzwerk, ein Prozess, sonst nichts.

Sign me up