Sandboxing

Indice dei contenuti

    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:

    NamespaceRisorsa isolata
    pidAlbero dei processi
    netStack di rete, interfacce, porte
    mntFilesystem montato
    userUID/GID (user remapping)
    ipcCode di messaggi, semafori, shared memory
    utsHostname e domainname
    cgroupRadice 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:

    VettoreEsempio
    Vulnerabilità del kernelBug nel gestore delle syscall che seccomp non filtra
    Vulnerabilità nell’IPC della sandboxBug nel canale di comunicazione renderer → browser
    Errore di configurazioneNamespace o permessi configurati in modo eccessivamente permissivo
    Side-channelSpectre/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.

    Ultimo aggiornamento: