Spiegazione Sandbox2

La progettazione di Sandbox2 si basa su tecnologie consolidate e ben note, un framework di criteri e due processi: l'esecutore della sandbox e il sandboxee.

Tecnologie coinvolte

Le sezioni seguenti trattano 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 una singola istanza del kernel. Sandbox2 utilizza i seguenti tipi di spazi dei nomi:

  • IPC
  • Rete (a meno che non sia disattivata esplicitamente chiamando PolicyBuilder::AllowUnrestrictedNetworking())
  • Montaggio (utilizzando una visualizzazione personalizzata dell'albero del file system)
  • PID
  • Utente
  • UTS

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

IPC

Sandbox2 consente lo scambio di dati arbitrari tra l'esecutore della sandbox e il sandboxee non attendibile. Supporta i messaggi di tipo lunghezza-valore (TLV), il passaggio di descrittori di file e lo scambio di credenziali tramite token e handle.

Seccomp-BPF

Sandbox2 si basa su seccomp-bpf, un'estensione della modalità di calcolo sicuro (seccomp) che consente di utilizzare le regole del filtro di pacchetti Berkeley (BPF) per filtrare le chiamate di sistema.

seccomp è una funzionalità 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 chiamata di sistema, verrà terminato. L'estensione seccomp-bpf consente maggiore flessibilità rispetto a seccomp. Anziché 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, saltarla e restituire un valore fittizio, terminare il processo, generare un segnale o notificare il tracer.

Ptrace

La syscall ptrace (process trace) fornisce funzionalità che consentono al processo tracer di osservare e controllare l'esecuzione del processo tracee. Il processo di tracciamento ha il controllo completo del processo tracciato una volta collegato. Scopri di più su ptrace su Wikipedia o nella pagina del manuale correlata.

Norme relative alla sandbox

Le norme sandbox sono la parte più importante di una sandbox, in quanto specificano le azioni che il Sandboxee può e non può eseguire. Una norma sandbox è composta da due parti:

  • Policy di chiamate di sistema
  • Configurazione dello spazio dei nomi

Default Syscall Policy

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

Policy di chiamata di sistema estesa

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

Se vuoi limitare ulteriormente le chiamate di sistema o richiedere regole più complesse, puoi specificare 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ù rigorose sono le norme della sandbox, meglio è, perché lo sfruttamento di qualsiasi vulnerabilità presente nel codice sarà limitato dalle norme. Se riesci a specificare esattamente quali chiamate di sistema e quali argomenti sono necessari per il normale funzionamento del programma, qualsiasi malintenzionato che sfrutti una vulnerabilità di esecuzione del codice è limitato anche agli stessi limiti.

Una policy Sandbox molto restrittiva potrebbe negare tutte le chiamate di sistema, ad eccezione delle operazioni di lettura e scrittura sui descrittori di file di input e output standard. All'interno di questa sandbox, un programma può ricevere input, elaborarlo e restituire l'output. Tuttavia, se il processo tentasse di effettuare un'altra chiamata di sistema, verrebbe 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 nulla di più nefasto che produrre un output errato (che l'esecutore e 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 nell'ambiente di Sandboxee singoli file (AddFile / AddFileAt), intere directory (AddDirectory / AddDirectoryAt) e spazio di archiviazione temporaneo (AddTmpfs). Inoltre, AddLibrariesForBinary può essere utilizzato per mappare automaticamente tutte le librerie necessarie per l'eseguibile collegato dinamicamente specificato.

Flag della riga di comando

Qualsiasi criterio Sandbox2 può essere disattivato specificando uno dei seguenti flag della riga di comando. Questi flag sono destinati a scopi di test (ad es. durante la definizione delle norme relative alle chiamate di sistema estese).

  • --sandbox2_danger_danger_permit_all
  • --sandbox2_danger_danger_permit_all_and_log

Sandbox Executor

L'executor sandbox è un processo che non è in sandbox. È il processo di tracciamento ptrace che si collega a Sandboxee (processo di tracciamento ptrace). Sandbox Executor configura ed esegue anche un'istanza di Monitor che monitora 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 secondario di Sandbox Executor. Queste modalità sono spiegate in dettaglio qui.

Sandboxee

Sandboxee è il processo che viene eseguito nell'ambiente sandbox con limitazioni definito dal criterio sandbox. Sandbox Executor invia il criterio a Sandboxee tramite IPC. Sandboxee applica quindi il criterio. Qualsiasi violazione delle norme comporterà l'interruzione del processo, a meno che non sia configurato diversamente (vedi Norme relative alla sandbox).