Il design di Sandbox2 si basa su tecnologie conosciute e consolidate, un framework di criteri e due processi: Sandbox Executor e Sandboxee.
Tecnologie coinvolte
Le seguenti sezioni illustrano le tecnologie che creano il livello 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 apparentemente in modo indipendente l'uno dall'altro, condividono una singola istanza del kernel. Sandbox2 utilizza i seguenti tipi di spazi dei nomi:
- IPC
- Rete (a meno che non sia esplicitamente disattivata chiamando
PolicyBuilder::AllowUnrestrictedNetworking()
) - Montaggio (tramite una visualizzazione personalizzata della struttura di file system)
- PID
- Utente (a meno che non sia 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 messaggi TLV (Type-Length-Value), trasferimento dei descrittori di file e scambio di credenziali tramite token e handle.
Seccomp-BPF
Sandbox2 si basa su seccomp-bpf, un'estensione di Secure Computing Mode (seccomp) che consente di utilizzare regole di Berkeley Packet Filter (BPF) per filtrare le chiamate di sistema.
seccomp è una struttura del 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 syscall, viene terminato. L'estensione seccomp-bpf consente una maggiore flessibilità rispetto a seccomp. Anziché consentire un insieme fisso di chiamate di sistema, seccomp-bpf esegue un programma BPF sui dati di chiamata di sistema e, a seconda del valore di ritorno del programma, può eseguire la chiamata di sistema, saltare la chiamata di sistema e restituire un valore fittizio, terminare il processo, generare un indicatore o inviare una notifica al programma di traccia.
Tracce
Il syscall (pttrack) fornisce funzionalità che consentono al processo di monitoraggio di osservare e controllare l'esecuzione del processo di traccia. Una volta collegata la traccia, il processo di monitoraggio ha il controllo completo. Scopri di più su ptrace su Wikipedia o nella pagina man correlata.
Criterio Sandbox
Il criterio sandbox è la parte più cruciale di una sandbox, perché specifica le azioni che può o non può essere eseguita da Sandboxee. Un criterio sandbox è composto da due parti:
- Criterio SysCall
- Configurazione dello spazio dei nomi
Criterio SysCall predefinito
Il criterio predefinito blocca le chiamate di sistema sempre pericolose e ha la precedenza sul criterio esteso fornito dall'utente.
Criterio SysCall esteso
Il criterio di chiamata estesa può essere creato utilizzando la nostra classe PolicyBuilder. Questa classe definisce una serie di regole di comodità (ad esempio 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 macro BPF non elaborate con AddPolicyOnSyscall
e AddPolicyOnSyscalls
. L'esempio di crc4 utilizza questo meccanismo per limitare gli argomenti per le chiamate di sistema read
, write
e close
.
In generale, più stretta è il criterio Sandbox, migliore sarà lo sfruttamento di qualsiasi vulnerabilità presente all'interno del codice, confinante con il criterio. Se sei in grado di specificare esattamente quali syscall e argomenti sono necessari per il normale funzionamento del programma, qualsiasi utente malintenzionato che sfrutta una vulnerabilità di esecuzione del codice è limitato agli stessi limiti.
Un criterio Sandbox molto preciso potrebbe rifiutare tutte le chiamate di sistema, ad eccezione delle operazioni di lettura e scrittura sui descrittori dei file di input e output standard. All'interno di questa sandbox, un programma potrebbe assumere input, elaborarlo e restituire l'output. Tuttavia, se il processo tenta di effettuare qualsiasi altra chiamata di sistema, viene interrotto a causa di una violazione delle norme. Pertanto, se il processo viene compromesso (esecuzione del codice da parte di un utente malintenzionato), non può fare altro che compromettere l'output (che l'esecutore e gli altri devono comunque gestire correttamente).
Configurazione dello spazio dei nomi
L'oggetto PolicyBuilder viene utilizzato anche per configurare la visualizzazione individuale del file system di Sandboxee. È possibile mappare singoli file (AddFile
/AddFileAt
), intere directory (AddDirectory
/AddDirectoryAt
) e spazio di archiviazione temporaneo (AddTmpfs
) nell'ambiente di Sandboxee. Inoltre, AddLibrariesForBinary
può essere utilizzato per mappare automaticamente tutte le librerie necessarie all'eseguibile specificato dinamicamente collegato.
Flag della riga di comando
Qualsiasi criterio Sandbox2 può essere disabilitato specificando uno dei seguenti flag della riga di comando. Questi flag sono a scopo di test (ad esempio durante il perfezionamento del criterio Extended Syscall Policy).
--sandbox2_danger_danger_permit_all
--sandbox2_danger_danger_permit_all_and_log
Esecutore sandbox
La sandbox dell'esecutore è un processo che non ha una sandbox stessa. È il processo di traccia ptrace che si collega a Sandboxee (processo di traccia ptrace). L'esecutore della sandbox viene inoltre configurato ed esegue un'istanza Monitor, che monitora la sandbox e fornisce informazioni sullo stato.
Sandbox2 consente tre modalità di esecuzione: autonoma, sandbox2 e fork personalizzato. Se utilizzi un forkserver, Sandboxee viene creato come processo secondario di Sandbox Executor. Queste modalità sono spiegate qui in dettaglio.
Sandboxo
Sandboxee è il processo che viene eseguito in un ambiente sandbox limitato, definito dal criterio Sandbox. L'esecutore della sandbox invia il criterio al sandbox tramite IPC. Sandboxee applica quindi il criterio. Qualsiasi violazione del criterio comporterà la terminazione del processo, se non configurato diversamente (vedi Criterio sandbox).