Sandbox – Erläuterung

Die Sandboxed API (SAPI) baut auf dem etablierten Projekt Sandbox2 auf. Auf dieser Seite werden die Designarchitektur der SAPI und wichtige Konzepte erläutert.

Überblick

SAPI soll Entwicklern Tools zur Vorbereitung von C/C++-Bibliotheken für das Sandboxing sowie die APIs zur Verfügung stellen, die für die Kommunikation mit der Sandbox-Version der C/C++-Bibliotheken erforderlich sind.

Dieses Diagramm zeigt die Architektur einer C/C++-Bibliothek, die in einer SAPI-Sandbox ausgeführt wird:

SAPI-Diagramm

SAPI bietet außerdem Primitive für die manuelle und automatische Speichersynchronisierung (basierend auf benutzerdefinierten Zeigerattributen) (Arrays, Strukturen) zwischen den SAPI-Bibliotheken und dem Hostcode.

Schließlich ermöglicht eine Transaktions-API auf übergeordneter Ebene das Monitoring von SAPI-Bibliotheken und startet sie neu, wenn sie fehlschlagen (z.B. aufgrund von Sicherheitsverstößen, Abstürzen oder Ressourcenausschöpfung).

Sandbox2

Das Open-Source-Projekt Sandbox2 wird von Google-Sicherheitsingenieuren entwickelt und gewartet und ist die zentrale Sandbox-Technologie von SAPI. Sandbox2 enthält drei Hauptkomponenten, die Sandbox-Richtlinie, den Executor und die Sandboxee.

Sandbox-Richtlinie

Die Sandbox-Richtlinie definiert die eingeschränkte Ausführungsumgebung für die Sandbox-Bibliothek. Dies wird erreicht, indem klargestellt wird, welche Systemaufrufe ausgeführt werden können. SAPI nutzt den gleichen Mechanismus wie Sandbox2. Weitere Informationen zum Entwerfen und Definieren einer Sandbox-Richtlinie finden Sie im Abschnitt Sandbox-Richtlinie und auf der Seite Erste Schritte für Sandbox2.

Bei der SAPI wird eine Standardrichtlinie verwendet. Alternativ können Sie eine eigene Sandbox-Richtlinie verwenden, indem Sie diese in einer sandbox.h-Header-Datei definieren und als Argument in der Build-Regel sapi_library übergeben.

In einer Sandbox ausgeführte Bibliothek

Dies ist die in einer Sandbox ausgeführte C/C++-Bibliothek, die in der eingeschränkten Sandbox-Umgebung ausgeführt wird, die von Sandbox2 bereitgestellt wird. Letztendlich stellt die Sandbox-Bibliothek die erforderliche Funktionalität bereit, die vom Hostcode genutzt werden kann.

Die Sandbox-Bibliothek wird mit der Build-Regel sapi_library erstellt, in der Sie eine benutzerdefinierte Sandbox-Richtlinie angeben können, die die eingeschränkte Ausführungsumgebung definiert. Je nach Bibliothek müssen Sie möglicherweise Wrapper- oder Stub-Code schreiben (siehe libcurl). Es wird jedoch nicht erwartet, dass Sie den Quellcode der C/C++-Bibliothek beim Vorbereiten der SAPI-Version ändern.

SAPI-Objekt und RPC-Stub

Das SAPI-Objekt ist ein C++-Objekt, das die API der Sandbox-Bibliothek verfügbar macht. Er leitet Aufrufe vom Hostcode an den RPC-Stub weiter, der zusammen mit der Sandbox-Bibliothek in die SAPI-Bibliothek eingebettet ist.

Diese beiden Elemente werden vom Build-System mithilfe der Build-Regel sapi_library() automatisch generiert. SAPI unterstützt zwei Build-Systeme: Bazel und CMake von Google.

Hostcode

Der Hostcode implementiert die von der SAPI-Bibliothek bereitgestellte Logik. Das würde die Version der C/C++-Bibliothek ohne Sandbox nutzen. Daher ruft der Hostcode Funktionen auf, die von der SAPI-Bibliothek exportiert wurden. Dabei werden Daten an die Sandbox übergeben und von ihr empfangen.

Der Hostcode muss für die Verwendung der SAPI-Bibliothek angepasst werden. Insbesondere ist es nicht möglich, die Funktionen der Bibliothek aufzurufen, da sich die Bibliothek in einem separaten Sandbox-Prozess befindet. Daher bietet SAPI Tools zum Erstellen eines SAPI-Objekts, das Aufrufe an eine SAPI-Bibliothek weiterleitet.

Konzepte

Bazel-Build-Regeln

Das SAPI-Projekt enthält zwei Bazel-Build-Regeln für die Ausführung in einer Sandbox für eine C/C++-Bibliothek:

  • sapi_library(): Erstellt alle Ausgaben, die erforderlich sind, damit die C/C++-Bibliothek als Sandbox2-Sandboxee in einer Sandbox ausgeführt werden kann. Die Build-Ausgabe kann als Abhängigkeit für die Regel cc_binary() verwendet werden, die zum Erstellen der Hostcode-Binärdatei verwendet wird.
  • sapi_interface(): Generiert automatisch den Header, der in die Hostcode-Binärdatei eingefügt werden kann.

Eine ausführlichere Erläuterung der Build-Regeln finden Sie unter Build-Regeln.

Variablen

SAPI bietet eine Reihe von speziellen Typen, die als SAPI-Typen bezeichnet werden und deren Verwendung im Hostcode empfohlen wird. Der Hauptgrund dafür, dass SAPI-Typen benötigt werden, ist die Isolation des Prozesses und somit des Arbeitsspeichers zwischen dem Hostcode und der Sandbox-Bibliothek.

Eine ausführlichere Erläuterung dieses Themas und eine Übersicht über einige häufig verwendete SAPI-Typen finden Sie unter Variablen.

Transaktionen

Wie oben erläutert, wird jeder API-Aufruf an eine Sandbox-Bibliothek über eine RPC-Ebene übergeben. Um einen Fehler auf dieser Ebene behandeln zu können, müssen Sie eine entsprechende Fehlerbehandlung implementieren. Das Modul SAPI-Transaktion stellt den erforderlichen Mechanismus bereit, mit dem sichergestellt wird, dass alle Aufrufe einer Sandbox-Bibliothek ohne Probleme auf RPC-Ebene abgeschlossen werden oder mit einem relevanten Fehler zurückgegeben werden.

Eine ausführlichere Erläuterung dieses Themas finden Sie unter Transaktionen.

Erste Schritte

Lesen Sie unsere Seite Erste Schritte, um Ihr erstes Sandbox-API-Projekt einzurichten.