
Execute qualquer comando dentro de uma visão restrita do sistema de arquivos no Linux
⚠️ PROJETO DESCONTINUADO
O desenvolvimento deste projeto foi interrompido porque outra pessoa estava trabalhando na mesma ideia e construiu uma solução melhor.
Recomendamos fortemente dar uma olhada em: Fence by Use-Tusk.Nota: Este repositório foi originalmente criado para o FOSS HACK 2026, embora infelizmente não tenhamos conseguido concluí-lo a tempo.
No entanto, construímos um projeto semelhante para o Hackathena '26 que ganhou o 3º prêmio!
Se você estiver interessado, pode encontrar esse repositório aqui: A56-A5/lion.
O Cordon executa qualquer comando dentro de uma visão restrita do sistema de arquivos no Linux. Ele usa namespaces do Linux (via bubblewrap) para ocultar tudo o que seu processo não precisa — seu diretório home, chaves SSH, credenciais AWS, tudo — enquanto ainda permite que o comando faça seu trabalho.
cordon run --net=allow -- npm install
cordon run -- bash setup.sh
cordon run --profile python -- pip install -r requirements.txt
Sem root. Sem containers. Sem daemons rodando em segundo plano.
Quando você executa npm install ou pip install, esse código é executado com suas permissões completas de usuário. Ele pode ler ~/.ssh/id_rsa, exfiltrá-lo para um servidor, modificar arquivos que você possui — tudo enquanto parece apenas instalar um pacote.
Isso não é paranóia. Já aconteceu:
A resposta do Cordon: não deixe o processo ver o que não deveria, mesmo que o código seja malicioso.
Cada cordon run cria um ambiente isolado novo:
/usr, /bin, /lib são montados somente leitura — as coisas podem rodar, não quebram o sistemanpm install cria node_modules/, builds funcionamsrc/ é somente leitura se existir — arquivos fonte não podem ser reescritos silenciosamente~/.ssh, ~/.aws, HOME — não montados por padrão--net=allowQuando o processo termina, o sandbox desaparece. Nada persiste.
O modo --net=allow inicia um proxy HTTP/HTTPS Rust embutido em uma porta localhost aleatória e o injeta no sandbox através de variáveis de ambiente (HTTP_PROXY, https_proxy, npm_config_proxy, etc.). Ele intercepta túneis CONNECT e verifica cada domínio contra uma lista de permissões antes de encaminhar.
A lista de permissões padrão inclui registry.npmjs.org, pypi.org, crates.io, github.com. Qualquer coisa que não esteja na lista recebe um 403 — mesmo se o script pós-instalação do pacote tentar telefonar para casa.
# Apenas alcança npmjs.org e seus CDNs — nada mais
cordon run --net=allow -- npm install
# Adicione um domínio para um registro privado
cordon run --net=allow --domain my.internal.registry -- npm install
Opcionalmente, adicione um filtro de chamadas de sistema:
# Bloqueia ptrace, kexec_load, mount, perf_event_open, process_vm_*
cordon run --seccomp basic --net=allow -- npm install
# Lista de permissões estrita — apenas chamadas de sistema conhecidamente seguras
cordon run --seccomp strict -- python3 untrusted.py
Esta é uma segunda linha de defesa. Mesmo que algo consiga escapar da restrição do sistema de arquivos, ainda não pode chamar ptrace para anexar a outro processo ou perf_event_open para trabalho de canal lateral.
git clone https://github.com/LORDv1shnu/Cordon
cd Cordon
bash install.sh # compila binário de release → ~/.local/bin/cordon
Ou manualmente:
cargo build --release
cp target/release/cordon ~/.local/bin/
Você precisa ter o bubblewrap instalado:
sudo apt install bubblewrap # Ubuntu/Debian
sudo dnf install bubblewrap # Fedora
sudo pacman -S bubblewrap # Arch
Primeira execução após a instalação:
cordon scan # escaneia seu sistema uma vez, leva ~30s, escreve ~/.config/cordon/system.toml
cordon check # verificação de sanidade — garante que está tudo pronto
# O básico
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 # irrestrito (sem filtragem)
# Seccomp
cordon run --seccomp basic --net=allow -- npm install
# Aplicativos GUI
cordon run --gui -- code .
cordon run --gui --optional audio_pipewire --optional dbus_session -- discord
# Perfis embutidos (pré-configurados para runtimes comuns)
cordon run --profile node -- npm install
cordon run --profile python -- python3 script.py
cordon run --profile rust -- cargo build
# Depurar o que está sendo bloqueado
cordon run --trace -- node server.js # wrapper strace, reporta caminhos negados
cordon add --from-trace ~/.config/cordon/logs/last-trace.log # adiciona em lote caminhos ausentes
# Limites de recursos (precisa de systemd)
cordon run --mem 512M --cpu 2.0 --timeout 60 -- npm install
# Teste / verboso
cordon run --dry-run -- npm install # imprime o comando bwrap, não executa
cordon run --verbose -- npm install # imprime cada argumento bwrap conforme executa
cordon.toml)cordon init # detecta automaticamente Cargo.toml / package.json / pyproject.toml
cordon set --net=allow # persiste flags para não digitá-las toda vez
cordon add /caminho/para/assets --mode ro # expõe caminhos extras no sandbox
cordon edit # abre cordon.toml no $EDITOR
cordon check # verificação de saúde: bwrap, namespaces, AppArmor, módulos
cordon doctor # mais profundo: versão do kernel, peculiaridades da distro, sugestões de correção exatas
cordon status # mostra o que está em system.toml agora
cordon list # mostra cada montagem que estaria ativa na próxima execução
cordon log --errors # tail do log da última execução, apenas erros
cordon syscalls --preset basic # lista o que cada predefinição seccomp bloqueia
# Perfis nomeados (armazenados em ~/.config/cordon/profiles.toml)
cordon profile create ci-node --net=allow --optional ld_so_cache
cordon run --profile ci-node -- npm test
# Arquivo de bloqueio para ambientes reproduzíveis
cordon lock update # SHA-256 de todos os caminhos de montagem → cordon.lock
cordon lock verify # verifica se nada se desviou
# Compartilhe a configuração do sandbox com a equipe
cordon export > sandbox.json
cordon import sandbox.json
# Completions de tabulação
cordon completions zsh > ~/.zfunc/_cordon
# Wrappers transparentes — faz "npm" sempre rodar em sandbox
cordon wrap npm
cordon wrap pip
npm install # na verdade executa: cordon run -- npm install "$@"
cordon unwrap npm
# Página de manual
cordon man | man -l -
Existem quatro arquivos de configuração, aplicados em ordem:
Flags da CLI sempre vencem. cordon.toml supera um perfil nomeado. O core.toml embutido do binário não pode ser tocado em tempo de execução.
Mesma convenção que bwrap e o shell.
Cordon não é um container, nem um antivírus, nem um substituto para SELinux ou AppArmor. Ele restringe a visibilidade do sistema de arquivos e o acesso à rede — não tenta detectar malware. Se algo tiver uma exploração de kernel, conseguirá escapar. O objetivo é tornar os ataques à cadeia de suprimentos significativamente mais difíceis, não impossíveis.
Além disso: atualmente apenas Linux x86_64 e aarch64. bubblewrap é necessário.
Construído em Rust. Usa bubblewrap para particionamento de namespaces, seccompiler para compilação de filtros BPF, clap para CLI, tracing para registro estruturado. O proxy de filtragem de domínio é escrito do zero em Rust puro (nenhuma ferramenta de proxy externa).
→ COMMANDS.md — referência completa de flags
→ SCANNER_LOGIC.md — como o scanner do sistema funciona
→ MODULE_INFO.md — cada arquivo fonte explicado
Construído com assistência de IA (Gemini). Arquitetura, modelo de segurança e decisões de design são de responsabilidade do autor.
| Ataque | O que fez |
|---|
| LiteLLM (2024) | Pacote PyPI malicioso leu chaves SSH e variáveis de ambiente no pip install |
| xz-utils (2024) | Backdoor em tempo de compilação injetado durante a etapa make da instalação |
| event-stream (npm, 2018) | Pacote npm comprometido roubou carteiras Bitcoin silenciosamente |
| SolarWinds | Ataque à cadeia de suprimentos através do pipeline de construção/atualização |
| Camada | Onde | Quem escreve |
|---|
core.toml | compilado no binário | não editável em tempo de execução (à prova de violação) |
system.toml | ~/.config/cordon/ | cordon scan |
profiles.toml | ~/.config/cordon/ | cordon profile create |
cordon.toml | diretório do projeto | cordon init / cordon set / cordon add |
| Código | Significado |
|---|
| 0 | sucesso |
| 1 | erro interno do cordon |
| 2 | uso incorreto da CLI |
| 125 | falha na configuração do sandbox (bwrap ausente, etc.) |
| 126 | comando encontrado mas não executável dentro do sandbox |
| 127 | comando não encontrado dentro do sandbox |
| N | encaminhado do processo em sandbox |