Sandbox – Erläuterung

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

Übersicht

SAPI bietet Entwicklern Tools zum Vorbereiten von C/C++-Bibliotheken für das Sandboxing sowie die APIs, die für die Kommunikation mit der Sandbox-Version der C/C++-Bibliotheken erforderlich sind.

In diesem Diagramm wird die Architektur einer SAPI-Sandbox-C/C++-Bibliothek dargestellt:

SAPI-Diagramm

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

Schließlich ermöglicht eine Transaktions-API auf hoher Ebene die Überwachung von SAPI-Bibliotheken und startet sie neu, wenn sie fehlschlagen (z.B. aufgrund von Sicherheitsverstößen, Abstürzen oder Ressourcenerschöpfung).

Sandbox2

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

Sandbox-Richtlinie

Die Sandbox-Richtlinie definiert die eingeschränkte Ausführungsumgebung für die Sandboxed Library. Dies wird erreicht, indem festgelegt wird, welche Systemaufrufe ausgeführt werden können. SAPI verwendet denselben Mechanismus wie Sandbox2. Weitere Informationen zum Entwerfen und Definieren einer Sandbox-Richtlinie finden Sie im Abschnitt zur Sandbox-Richtlinie und auf der Seite „Erste Schritte“ für Sandbox2.

SAPI verwendet eine Standardrichtlinie. Alternativ können Sie eine spezielle Sandbox-Richtlinie verwenden, indem Sie sie in einer Headerdatei „sandbox.h“ definieren und als Argument in der Build-Regel sapi_library übergeben.

Sandbox-Bibliothek

Dies ist die Sandbox-C/C++-Bibliothek, die in der eingeschränkten Sandbox-Umgebung von Sandbox2 ausgeführt wird. Letztendlich stellt die Sandboxed Library die erforderlichen Funktionen bereit, die vom Hostcode genutzt werden können.

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

SAPI-Objekt und RPC-Stub

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

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

Hostcode

Der Hostcode implementiert die Logik, die von der SAPI-Bibliothek bereitgestellt wird. Sie würde ansonsten die nicht in der Sandbox ausgeführte Version der C/C++-Bibliothek verwenden. Der Hostcode ruft also Funktionen auf, die von der SAPI-Bibliothek exportiert werden, und übergibt Daten an die Sandbox und empfängt Daten von ihr.

Der Hostcode muss angepasst werden, damit die SAPI-Bibliothek verwendet wird. 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, mit denen ein SAPI-Objekt erstellt wird, das Aufrufe an eine SAPI-Bibliothek weiterleitet.

Konzepte

Bazel-Build-Regeln

Das SAPI-Projekt bietet zwei Bazel-Build-Regeln für die Sandbox-Umgebung einer C/C++-Bibliothek:

  • sapi_library() – Erstellt alle Ausgaben, die erforderlich sind, um die C/C++-Bibliothek als Sandbox2-Sandboxee zu verwenden. Die Build-Ausgabe kann als Abhängigkeit für die cc_binary()-Regel verwendet werden, mit der die Binärdatei für den Hostcode erstellt wird.
  • sapi_interface(): Generiert automatisch den Header, der in die Binärdatei des Hostcodes aufgenommen werden kann.

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

Variablen

SAPI bietet eine Reihe von speziellen Typen, sogenannten SAPI-Typen, die wir für die Verwendung im Host-Code empfehlen. Der Hauptgrund für die Notwendigkeit von SAPI-Typen ist die Prozess- und damit die Arbeitsspeicherisolation 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 beschrieben, wird jeder API-Aufruf an eine Sandboxed Library über eine RPC-Ebene weitergeleitet. Damit Sie einen Fehler auf dieser Ebene beheben können, müssen Sie eine entsprechende Fehlerbehandlung implementieren. Das Modul SAPI-Transaktion bietet den erforderlichen Mechanismus, um sicherzustellen, dass alle Aufrufe einer Sandboxed API-Bibliothek ohne RPC-Probleme abgeschlossen oder mit einem relevanten Fehler zurückgegeben werden.

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

Erste Schritte

Auf der Seite Erste Schritte erfahren Sie, wie Sie Ihr erstes Sandboxed API-Projekt einrichten.