La sandbox limita ciò che il processo di un executor può vedere e modificare. Le risorse dipendono dal manifest firmato e, quando necessario, dall'invocazione concreta. Questo livello si aggiunge al Vaglio, alla verifica dell'identità e ai controlli applicativi: non li sostituisce e non concede, da solo, l'autorizzazione a compiere un'azione.
Quando un executor gira sul server Linux, runtime/sandbox.py
può anteporre bwrap al comando Python. Bubblewrap costruisce una
vista separata del file system, rende privato /tmp, separa alcuni
spazi dei nomi e, se l'executor non richiede la rete, aggiunge
--unshare-net. Non esiste un demone separato: il profilo viene
costruito per ogni invocazione.
Se il lavoro viene trasferito a un dispositivo associato, il client Rust applica invece il meccanismo disponibile su quel sistema operativo. Il server sceglie il dispositivo e verifica l'appartenenza all'utente; il client esegue il comando e restituisce anche il livello di contenimento realmente usato.
| Funzione | Responsabilità |
|---|---|
bwrap_available, sandbox_disabled | Rilevano la presenza di bwrap e l'eventuale disattivazione mediante METNOS_SANDBOX. |
wrap_command | Restituisce il comando avvolto da bwrap, oppure il comando originario quando l'involucro non è attivo. |
filesystem_extras | Risolve soltanto gli argomenti indicati da una capacità firmata fs:read con forma arg:<nome>; l'argomento può restringere l'ambito, non ampliarlo. |
undo_history_extras | Rende scrivibile la sola cartella dei contenuti di ripristino appartenente al turno corrente, quando il manifest dichiara il modello inverso previsto. |
invocation_skills, skill_extras | Individuano i fornitori necessari all'invocazione, rendono visibile la sola cartella della relativa integrazione e abilitano la rete. Per gli executor conformi l'origine è provider:access; i manifest precedenti conservano un percorso di compatibilità. |
mail_extras | Per mail:read rende visibili in sola lettura le credenziali dei soli account richiesti e abilita la rete. Non monta l'intero deposito delle credenziali. |
dialog_extras | Per dialog.user_input rende scrivibile la sola cartella del mittente autenticato. |
python_package_roots | Individua le radici dei pacchetti usate dall'interprete corrente, senza esporre l'intera cartella personale. |
status | Restituisce percorso, disponibilità, disattivazione e stato effettivo di bwrap. |
Il profilo monta in sola lettura i percorsi di sistema esistenti fra
/usr, /bin, /sbin, le directory delle
librerie, /etc, /opt, /var/lib/python3 e
/sys. Aggiunge inoltre:
/proc e un /dev minimo;/tmp privato;Sono sempre richiesti --unshare-user,
--unshare-ipc, --unshare-uts e
--die-with-parent. Il profilo del server non aggiunge attualmente
uno spazio dei nomi PID, Landlock o un filtro seccomp personalizzato.
| Dichiarazione | Effetto sul profilo |
|---|---|
fs:read / fs:write | Montaggio in sola lettura o in lettura e scrittura. Gli ambiti fissi in forma glob vengono ridotti alla loro radice; gli ambiti arg: sono risolti sul valore concreto e soltanto se il percorso esiste. |
metnos:read, metnos:write, metnos:create | Traduzione di risorse semantiche chiuse — per esempio fogli, registro persone o proposte — nei soli percorsi canonici gestiti da Metnos. |
index:read | Accesso in sola lettura alla radice canonica dell'indice dichiarato; un nome sconosciuto non concede nulla. |
systemd:read e system:read | Visibilità limitata alle risorse note necessarie alla lettura dello stato. La richiesta delle interfacce di rete mantiene disponibile la rete dell'host. |
provider:access o skill:<nome> | Cartella dell'integrazione in lettura e scrittura, necessaria anche al rinnovo OAuth, e rete dell'host. |
mail:read | Singoli file di credenziali dell'account richiesto in sola lettura e rete dell'host. |
Le capacità network:* e net:*, le integrazioni
esterne e alcuni casi di lettura del sistema impediscono l'aggiunta di
--unshare-net. In questo caso il processo dispone della rete
dell'host: la limitazione a un dominio o a un fornitore resta compito dei
controlli applicativi e delle credenziali circoscritte.
Se bwrap non è nel PATH, oppure se
METNOS_SANDBOX vale 0, off,
no o false, wrap_command restituisce il
comando invariato. Non c'è un terzo percorso che trasformi automaticamente
un'eccezione di rilevamento in un esito negativo.
Il controllo preventivo dell'ambito dell'invocazione continua a essere
eseguito prima del sottoprocesso, così come restano operativi il Vaglio e i
controlli propri degli executor. Ciò non equivale però al contenimento del
sistema operativo. Sul server locale il risultato dell'executor non porta
automaticamente un campo che dichiari l'assenza di bwrap; questa
condizione va osservata mediante status() o la diagnostica del
servizio.
invoke_executor è il punto comune di esecuzione. L'ordine
essenziale è il seguente:
bwrap non è disponibile;sys.executable, cioè l'interprete dell'ambiente Metnos corrente, attraverso wrap_command.Il punto pubblico passa inoltre dallo schedulatore centrale, che applica limiti di concorrenza senza cambiare collocazione, argomenti o contratto del risultato.
Il parametro autonomy è accettato da
wrap_command, ma oggi è informativo: non seleziona profili
diversi. Il confinamento deriva dalle capacità del manifest e dalle risorse
risolte per l'invocazione. Le decisioni su consenso, criticità e ammissibilità
appartengono alla policy e al
Vaglio, non alla sandbox.
I test non dipendono da un numero dichiarato nella documentazione. Le verifiche dedicate coprono i montaggi del runtime e dell'ambiente Python, i database i18n, le integrazioni esterne, le credenziali di posta e i casi di declassamento. Le principali suite sono:
tests/runtime/safety/test_sandbox_runtime_bind.py tests/runtime/safety/test_sandbox_i18n_bind.py tests/runtime/safety/test_sandbox_skill_backed.py
I moduli Rust contengono inoltre test vicini alle implementazioni comuni,
Linux, Windows e AppContainer. Le prove che confrontano gli argomenti di
bwrap possono essere eseguite anche senza avviare una sandbox
reale; le prove di sistema verificano separatamente il meccanismo disponibile
sulla piattaforma.
Lo stato corrente si legge con sandbox.status(). La funzione
controlla il PATH al momento della chiamata e restituisce
bwrap_available, bwrap_path,
disabled_via_env e active; il risultato non viene
memorizzato dal modulo.
# Debian e Ubuntu sudo apt install bubblewrap # Fedora e RHEL sudo dnf install bubblewrap # Arch Linux sudo pacman -S bubblewrap
Dopo l'installazione occorre verificare sia status() sia una
vera invocazione nell'ambiente del servizio. Un PATH diverso o la
variabile METNOS_SANDBOX possono produrre un esito differente da
quello della sessione amministrativa.
/etc, /opt e /sys sono visibili in sola lettura quando esistono. La sola lettura impedisce modifiche, ma non garantisce la riservatezza di ogni file presente in quelle radici.system:undo è un'eccezione esplicita. L'annullamento deve ricostruire dal registro risorse note soltanto al momento dell'esecuzione; per questo wrap_command lascia passare direttamente il broker firmato. Il Vaglio e il vincolo di esecuzione sul server restano necessari, ma non costituiscono una sandbox del sistema operativo.Il client remoto usa un contratto di risultato comune, ma il
contenimento dipende dalla piattaforma. Il campo sandbox descrive
il livello realmente applicato; un eventuale
sandbox_downgrade_reason spiega il passaggio a un livello meno
forte.
| Piattaforma | Implementazione corrente | Comportamento in caso di declassamento |
|---|---|---|
| Linux | Bubblewrap con spazio dei nomi dei montaggi e PID, rete separata quando non richiesta, cartella temporanea privata e gruppo di processi dedicato. Landlock e seccomp personalizzati non sono implementati. | Se bwrap manca o è disattivato, esecuzione diretta con avviso; il risultato dichiara sandbox:"none". Il gruppo di processi continua a consentire la terminazione dell'albero alla scadenza. |
| Windows | AppContainer con concessioni derivate dalle capacità, posto a sua volta in un Job Object. AppContainer è tentato per impostazione predefinita quando supportato. | Per sottoprocessi di sistema, percorsi non ancorabili, ambiti troppo ampi o indisponibilità del contenitore, il client usa il Job Object e comunica il motivo. Se il manifest richiede AppContainer come livello minimo, l'invocazione non deve essere declassata silenziosamente. |
| macOS | Non esiste oggi un modulo nativo sandbox_macos.rs. Il percorso Unix comune non offre un equivalente operativo di bubblewrap su macOS. | L'esecuzione non va presentata come isolata: il livello effettivo è none, pur restando il controllo della scadenza sul gruppo di processi. |
Il Job Object limita la memoria del singolo processo, il numero di processi attivi e la durata dell'albero. Il processo nasce sospeso, viene assegnato al Job Object e soltanto allora viene avviato; alla scadenza l'intero Job Object viene terminato. AppContainer aggiunge l'isolamento di file e rete mediante concessioni calcolate per l'invocazione.
Prima dell'esecuzione remota, il client verifica il pacchetto firmato e usa un interprete Python predisposto e verificato. Queste verifiche proteggono la provenienza del codice; non sostituiscono il contenimento dichiarato nel risultato.