Spiegazione Sandbox2

Il design di Sandbox2 si basa su tecnologie note e consolidate, un framework di criteri e due processi: Sandbox Executor e Sandboxee.

Tecnologie coinvolte

Le sezioni seguenti illustrano le tecnologie che costituiscono il livello di base per Sandbox2.

Spazi dei nomi Linux

Gli spazi dei nomi Linux sono un tentativo di fornire la virtualizzazione a livello di sistema operativo. Sebbene più spazi utente vengano eseguiti in modo apparentemente indipendente l'uno dall'altro, condividono un'unica istanza del kernel. Sandbox2 utilizza i seguenti tipi di spazi dei nomi:

  • IPC
  • Rete (a meno che non venga esplicitamente disattivata chiamando PolicyBuilder::AllowUnrestrictedNetworking())
  • Montaggio (utilizzando una visualizzazione personalizzata della struttura del file system)
  • PID
  • Utente (a meno che non venga esplicitamente disattivato chiamando PolicyBuilder::AllowUnsafeKeepCapabilities())
  • UTS

Scopri di più sugli spazi dei nomi Linux su Wikipedia o nella pagina man correlata.

IPC

Sandbox2 consente lo scambio di dati arbitrari tra Sandbox Executor e Sandboxee non attendibile. Supporta i messaggi TLV (Type-Length-Value), il passaggio dei descrittori di file e lo scambio di credenziali tramite token e handle.

Seccomp-BPF

Sandbox2 si basa su seccomp-bpf, un'estensione della modalità Secure Computing Mode (seccomp) che consente di utilizzare le regole BPF (Berkeley Packet Filter) per filtrare le chiamate di sistema.

seccomp è una struttura kernel Linux che limita le chiamate di sistema di un processo per consentire solo exit, sigreturn, read e write. Se un processo tenta di eseguire un'altra chiamata di sistema, verrà arrestato. L'estensione seccomp-bpf consente una maggiore flessibilità rispetto a seccomp. Invece di consentire un insieme fisso di chiamate di sistema, seccomp-bpf esegue un programma BPF sui dati delle chiamate di sistema e, a seconda del valore restituito dal programma, può eseguire la chiamata di sistema, saltare la chiamata di sistema e restituire un valore fittizio, terminare il processo, generare un segnale o notificare il tracer.

Ptrace

La chiamata di sistema ptrace (processo traccia) fornisce funzionalità che consentono al processo di tracciamento di osservare e controllare l'esecuzione del processo tracer. Una volta collegato, il processo di traccia ha il controllo completo sulla traccia. Scopri di più su ptrace su Wikipedia o nella pagina man correlata.

Criterio sandbox

I criteri della sandbox sono la parte più importante di una sandbox, in quanto specificano le azioni che il Sandboxee può o non può eseguire. Un criterio della sandbox si compone di due parti:

  • Criterio di chiamata di sistema
  • Configurazione dello spazio dei nomi

Criterio di chiamata di sistema predefinito

Il criterio predefinito blocca le chiamate di sistema sempre pericolose e ha la precedenza sul criterio esteso fornito dall'utente.

Criterio di chiamata di chiamata esteso

Il criterio di chiamata di sistema esteso può essere creato utilizzando la nostra classe PolicyBuilder. Questa classe definisce una serie di regole di convenienza (ad es. AllowStaticStartup, AllowDynamicStartup, AllowOpen) che possono essere utilizzate per migliorare la leggibilità del criterio.

Se vuoi limitare ulteriormente le chiamate di sistema o hai bisogno di regole più complesse, puoi specificare le macro BPF non elaborate con AddPolicyOnSyscall e AddPolicyOnSyscalls. L'esempio crc4 utilizza questo meccanismo per limitare gli argomenti per le chiamate di sistema read, write e close.

In generale, più rigoroso è il criterio Sandbox, meglio è perché lo sfruttamento di qualsiasi vulnerabilità presente nel codice sarà limitato dal criterio. Se sei in grado di specificare esattamente quali chiamate di sistema e argomenti sono necessari per il normale funzionamento del programma, anche qualsiasi utente malintenzionato che sfrutti una vulnerabilità di esecuzione del codice sarà limitato agli stessi limiti.

Un criterio sandbox molto severo potrebbe rifiutare tutte le chiamate di sistema tranne le letture e le scritture su descrittori dei file di input e di output standard. All'interno di questa sandbox, un programma potrebbe ricevere input, elaborarli e restituire l'output. Tuttavia, se il processo tentasse di effettuare altre chiamate di sistema, verrà interrotto a causa di una violazione delle norme. Quindi, se il processo è compromesso (esecuzione del codice da parte di un utente malintenzionato), non può fare nulla di più dannoso che produrre un output errato (che l'esecutore e altri devono ancora gestire correttamente).

Configurazione dello spazio dei nomi

L'oggetto PolicyBuilder viene utilizzato anche per configurare una visualizzazione individuale Sandboxee del file system. È possibile mappare singoli file (AddFile / AddFileAt), intere directory (AddDirectory / AddDirectoryAt) e lo spazio di archiviazione temporaneo (AddTmpfs) nell'ambiente di Sandboxee. Inoltre, AddLibrariesForBinary può essere utilizzato per mappare automaticamente tutte le librerie necessarie per l'eseguibile specificato a collegamento dinamico.

Flag della riga di comando

È possibile disattivare qualsiasi criterio Sandbox2 specificando uno dei seguenti flag della riga di comando. Questi flag sono a scopo di test (ad es. durante il perfezionamento del criterio Extended Syscall).

  • --sandbox2_danger_danger_permit_all
  • --sandbox2_danger_danger_permit_all_and_log

Esecutore sandbox

Sandbox Executor è un processo che non è limitato tramite sandbox. È il processo ptrace tracer che si collega al Sandboxee (processoptrace tracer). Inoltre, Sandbox Executor configura ed esegue un'istanza Monitor che tiene traccia di Sandboxee e fornisce informazioni sullo stato.

Sandbox2 consente tre modalità di esecuzione: Stand-alone, Sandbox2 Forkserver e Custom Forkserver. Se utilizzi un forkserver, Sandboxee viene creato come processo figlio dell'esecutore Sandbox. Queste modalità sono spiegate in dettaglio qui.

Sandbox

Sandboxee è il processo che viene eseguito nell'ambiente limitato con sandbox definito dai criteri Sandbox. Sandbox Executor invia il criterio a Sandboxee tramite IPC. Il Sandboxee applica quindi il criterio. Qualsiasi violazione delle norme comporterà la chiusura della procedura, se non diversamente configurato (vedi le norme relative alla sandbox).