
Exécutez n'importe quelle commande dans une vue restreinte du système de fichiers sous Linux.
⚠️ PROJET DÉPRÉCIÉ
Le développement de ce projet a été arrêté car quelqu'un d'autre travaillait sur la même idée et a construit une meilleure solution.
Nous recommandons vivement de consulter : Fence par Use-Tusk.Note : Ce dépôt a été créé à l'origine pour FOSS HACK 2026, même si nous n'avons malheureusement pas pu le terminer à temps.
Cependant, nous avons construit un projet similaire pour Hackathena '26 qui a remporté le 3e prix !
Si vous êtes intéressé, vous pouvez trouver ce dépôt ici : A56-A5/lion.
Cordon exécute n'importe quelle commande dans une vue restreinte du système de fichiers sous Linux. Il utilise les espaces de noms Linux (via bubblewrap) pour masquer tout ce dont votre processus n'a pas besoin — votre répertoire personnel, vos clés SSH, vos identifiants AWS, tout — tout en permettant à la commande de faire son travail.
cordon run --net=allow -- npm install
cordon run -- bash setup.sh
cordon run --profile python -- pip install -r requirements.txt
Pas de root. Pas de conteneurs. Pas de démons en arrière-plan.
Lorsque vous exécutez npm install ou pip install, ce code s'exécute avec toutes vos permissions utilisateur. Il peut lire ~/.ssh/id_rsa, l'exfiltrer vers un serveur, modifier des fichiers que vous possédez — tout en ayant l'air de simplement installer un paquet.
Ce n'est pas de la paranoïa. C'est déjà arrivé :
La réponse de Cordon : ne laissez pas le processus voir ce qu'il ne devrait pas, même si le code est malveillant.
Chaque cordon run crée un environnement isolé frais :
/usr, /bin, /lib sont montés en lecture seule — les choses peuvent s'exécuter sans casser le systèmenpm install crée node_modules/, les builds fonctionnentsrc/ est en lecture seule s'il existe — les fichiers sources ne peuvent pas être réécrits silencieusement~/.ssh, ~/.aws, HOME — pas montés du tout par défaut--net=allowQuand le processus se termine, le bac à sable disparaît. Rien ne persiste.
Le mode --net=allow démarre un proxy HTTP/HTTPS Rust intégré sur un port localhost aléatoire et l'injecte dans le bac à sable via des variables d'environnement (HTTP_PROXY, https_proxy, npm_config_proxy, etc.). Il intercepte les tunnels CONNECT et vérifie chaque domaine par rapport à une liste blanche avant de transmettre.
La liste blanche par défaut inclut registry.npmjs.org, pypi.org, crates.io, github.com. Tout ce qui n'est pas dans la liste reçoit un 403 — même si le script postinstall du paquet tente de contacter son serveur.
# Only reaches npmjs.org and its CDNs — nothing else
cordon run --net=allow -- npm install
# Add a domain for a private registry
cordon run --net=allow --domain my.internal.registry -- npm install
Ajoutez éventuellement un filtre d'appels système :
# Blocks ptrace, kexec_load, mount, perf_event_open, process_vm_*
cordon run --seccomp basic --net=allow -- npm install
# Strict allowlist — only known-safe syscalls
cordon run --seccomp strict -- python3 untrusted.py
C'est une deuxième ligne de défense. Même si quelque chose s'échappe de la restriction du système de fichiers, il ne peut toujours pas appeler ptrace pour s'attacher à un autre processus ou perf_event_open pour un travail sur canal auxiliaire.
git clone https://github.com/LORDv1shnu/Cordon
cd Cordon
bash install.sh # builds release binary → ~/.local/bin/cordon
Ou manuellement :
cargo build --release
cp target/release/cordon ~/.local/bin/
Vous avez besoin de bubblewrap installé :
sudo apt install bubblewrap # Ubuntu/Debian
sudo dnf install bubblewrap # Fedora
sudo pacman -S bubblewrap # Arch
Première exécution après installation :
cordon scan # scans your system once, takes ~30s, writes ~/.config/cordon/system.toml
cordon check # sanity check — makes sure everything's ready
# The basics
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 # unrestricted (no filtering)
# Seccomp
cordon run --seccomp basic --net=allow -- npm install
# GUI apps
cordon run --gui -- code .
cordon run --gui --optional audio_pipewire --optional dbus_session -- discord
# Built-in profiles (pre-configured for common runtimes)
cordon run --profile node -- npm install
cordon run --profile python -- python3 script.py
cordon run --profile rust -- cargo build
# Debug what's being blocked
cordon run --trace -- node server.js # strace wrapper, reports denied paths
cordon add --from-trace ~/.config/cordon/logs/last-trace.log # batch-add missing paths
# Resource limits (needs systemd)
cordon run --mem 512M --cpu 2.0 --timeout 60 -- npm install
# Dry run / verbose
cordon run --dry-run -- npm install # print the bwrap command, don't run it
cordon run --verbose -- npm install # print each bwrap arg as it runs
cordon.toml)cordon init # auto-detects Cargo.toml / package.json / pyproject.toml
cordon set --net=allow # persist flags so you don't type them every time
cordon add /path/to/assets --mode ro # expose extra paths into the sandbox
cordon edit # open cordon.toml in $EDITOR
cordon check # health check: bwrap, namespaces, AppArmor, modules
cordon doctor # deeper: kernel version, distro quirks, exact fix suggestions
cordon status # show what's in system.toml right now
cordon list # show every mount that would be active on next run
cordon log --errors # tail the last run's log, errors only
cordon syscalls --preset basic # list what each seccomp preset blocks
# Named profiles (stored in ~/.config/cordon/profiles.toml)
cordon profile create ci-node --net=allow --optional ld_so_cache
cordon run --profile ci-node -- npm test
# Lockfile for reproducible environments
cordon lock update # SHA-256 all mount paths → cordon.lock
cordon lock verify # check nothing drifted
# Share sandbox config with the team
cordon export > sandbox.json
cordon import sandbox.json
# Tab completions
cordon completions zsh > ~/.zfunc/_cordon
# Transparent wrappers — make "npm" always run sandboxed
cordon wrap npm
cordon wrap pip
npm install # actually runs: cordon run -- npm install "$@"
cordon unwrap npm
# Man page
cordon man | man -l -
Il y a quatre fichiers de configuration, appliqués dans l'ordre :
Les drapeaux CLI l'emportent toujours. cordon.toml l'emporte sur un profil nommé. Le core.toml intégré au binaire ne peut pas être modifié à l'exécution.
Même convention que bwrap et le shell.
Cordon n'est pas un conteneur, ni un antivirus, ni un remplacement pour SELinux ou AppArmor. Il restreint la visibilité du système de fichiers et l'accès réseau — il n'essaie pas de détecter les malwares. Si quelque chose possède une exploitation du noyau, il s'échappera. L'objectif est de rendre les attaques de la chaîne d'approvisionnement considérablement plus difficiles, pas impossibles.
Aussi : actuellement uniquement Linux x86_64 et aarch64. bubblewrap est requis.
Construit en Rust. Utilise bubblewrap pour les espaces de noms, seccompiler pour la compilation de filtres BPF, clap pour la CLI, tracing pour la journalisation structurée. Le proxy de filtrage de domaine est écrit de zéro en Rust pur (aucun outil proxy externe).
→ COMMANDS.md — référence complète des drapeaux
→ SCANNER_LOGIC.md — comment fonctionne le scanner système
→ MODULE_INFO.md — chaque fichier source expliqué
Construit avec l'aide de l'IA (Gemini). L'architecture, le modèle de sécurité et les décisions de conception sont le travail de l'auteur.
| Attaque | Ce qu'elle a fait |
|---|
| LiteLLM (2024) | Paquet PyPI malveillant a lu les clés SSH et les variables d'environnement lors de pip install |
| xz-utils (2024) | Porte dérobée au moment de la compilation, injectée via l'étape make pendant l'installation |
| event-stream (npm, 2018) | Paquet npm compromis a volé silencieusement des portefeuilles Bitcoin |
| SolarWinds | Attaque de la chaîne d'approvisionnement via le pipeline de construction/mise à jour |
| Couche | Où | Qui l'écrit |
|---|
core.toml | compilé dans le binaire | non modifiable à l'exécution (inviolable) |
system.toml | ~/.config/cordon/ | cordon scan |
profiles.toml | ~/.config/cordon/ | cordon profile create |
cordon.toml | répertoire du projet | cordon init / cordon set / cordon add |
| Code | Signification |
|---|
| 0 | succès |
| 1 | erreur interne de cordon |
| 2 | mauvaise utilisation de la CLI |
| 125 | échec de la configuration du bac à sable (bwrap manquant, etc.) |
| 126 | commande trouvée mais non exécutable dans le bac à sable |
| 127 | commande introuvable dans le bac à sable |
| N | transféré depuis le processus isolé |