Spiegazione dell'API Sandboxed

L'API in sandbox (SAPI) si basa sul progetto Sandbox2, ormai consolidato. Questa pagina spiega l'architettura di progettazione di SAPI e i concetti chiave.

Panoramica

SAPI è progettata per fornire agli sviluppatori strumenti per preparare le librerie C/C++ per la sandbox, nonché le API necessarie per la comunicazione con la versione in sandbox delle librerie C/C++.

Questo diagramma mostra l'architettura di una libreria C/C++ in sandbox SAPI:

Diagramma SAPI

SAPI fornisce anche primitive per la sincronizzazione della memoria manuale e automatica (basata su attributi di puntatore personalizzati) (array, strutture) tra le librerie SAPI e il codice host.

Infine, un'API Transactions di alto livello consente di monitorare le librerie SAPI e di riavviarle in caso di errore (ad es. a causa di violazioni della sicurezza, arresti anomali o esaurimento delle risorse).

Sandbox2

Il progetto open source Sandbox2 è sviluppato e gestito dagli ingegneri della sicurezza di Google ed è la tecnologia di sandbox principale utilizzata da SAPI. Sandbox2 contiene tre componenti principali: la policy della sandbox, l' executor e la sandboxee.

Policy della sandbox

La policy della sandbox definisce l'ambiente di esecuzione con limitazioni per la libreria in sandbox. Ciò si ottiene chiarendo quali chiamate di sistema possono essere eseguite. SAPI utilizza lo stesso meccanismo di Sandbox2. Per saperne di più su come progettare e definire una policy della sandbox, consulta la sezione Policy della sandbox e la pagina Guida introduttiva per Sandbox2.

Per impostazione predefinita, le classi sandbox SAPI generate vengono inizializzate utilizzando DefaultConfig (sapi::SandboxConfig::DefaultConfig()). DefaultConfig() configura la sandbox con:

  • Una policy Sandbox2 predefinita creata con sapi::Sandbox2Config::DefaultPolicyBuilder()
  • Limiti di tempo e risorse predefiniti da sapi::Sandbox2Config::DefaultLimits()
  • Comunicazione di memoria condivisa abilitata (abbinata alle autorizzazioni di memoria condivisa in DefaultPolicyBuilder())
  • Flag della riga di comando predefiniti (sapi::SandboxConfig::DefaultFlags()) e variabili di ambiente (sapi::SandboxConfig::DefaultEnvironmentVariables()), che configurano la registrazione di base e il comportamento di runtime nella sandboxee

Per personalizzare la policy o la configurazione della sandbox, inizia da sapi::SandboxConfig::DefaultConfig(), modifica il sapi::SandboxConfig restituito e passalo al costruttore della sandbox generato (oppure definisci una sottoclasse sandbox personalizzata in un file di intestazione sandbox.h passato alla regola di build sapi_library). Ad esempio, puoi creare una policy a partire da sapi::Sandbox2Config::DefaultPolicyBuilder() e concatenare regole aggiuntive (o creare direttamente un PolicyBuilder quando è richiesta una configurazione più restrittiva) e, quando aggiungi flag o variabili di ambiente, inizia da sapi::SandboxConfig::DefaultFlags() o sapi::SandboxConfig::DefaultEnvironmentVariables() in modo che le impostazioni di base vengano mantenute.

Libreria in sandbox

Si tratta della libreria C/C++ in sandbox che verrà eseguita nell'ambiente sandbox con limitazioni fornito da Sandbox2. In definitiva, la libreria in sandbox espone la funzionalità richiesta che può essere utilizzata dal codice host.

La libreria in sandbox viene creata con la sapi_library regola di build, in cui puoi specificare una policy della sandbox personalizzata che definisce l' ambiente di esecuzione con limitazioni. A seconda della libreria, potrebbe essere necessario scrivere codice wrapper o stub (vedi libcurl), ma non è previsto che tu modifichi il codice sorgente della libreria C/C++ durante la preparazione della versione SAPI.

Oggetto SAPI e stub RPC

L'oggetto SAPI è un oggetto C++ che espone l'API della libreria in sandbox. Inoltra le chiamate dal codice host allo stub RPC, che è incorporato nella libreria SAPI insieme alla libreria in sandbox.

Questi due elementi vengono generati automaticamente dal sistema di build utilizzando la regola di build sapi_library(). SAPI supporta due sistemi di build: Bazel di Google e CMake.

Codice host

Il codice host è ciò che implementa la logica fornita dalla libreria SAPI. È ciò che altrimenti utilizzerebbe la versione non in sandbox della libreria C/C++. Di conseguenza, il codice host chiama le funzioni esportate dalla libreria SAPI, passando i dati alla sandbox e ricevendo i dati dalla sandbox.

Il codice host deve essere adattato per utilizzare la libreria SAPI. In particolare, non è possibile chiamare le funzioni della libreria perché la libreria si trova in un processo in sandbox separato. Pertanto, SAPI fornisce strumenti che creano un oggetto SAPI che esegue il proxy delle chiamate a una libreria SAPI.

Concetti

Regole di build di Bazel

Il progetto SAPI fornisce due regole di build di Bazel per la sandbox di una libreria C/C++:

  • sapi_library() : crea tutti gli output necessari per la sandbox della libreria C/C++ come sandboxee di Sandbox2. L'output di build può essere utilizzato come dipendenza per la regola cc_binary() utilizzata per creare il binario del codice host.
  • sapi_interface() : genera automaticamente l'intestazione che può essere inclusa nel binario del codice host.

Per una spiegazione più esaustiva delle regole di build, consulta Build Rules.

Variabili

SAPI fornisce una serie di tipi speciali, chiamati tipi SAPI, che ti consigliamo di utilizzare nel codice host. Il motivo principale per cui sono necessari i tipi SAPI è l'isolamento del processo e quindi della memoria tra il codice host e la libreria in sandbox.

Per una spiegazione più esaustiva di questo argomento e una panoramica di alcuni tipi SAPI di uso comune, consulta Variabili.

Transazioni

Come spiegato sopra, qualsiasi chiamata API a una libreria in sandbox viene passata su un livello RPC. Per poter gestire un errore su questo livello, devi implementare una gestione degli errori appropriata. Il modulo SAPI Transaction fornisce il meccanismo necessario per assicurarsi che tutte le chiamate a una libreria in sandbox vengano completate senza problemi a livello RPC o vengano restituite con un errore pertinente.

Per una spiegazione più esaustiva di questo argomento, consulta Transazioni.

Per iniziare

Leggi la nostra pagina Guida introduttiva per configurare il tuo primo progetto API in sandbox.