Sandbox – Erläuterung

Die Sandboxed API (SAPI) basiert auf dem etablierten Sandbox2-Projekt. 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 die Ausführung in einer Sandbox sowie die APIs, die für die Kommunikation mit der Sandbox-Version der C/C++-Bibliotheken erforderlich sind.

Dieses Diagramm zeigt die Architektur einer in einer Sandbox ausgeführten C/C++-Bibliothek mit SAPI:

SAPI-Diagramm

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

Außerdem ermöglicht eine Transaktions- API auf hoher Ebene die Überwachung von SAPI-Bibliotheken und startet sie neu, wenn sie fehlschlagen (z.B. aufgrund von Sicherheits verstößen, Abstürzen oder Ressourcenüberlastung).

Sandbox2

Das Open-Source-Projekt Sandbox2 wird von Google-Sicherheitsexperten entwickelt und gewartet und ist die Kerntechnologie für die Ausführung in einer Sandbox, die von SAPI verwendet wird. Sandbox2 besteht aus drei Hauptkomponenten: der Sandbox Richtlinie, dem Executor und dem Sandboxee.

Sandbox-Richtlinie

Die Sandbox-Richtlinie definiert die eingeschränkte Ausführungsumgebung für die Sandbox-Bibliothek. Dazu wird festgelegt, 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 Sandbox Policy section und auf der Seite Getting Started page für Sandbox2.

Standardmäßig werden generierte SAPI-Sandbox-Klassen mit DefaultConfig (sapi::SandboxConfig::DefaultConfig()) initialisiert. DefaultConfig() konfiguriert die Sandbox mit:

  • Einer Standard-Sandbox2-Richtlinie, die mit sapi::Sandbox2Config::DefaultPolicyBuilder() erstellt wurde
  • Standardressourcen- und Zeitlimits aus sapi::Sandbox2Config::DefaultLimits()
  • Aktivierter Kommunikation über gemeinsam genutzten Arbeitsspeicher (in Kombination mit den Berechtigungen für gemeinsam genutzten Arbeitsspeicher in DefaultPolicyBuilder())
  • Standard-Befehlszeilenflags (sapi::SandboxConfig::DefaultFlags()) und Umgebungsvariablen (sapi::SandboxConfig::DefaultEnvironmentVariables()), die die grundlegende Protokollierung und das Laufzeitverhalten im Sandboxee konfigurieren

Wenn Sie die Sandbox-Richtlinie oder -Konfiguration anpassen möchten, beginnen Sie mit sapi::SandboxConfig::DefaultConfig(), ändern Sie die zurückgegebene sapi::SandboxConfig und übergeben Sie sie an den generierten Sandbox-Konstruktor. Alternativ können Sie eine benutzerdefinierte Sandbox-Unterklasse in einer sandbox.h Headerdatei definieren, die an die sapi_library Build Regel übergeben wird. Sie können beispielsweise eine Richtlinie mit sapi::Sandbox2Config::DefaultPolicyBuilder() erstellen und zusätzliche Regeln verketten. Alternativ können Sie direkt einen PolicyBuilder erstellen, wenn eine restriktivere Konfiguration erforderlich ist. Wenn Sie Flags oder Umgebungsvariablen hinzufügen, beginnen Sie mit sapi::SandboxConfig::DefaultFlags() oder sapi::SandboxConfig::DefaultEnvironmentVariables(), damit die Grundeinstellungen beibehalten werden.

Sandbox-Bibliothek

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

Die Sandbox-Bibliothek wird mit der sapi_library-Build Regel erstellt. Dort 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). Es ist jedoch nicht erforderlich, den Quellcode der C/C++-Bibliothek zu ändern, wenn Sie die SAPI-Version vorbereiten.

SAPI-Objekt und RPC-Stub

Das SAPI-Objekt ist ein C++-Objekt, das die API der Sandbox-Bibliothek verfügbar macht. Es 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 automatisch vom Build-System mit der sapi_library()-Build-Regel generiert. SAPI unterstützt zwei Build-Systeme: Google's Bazel und CMake.

Hostcode

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

Der Hostcode muss so angepasst werden, dass er die SAPI-Bibliothek verwendet. 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 Ausführung einer C/C++-Bibliothek in einer Sandbox:

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

Eine ausführlichere Erklärung der Build-Regeln finden Sie unter Build Rules.

Variablen

SAPI bietet eine Reihe spezieller Typen, sogenannte SAPI Typen, die wir für die Verwendung im Hostcode empfehlen. Der Hauptgrund für die Verwendung von SAPI-Typen ist die Prozess- und damit die Speicherisolation zwischen dem Hostcode und der Sandbox-Bibliothek.

Eine ausführlichere Erklärung 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 weitergeleitet. Um einen Fehler auf dieser Ebene zu beheben, müssen Sie eine entsprechende Fehlerbehandlung implementieren. Das SAPI Transaktions modul bietet den erforderlichen Mechanismus, um sicherzustellen, dass alle Aufrufe an eine Sandbox-Bibliothek ohne Probleme auf RPC-Ebene abgeschlossen werden oder mit einem relevanten Fehler zurückgegeben werden.

Eine ausführlichere Erklärung dieses Themas finden Sie unter Transaktionen.

Erste Schritte

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