Il sandboxing è un meccanismo di sicurezza che isola un processo o un componente software in un ambiente controllato, detto sandbox (lett. recinto di sabbia), limitando le operazioni che può eseguire sul sistema sottostante. L’obiettivo è il principio del minimo privilegio: il codice in esecuzione può accedere solo alle risorse strettamente necessarie alla sua funzione, riducendo il raggio d’azione (blast radius) di una compromissione.
Il sandboxing è distinto dalla virtualizzazione: non isola un intero sistema operativo, ma un singolo processo o gruppo di processi all’interno dello stesso kernel.
Meccanismi fondamentali
Namespace Linux
I namespace Linux (introdotti progressivamente dal kernel 2.6.x) separano le viste di diverse risorse di sistema tra gruppi di processi:
| Namespace | Risorsa isolata |
|---|---|
pid | Albero dei processi |
net | Stack di rete, interfacce, porte |
mnt | Filesystem montato |
user | UID/GID (user remapping) |
ipc | Code di messaggi, semafori, shared memory |
uts | Hostname e domainname |
cgroup | Radice del cgroup tree |
I container Docker e OCI si basano integralmente su namespace Linux.
seccomp (Secure Computing Mode)
seccomp è un filtro a livello kernel che limita le system call che un processo può invocare. In modalità seccomp-bpf, il filtro è espresso come programma BPF che può esaminare il numero della syscall e i suoi argomenti:
// Esempio: permette solo read, write, exit, sigreturn
struct sock_filter filter[] = {
BPF_STMT(BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, nr)),
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_read, 3, 0),
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_write, 2, 0),
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_exit, 1, 0),
BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_KILL),
BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_ALLOW),
};
Browser moderni (Chrome, Firefox), container runtime e molti servizi di sistema usano seccomp per ridurre drasticamente la superficie d’attacco del kernel.
cgroup (Control Groups)
I cgroup Linux limitano le risorse computazionali di un gruppo di processi: CPU, memoria, I/O, rete. Non sono una protezione di sicurezza diretta ma impediscono che un processo compromesso monopolizzi risorse del sistema (attacco di tipo DoS locale).
Capabilities Linux
Tradizionalmente, i privilegi root erano binari (tutto o niente). Le capabilities Linux suddividono i privilegi root in ~40 capacità distinte (CAP_NET_ADMIN, CAP_SYS_PTRACE, CAP_CHOWN, ecc.), assegnabili selettivamente ai processi. Un processo può essere autorizzato ad aprire porte privilegiate (CAP_NET_BIND_SERVICE) senza poter modificare il filesystem di sistema (CAP_SYS_ADMIN).
Sandboxing nelle applicazioni
Browser web
I browser moderni implementano architetture multi-processo con sandboxing stratificato:
- Renderer process: esegue HTML, CSS, JavaScript in un processo separato con seccomp e namespace ristretti. Non può accedere al filesystem o alla rete direttamente.
- GPU process: isolato per contenere bug del driver GPU.
- Browser process: il coordinatore principale, con privilegi completi.
Una vulnerabilità nel motore JavaScript (es. heap overflow in V8) compromette solo il renderer; per raggiungere il sistema serve un secondo exploit di sandbox escape.
macOS App Sandbox
macOS utilizza un profilo dichiarativo (entitlements) per descrivere le risorse accessibili a ogni applicazione:
<key>com.apple.security.app-sandbox</key><true/>
<key>com.apple.security.files.user-selected.read-only</key><true/>
Le app distribuite tramite Mac App Store sono obbligatoriamente sandboxate. Le app fuori store possono essere sandbox-ate volontariamente; le app non firmate non hanno restrizioni.
Android e iOS
Le piattaforme mobili applicano il sandboxing per default a ogni app installata (vedi App Sandboxing). Ogni app viene eseguita con un UID Unix univoco; l’accesso a fotocamera, microfono, contatti e posizione richiede permessi espliciti dell’utente.
Sandbox escape
Un sandbox escape è una vulnerabilità che consente a codice in esecuzione dentro la sandbox di uscirne, ottenendo accesso alle risorse del sistema reale. Le categorie principali:
| Vettore | Esempio |
|---|---|
| Vulnerabilità del kernel | Bug nel gestore delle syscall che seccomp non filtra |
| Vulnerabilità nell’IPC della sandbox | Bug nel canale di comunicazione renderer → browser |
| Errore di configurazione | Namespace o permessi configurati in modo eccessivamente permissivo |
| Side-channel | Spectre/Meltdown: lettura della memoria del processo host dal renderer |
Relazione con altri meccanismi
Il sandboxing si integra con ASLR, Secure Boot e SELinux/AppArmor per costruire una difesa in profondità. Nessun singolo meccanismo è sufficiente: la combinazione di più strati riduce la probabilità che una singola vulnerabilità produca una compromissione completa del sistema.