Spiegazione dell'API Sandboxed

L'API Sandboxed (SAPI) si basa sull'affermato progetto Sandbox2. Questa pagina illustra l'architettura di progettazione di SAPI e i concetti chiave.

Panoramica

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

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

Diagramma SAPI

SAPI fornisce inoltre primitive per la sincronizzazione della memoria (array, strutture) manuale e automatica (in base ad attributi di puntatore personalizzati) tra le librerie SAPI e il codice host.

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

Sandbox2

Il progetto open source Sandbox2 è sviluppato e gestito dagli ingegneri della sicurezza di Google ed è la tecnologia di sandboxing principale utilizzata da SAPI. Sandbox2 contiene tre componenti principali: Sandbox Policy, Esecutore e Sandboxee.

Criterio sandbox

Il criterio della sandbox definisce l'ambiente di esecuzione limitato per la Libreria con sandbox. A questo scopo, è necessario chiarire quali chiamate di sistema possono essere eseguite. SAPI utilizza lo stesso meccanismo di Sandbox2. Per ulteriori informazioni su come progettare e definire un criterio della sandbox, consulta la sezione relativa ai criteri della sandbox e la pagina Guida introduttiva di Sandbox2.

SAPI utilizza un criterio predefinito. In alternativa, puoi utilizzare un criterio della sandbox dedicato definendolo in un file di intestazione sandbox.h e passandolo come argomento nella regola di compilazione sapi_library.

Libreria con sandbox

Questa è la libreria C/C++ con sandbox che verrà eseguita nell'ambiente sandbox limitato fornito da Sandbox2. Essenzialmente, la libreria con sandbox mostra la funzionalità richiesta che può essere utilizzata dal codice host.

La Libreria con sandbox è basata sulla regola di build sapi_library, in cui puoi specificare un criterio sandbox personalizzato che definisca l'ambiente di esecuzione limitato. A seconda della libreria, potrebbe essere necessario scrivere codice wrapper o stub (vedere libcurl), ma non è previsto che 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 con sandbox. Inoltra le chiamate da Host Code a RPC Stub, che è incorporato nella libreria SAPI insieme alla sandboxed Library.

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 implementa la logica fornita dalla libreria SAPI. È ciò che altrimenti utilizzerebbe la versione senza sandbox della libreria C/C++. Di conseguenza, Host Code chiama le funzioni esportate dalla libreria SAPI, passando 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 sandbox separato. Pertanto, SAPI offre strumenti che creano un oggetto SAPI che esegue il proxy delle chiamate a una libreria SAPI.

Concetti

Regole di build Bazel

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

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

Per una spiegazione più completa delle regole di build, consulta la sezione Regole di build.

Variabili

SAPI offre una serie di tipi speciali, denominati tipi SAPI, che consigliamo di utilizzare nel codice host. Il motivo principale per cui sono necessari i tipi SAPI è dovuto all'isolamento del processo (e quindi della memoria) tra il codice host e la libreria con sandbox.

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

Transazioni

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

Per una spiegazione più completa di questo argomento, consulta la sezione Transazioni.

Come iniziare

Leggi la nostra pagina Come iniziare per configurare il tuo primo progetto API Sandboxed.