⚠️ 项目已弃用
该项目的开发已停止,因为其他人也在做同样的想法,并且构建了更好的解决方案。
我们强烈推荐查看:Fence by Use-Tusk。注意:此仓库最初是为 FOSS HACK 2026 创建的,但我们不幸未能及时完成。
然而,我们为 Hackathena '26 构建了一个类似的项目,并获得了 三等奖!
如果您有兴趣,可以在此处找到该仓库: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 响应——即使包的后安装脚本试图回传信息。
# 仅能访问 npmjs.org 及其 CDN——其他都不行
cordon run --net=allow -- npm install
# 为私有仓库添加域名
cordon run --net=allow --domain my.internal.registry -- npm install
可选地添加系统调用过滤器:
# 阻止 ptrace、kexec_load、mount、perf_event_open、process_vm_*
cordon run --seccomp basic --net=allow -- npm install
# 严格允许列表——仅允许已知安全的系统调用
cordon run --seccomp strict -- python3 untrusted.py
这是第二道防线。即使有东西突破了文件系统限制,它仍然无法调用 ptrace 来附加到另一个进程,或使用 perf_event_open 进行侧信道攻击。
git clone https://github.com/LORDv1shnu/Cordon
cd Cordon
bash install.sh # 构建 release 二进制文件 → ~/.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 # 扫描你的系统一次,大约需要 30 秒,写入 ~/.config/cordon/system.toml
cordon check # 完整性检查——确保一切就绪
# 基本用法
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 # 无限制(不过滤)
# Seccomp
cordon run --seccomp basic --net=allow -- npm install
# GUI 应用
cordon run --gui -- code .
cordon run --gui --optional audio_pipewire --optional dbus_session -- discord
# 内置配置文件(为常见运行时预配置)
cordon run --profile node -- npm install
cordon run --profile python -- python3 script.py
cordon run --profile rust -- cargo build
# 调试被阻止的内容
cordon run --trace -- node server.js # strace 包装器,报告被拒绝的路径
cordon add --from-trace ~/.config/cordon/logs/last-trace.log # 批量添加缺失的路径
# 资源限制(需要 systemd)
cordon run --mem 512M --cpu 2.0 --timeout 60 -- npm install
# 干运行 / 详细模式
cordon run --dry-run -- npm install # 打印 bwrap 命令,但不执行
cordon run --verbose -- npm install # 运行时打印每个 bwrap 参数
cordon.toml)cordon init # 自动检测 Cargo.toml / package.json / pyproject.toml
cordon set --net=allow # 持久化标志,这样你就不必每次都输入
cordon add /path/to/assets --mode ro # 将额外的路径暴露到沙箱中
cordon edit # 在 $EDITOR 中打开 cordon.toml
cordon check # 健康检查:bwrap、命名空间、AppArmor、模块
cordon doctor # 深入:内核版本、发行版怪癖、确切的修复建议
cordon status # 显示 system.toml 中当前的内容
cordon list # 显示下次运行时将要激活的所有挂载点
cordon log --errors # 仅显示上次运行的日志错误
cordon syscalls --preset basic # 列出每个 seccomp 预设阻止的内容
# 命名配置文件(存储在 ~/.config/cordon/profiles.toml)
cordon profile create ci-node --net=allow --optional ld_so_cache
cordon run --profile ci-node -- npm test
# 用于可重现环境的锁定文件
cordon lock update # 对所有挂载路径进行 SHA-256 哈希 → cordon.lock
cordon lock verify # 检查是否有任何偏离
# 与团队共享沙箱配置
cordon export > sandbox.json
cordon import sandbox.json
# Tab 补全
cordon completions zsh > ~/.zfunc/_cordon
# 透明包装器——使 "npm" 始终在沙箱中运行
cordon wrap npm
cordon wrap pip
npm install # 实际上运行:cordon run -- npm install "$@"
cordon unwrap npm
# 手册页
cordon man | man -l -
有四个配置文件,按顺序应用:
CLI 标志始终优先。cordon.toml 胜于命名配置文件。二进制内置的 core.toml 在运行时无法修改。
与 bwrap 和 shell 相同的约定。
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 包在 pip install 时读取 SSH 密钥和环境变量 |
| xz-utils (2024) | 在安装期间通过 make 步骤注入构建时后门 |
| event-stream (npm, 2018) | 被攻陷的 npm 包静默窃取比特币钱包 |
| 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 | 从沙箱进程转发而来 |