
Запускайте любую команду в ограниченном представлении файловой системы в Linux
⚠️ ПРОЕКТ УСТАРЕЛ
Разработка этого проекта остановлена, потому что кто-то другой работал над той же идеей и создал лучшее решение.
Настоятельно рекомендуем ознакомиться: Fence от Use-Tusk.Примечание: Этот репозиторий изначально создавался для FOSS HACK 2026, но, к сожалению, мы не успели завершить его вовремя.
Однако мы создали аналогичный проект для Hackathena '26, который занял 3-е место!
Если вам интересно, вы можете найти этот репозиторий здесь: A56-A5/lion.
Cordon запускает любую команду в ограниченном представлении файловой системы в Linux. Он использует пространства имён Linux (через bubblewrap), чтобы скрыть всё, что не нужно вашему процессу — домашний каталог, SSH-ключи, учётные данные AWS, всё — при этом позволяя команде выполнять свою работу.
cordon run --net=allow -- npm install
cordon run -- bash setup.sh
cordon run --profile python -- pip install -r requirements.txt
Никакого root. Никаких контейнеров. Никаких фоновых демонов.
Когда вы запускаете npm install или pip install, этот код выполняется с вашими полными правами пользователя. Он может прочитать ~/.ssh/id_rsa, передать его на сервер, изменить принадлежащие вам файлы — и всё это, притворяясь обычной установкой пакета.
Это не паранойя. Такое случалось:
Ответ Cordon: не позволяйте процессу видеть то, что ему не положено, даже если код вредоносный.
Каждый cordon run создаёт свежее изолированное окружение:
/usr, /bin, /lib смонтированы только для чтения — программы могут работать, не ломая системуnpm install создаёт node_modules/, сборки работаютsrc/ только для чтения, если существует — исходные файлы нельзя незаметно перезаписать~/.ssh, ~/.aws, HOME — вообще не монтируются по умолчанию--net=allowКогда процесс завершается, песочница исчезает. Ничего не сохраняется.
Режим --net=allow запускает встроенный Rust-прокси HTTP/HTTPS на случайном порту localhost и внедряет его в песочницу через переменные окружения (HTTP_PROXY, https_proxy, npm_config_proxy и т.д.). Он перехватывает CONNECT-туннели и проверяет каждый домен по белому списку перед пересылкой.
Белый список по умолчанию включает registry.npmjs.org, pypi.org, crates.io, github.com. Всё, что не в списке, получает 403 — даже если скрипт postinstall пакета пытается «позвонить домой».
# 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
Опционально добавьте фильтр системных вызовов:
# 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
Это вторая линия обороны. Даже если что-то вырвется из ограничений файловой системы, оно всё равно не сможет вызвать ptrace для присоединения к другому процессу или perf_event_open для работы по побочным каналам.
git clone https://github.com/LORDv1shnu/Cordon
cd Cordon
bash install.sh # builds release binary → ~/.local/bin/cordon
Или вручную:
cargo build --release
cp target/release/cordon ~/.local/bin/
Вам необходимо установить bubblewrap:
sudo apt install bubblewrap # Ubuntu/Debian
sudo dnf install bubblewrap # Fedora
sudo pacman -S bubblewrap # Arch
Первый запуск после установки:
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 -
Существует четыре конфигурационных файла, применяемых по порядку:
Флаги CLI всегда имеют приоритет. cordon.toml переопределяет именованный профиль. Встроенный в бинарный файл core.toml нельзя изменить во время выполнения.
Та же конвенция, что и в bwrap и оболочке.
Cordon — это не контейнер, не антивирус и не замена SELinux или AppArmor. Он ограничивает видимость файловой системы и сетевой доступ — он не пытается обнаруживать вредоносное ПО. Если у чего-то есть эксплойт ядра, оно вырвется. Цель — сделать атаки на цепочку поставок значительно сложнее, а не невозможными.
Также: в настоящее время только Linux x86_64 и aarch64. Требуется bubblewrap.
Создан на Rust. Использует bubblewrap для пространств имён, seccompiler для компиляции BPF-фильтров, clap для CLI, tracing для структурированного логирования. Прокси-сервер фильтрации доменов написан с нуля на чистом Rust (без внешних прокси-инструментов).
→ COMMANDS.md — полная справка по флагам
→ SCANNER_LOGIC.md — как работает системный сканер
→ MODULE_INFO.md — описание каждого исходного файла
Создано с помощью AI (Gemini). Архитектура, модель безопасности и проектные решения являются работой автора.
| Атака | Что она делала |
|---|
| LiteLLM (2024) | Вредоносный PyPI-пакет читал SSH-ключи и переменные окружения при pip install |
| xz-utils (2024) | Бэкдор на этапе сборки, внедрённый на шаге make во время установки |
| event-stream (npm, 2018) | Скомпрометированный npm-пакет незаметно похищал Bitcoin-кошельки |
| SolarWinds | Атака на цепочку поставок через конвейер сборки/обновления |
| Слой | Где | Кто пишет |
|---|
core.toml | скомпилирован в бинарный файл | нельзя редактировать во время выполнения (защищено от изменений) |
system.toml | ~/.config/cordon/ | cordon scan |
profiles.toml | ~/.config/cordon/ | cordon profile create |
cordon.toml | каталог проекта | cordon init / cordon set / cordon add |
| Код | Значение |
|---|
| 0 | успех |
| 1 | внутренняя ошибка cordon |
| 2 | неверное использование CLI |
| 125 | не удалось настроить песочницу (отсутствует bwrap и т.д.) |
| 126 | команда найдена, но не может быть выполнена внутри песочницы |
| 127 | команда не найдена внутри песочницы |
| N | передано от изолированного процесса |