Esegui qualsiasi comando all'interno di una vista ristretta del filesystem su Linux
⚠️ PROGETTO DEPRECATO
Lo sviluppo di questo progetto è stato interrotto perché qualcun altro stava lavorando alla stessa idea e ha costruito una soluzione migliore.
Consigliamo vivamente di dare un'occhiata a: Fence by Use-Tusk.Nota: Questo repository è stato creato originariamente per FOSS HACK 2026, anche se purtroppo non siamo riusciti a completarlo in tempo.
Tuttavia, abbiamo realizzato un progetto simile per Hackathena '26 che ha vinto il 3° premio!
Se sei interessato, puoi trovare quel repository qui: A56-A5/lion.
Cordon esegue qualsiasi comando all'interno di una vista ristretta del filesystem su Linux. Utilizza i namespace di Linux (tramite bubblewrap) per nascondere tutto ciò di cui il tuo processo non ha bisogno — la tua home directory, le chiavi SSH, le credenziali AWS, tutto — lasciando comunque al comando la possibilità di fare il suo lavoro.
cordon run --net=allow -- npm install
cordon run -- bash setup.sh
cordon run --profile python -- pip install -r requirements.txt
Niente root. Niente container. Nessun demone in esecuzione in background.
Quando esegui npm install o pip install, quel codice viene eseguito con tutti i permessi del tuo utente. Può leggere ~/.ssh/id_rsa, esfiltrarlo su un server, modificare file di tua proprietà — tutto mentre sembra solo installare un pacchetto.
Non è paranoia. È già successo:
| Attacco | Cosa ha fatto |
|---|---|
| LiteLLM (2024) | Pacchetto PyPI malevolo ha letto chiavi SSH e variabili d'ambiente durante pip install |
| xz-utils (2024) | Backdoor in fase di compilazione iniettato tramite il passaggio make durante l'installazione |
| event-stream (npm, 2018) | Pacchetto npm compromesso ha rubato silenziosamente portafogli Bitcoin |
| SolarWinds | Attacco alla supply chain attraverso la pipeline di build/aggiornamento |
La risposta di Cordon: non lasciare che il processo veda ciò che non dovrebbe, anche se il codice è malevolo.
Ogni cordon run crea un ambiente isolato nuovo:
/usr, /bin, /lib sono montati in sola lettura — i comandi possono essere eseguiti, ma non rompere il sistemanpm install crea node_modules/, le build funzionanosrc/ è in sola lettura se esiste — i file sorgente non possono essere riscritti silenziosamente~/.ssh, ~/.aws, HOME — non montati affatto per impostazione predefinita--net=allowQuando il processo termina, il sandbox sparisce. Non rimane nulla.
La modalità --net=allow avvia un proxy HTTP/HTTPS in Rust built-in su una porta localhost casuale e lo inietta nel sandbox tramite variabili d'ambiente (HTTP_PROXY, https_proxy, npm_config_proxy, ecc.). Intercetta i tunnel CONNECT e controlla ogni dominio rispetto a una lista consentita prima di inoltrare.
La lista consentita predefinita include registry.npmjs.org, pypi.org, crates.io, github.com. Qualsiasi cosa non in lista riceve un 403 — anche se lo script postinstall del pacchetto tenta di chiamare casa.
# Raggiunge solo npmjs.org e i suoi CDN — nient'altro
cordon run --net=allow -- npm install
# Aggiungi un dominio per un registro privato
cordon run --net=allow --domain my.internal.registry -- npm install
Opzionalmente, aggiungi un filtro per le syscall:
# Blocca ptrace, kexec_load, mount, perf_event_open, process_vm_*
cordon run --seccomp basic --net=allow -- npm install
# Lista consentita rigorosa — solo syscall note come sicure
cordon run --seccomp strict -- python3 untrusted.py
Questa è una seconda linea di difesa. Anche se qualcosa riesce a uscire dalla restrizione del filesystem, non può comunque chiamare ptrace per agganciarsi a un altro processo o perf_event_open per lavoro su canali laterali.
git clone https://github.com/LORDv1shnu/Cordon
cd Cordon
bash install.sh # compila il binario di rilascio → ~/.local/bin/cordon
Oppure manualmente:
cargo build --release
cp target/release/cordon ~/.local/bin/
Devi avere bubblewrap installato:
sudo apt install bubblewrap # Ubuntu/Debian
sudo dnf install bubblewrap # Fedora
sudo pacman -S bubblewrap # Arch
Primo avvio dopo l'installazione:
cordon scan # esegue una scansione del sistema una volta, ci vogliono ~30s, scrive ~/.config/cordon/system.toml
cordon check # controllo di integrità — verifica che tutto sia pronto
# Le basi
cordon run -- echo "hello"
cordon run --net=allow -- npm install
cordon run --net=allow -- pip install -r requirements.txt
cordon run --net=full -- curl https://example.com # illimitato (nessun filtro)
# Seccomp
cordon run --seccomp basic --net=allow -- npm install
# Applicazioni GUI
cordon run --gui -- code .
cordon run --gui --optional audio_pipewire --optional dbus_session -- discord
# Profili integrati (preconfigurati per runtime comuni)
cordon run --profile node -- npm install
cordon run --profile python -- python3 script.py
cordon run --profile rust -- cargo build
# Debug di ciò che viene bloccato
cordon run --trace -- node server.js # wrapper strace, segnala i percorsi negati
cordon add --from-trace ~/.config/cordon/logs/last-trace.log # aggiungi in blocco i percorsi mancanti
# Limiti di risorse (richiede systemd)
cordon run --mem 512M --cpu 2.0 --timeout 60 -- npm install
# Esecuzione fittizia / verbose
cordon run --dry-run -- npm install # stampa il comando bwrap, non lo esegue
cordon run --verbose -- npm install # stampa ogni argomento bwrap mentre viene eseguito
cordon.toml)cordon init # rileva automaticamente Cargo.toml / package.json / pyproject.toml
cordon set --net=allow # persiste i flag in modo da non doverli digitare ogni volta
cordon add /path/to/assets --mode ro # espone percorsi aggiuntivi nel sandbox
cordon edit # apre cordon.toml in $EDITOR
cordon check # controllo di integrità: bwrap, namespace, AppArmor, moduli
cordon doctor # più approfondito: versione del kernel, stranezze della distribuzione, suggerimenti di fix esatti
cordon status # mostra cosa c'è in system.toml in questo momento
cordon list # mostra ogni mount che sarebbe attivo al prossimo avvio
cordon log --errors # mostra la coda del log dell'ultima esecuzione, solo errori
cordon syscalls --preset basic # elenca cosa blocca ogni preset seccomp
# Profili con nome (salvati in ~/.config/cordon/profiles.toml)
cordon profile create ci-node --net=allow --optional ld_so_cache
cordon run --profile ci-node -- npm test
# Lockfile per ambienti riproducibili
cordon lock update # SHA-256 di tutti i percorsi di mount → cordon.lock
cordon lock verify # verifica che nulla sia cambiato
# Condividi la configurazione del sandbox con il team
cordon export > sandbox.json
cordon import sandbox.json
# Completamento con tab
cordon completions zsh > ~/.zfunc/_cordon
# Wrapper trasparenti — fai in modo che "npm" venga sempre eseguito in sandbox
cordon wrap npm
cordon wrap pip
npm install # in realtà esegue: cordon run -- npm install "$@"
cordon unwrap npm
# Pagina man
cordon man | man -l -
Ci sono quattro file di configurazione, applicati in ordine:
| Strato | Dove | Chi lo scrive |
|---|---|---|
core.toml | compilato nel binario | non modificabile a runtime (a prova di manomissione) |
system.toml | ~/.config/cordon/ | cordon scan |
profiles.toml | ~/.config/cordon/ | cordon profile create |
cordon.toml | directory del progetto | cordon init / cordon set / cordon add |
I flag CLI hanno sempre la precedenza. cordon.toml batte un profilo con nome. Il core.toml built-in del binario non può essere toccato a runtime.
| Codice | Significato |
|---|---|
| 0 | successo |
| 1 | errore interno di cordon |
| 2 | utilizzo errato della CLI |
| 125 | configurazione del sandbox fallita (bwrap mancante, ecc.) |
| 126 | comando trovato ma non eseguibile all'interno del sandbox |
| 127 | comando non trovato all'interno del sandbox |
| N | inoltrato dal processo in sandbox |
Stessa convenzione di bwrap e della shell.
Cordon non è un container, non è un antivirus e non sostituisce SELinux o AppArmor. Limita la visibilità del filesystem e l'accesso alla rete — non cerca di rilevare malware. Se qualcosa ha un exploit del kernel, ne uscirà. L'obiettivo è rendere gli attacchi alla supply chain significativamente più difficili, non impossibili.
Inoltre: attualmente solo Linux x86_64 e aarch64. bubblewrap è necessario.
Costruito in Rust. Usa bubblewrap per il namespace, seccompiler per la compilazione dei filtri BPF, clap per la CLI, tracing per il logging strutturato. Il proxy di filtraggio dei domini è scritto da zero in puro Rust (nessun tool proxy esterno).
→ COMMANDS.md — riferimento completo dei flag
→ SCANNER_LOGIC.md — come funziona lo scanner di sistema
→ MODULE_INFO.md — spiegazione di ogni file sorgente
Costruito con assistenza AI (Gemini). L'architettura, il modello di sicurezza e le decisioni di progettazione sono opera dell'autore.