2 Stimmen

Virtuelle Sandbox-Maschine für eine Anwendung (Konzept)

Ich möchte eine virtuelle Sandbox-Maschine zum Ausführen eines kompilierten Programms schreiben. Mein Ziel ist es, dieses Programm vom Rest des Betriebssystems zu isolieren und seine Ausführung so zu kontrollieren, dass es dem Host-Computer keinen Schaden zufügen kann.

Davon gehe ich aus:

  • Das ausgeführte Programm wird im Portable Executable Format kompiliert und ist im Maschinencode, nicht in irgendeinem Bytecode oder für CLR,
  • Das ausgeführte Programm darf nicht mit Peripheriegeräten wie Druckern oder Scannern kommunizieren und verwendet keine grafische Benutzeroberfläche,
  • Die Hauptaufgabe des ausgeführten Programms besteht darin, einige in einer lokalen Datei gespeicherte Daten (z. B. Berechnungen) zu verarbeiten und die Ergebnisse in einer anderen lokalen Datei abzulegen,
  • Ein ausgeführtes Programm sollte nicht direkt mit einem Betriebssystem kommunizieren können, jede Anfrage sollte von einer virtuellen Maschine bearbeitet werden, jede Anfrage, die einem Betriebssystem Schaden zufügen könnte, sollte blockiert werden.

Mein Konzept der Architektur und des Betriebs einer virtuellen Sandbox-Maschine:

  • Anwendung besteht aus mehreren Objekten, die Prozessor, Speicher und E/A-Operationen an Dateien simulieren,
  • Es gibt ein Modul, das die kompilierte Datei liest und den ausführbaren Code in einen virtuellen Speicher lädt,
  • dann beginnt der virtuelle Prozessor mit der Verarbeitung ab dem ersten Byte, liest Opcode und Argumente, lädt sie bei Bedarf aus dem Speicher, führt den Befehl aus und legt das Ergebnis an der entsprechenden Stelle ab, setzt bei Bedarf virtuelle Flags und liest dann den nächsten Befehl, bis das Programm zu Ende ausgeführt ist.

Was denken Sie: Ist es ein gutes Konzept? Was würden Sie ändern, um es zu verbessern?

1voto

Albin Sunnanbo Punkte 45302

Die Simulation einer kompletten Maschine scheint ein sehr langsamer Weg zu sein, um nativen Code auszuführen. Viele Operationen mit Laden, Nachschlagen, Ausführen, Speichern usw. nur für einen einzigen nativen Befehl.

Ich würde versuchen, zumindest einige Codeblöcke nativ auszuführen. Denken Sie an den folgenden Code.

int sum = 0;
for (int i = 0; i < 10; i++)
{
    sum += i;
}

Dieser Code kann völlig gefahrlos nativ in Ihrer virtuellen Maschine ausgeführt werden. Stellen Sie nur sicher, dass Sie einen Rückruf in den Code Ihrer virtuellen Maschine einfügen.

Ich würde jedoch versuchen, einen Schritt weiter zu gehen und den gesamten Code mit Ausnahme der Bibliotheks-/Os-Aufrufe nativ auszuführen. Bevor Sie die Sandbox-Anwendung laden, durchsuchen Sie die Datei und ersetzen Sie alle "gefährlichen" Aufrufe durch Aufrufe an Handler in Ihrer virtuellen Maschine.
Der Code

printf("Hello World\n");

würde durch Aufrufe Ihrer Bibliothek ersetzt werden

myVM_printf("Hello World\n");

Dann können Sie das gesamte Programm in nativer Geschwindigkeit ausführen und trotzdem alle gefährlichen Codes in Ihrer virtuellen Maschine verarbeiten.

1voto

zvrba Punkte 23708

Allein durch die Anpassung der Prozessrechte kann man schon viel erreichen. Zumindest unter WinNT, das ziemlich feinkörnige Prozessrechte hat. Ich glaube auch, dass Googles Sandboxing, das in Chrome verwendet wird, OpenSource ist.

0voto

rook Punkte 64487

Das hört sich so an, als ob dies mit vorhandenem Sandboxing wie SELinux oder App-V von Microsoft.

Auch der Zugang zu Peripheriegeräten kann problematisch sein. Was ist, wenn das Peripheriegerät eine Kamera im Raum oder ein Mikrofon ist? Was ist, wenn der Hacker Ihr Geld verschwenden will, indem er eine nicht enden wollende Geschichte in Regenbogenschrift ausdruckt?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X