
Linux上で制限されたファイルシステムビュー内で任意のコマンドを実行する
⚠️ プロジェクト非推奨
本プロジェクトの開発は停止しています。同じアイデアに取り組み、より良いソリューションを構築した別の開発者がいたためです。
代わりに以下を強くお勧めします: Fence by 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 モードは、ランダムな localhost ポート上で組み込みの Rust HTTP/HTTPS プロキシを起動し、環境変数(HTTP_PROXY、https_proxy、npm_config_proxy など)を介してサンドボックスに注入します。CONNECT トンネルをインターセプトし、転送前に許可リストに対して各ドメインをチェックします。
デフォルトの許可リストには registry.npmjs.org、pypi.org、crates.io、github.com が含まれます。リストにないものは、たとえパッケージの postinstall スクリプトがホームに電話しようとしても、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 # リリースバイナリをビルド → ~/.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
# タブ補完
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 -
4つの設定ファイルがあり、順に適用されます:
CLI フラグは常に優先されます。cordon.toml は名前付きプロファイルより優先されます。バイナリ組み込みの core.toml は実行時に変更できません。
bwrap およびシェルと同じ規則です。
Cordon はコンテナでも、ウイルス対策ソフトでも、SELinux や AppArmor の代替でもありません。ファイルシステムの可視性とネットワークアクセスを制限するものであり、マルウェアを検出しようとするものではありません。カーネルの脆弱性を持つものがあれば、突破されるでしょう。目標はサプライチェーン攻撃をかなり困難にすることであり、不可能にすることではありません。
また、現在は Linux x86_64 と aarch64 のみ対応です。bubblewrap が必要です。
Rust で構築。名前空間には bubblewrap、BPF フィルターコンパイルには seccompiler、CLI には clap、構造化ログには 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 パッケージが 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 | サンドボックス化されたプロセスから転送 |