Repository navigation
[security][tools] Bash と検証コマンドの書き込みを Linux の landlock で閉じ込める(第 1 段 b) #656
Description
背景
#502 の第 1 段 b です(#502 の「設計の決定」の節、2026-10-11 承認)。1a で作る隔離の葉モジュールに、Linux の backend として landlock を足します。landlock は非特権で使え、user namespace(bubblewrap が要る)に依存しません。
H-18 の設計調査では、Linux の landlock の試作はできていません(docker の volume mount が応答せず中断)。ubuntu の CI の runner の kernel と landlock の ABI、コンテナの中の seccomp が landlock を通すかも未確認です。この Issue の受け入れ条件で確かめます。
問題
- 1a の後も、Linux(CI、Linux の利用者)では隔離が「未適用(backend なし)」になり、Bash と検証コマンドの間接の書き込みは字句検査だけで守られます。
- GUI の delegate を
requiredにする判断 1 は、Linux の backend が無いと Linux の GUI を止めてしまうため、1a では入れられません。
設計(決定)
- landlock の backend:
landlockcrate を足します。ruleset の作成と、許可する場所の fd を開くのは親で行い、子のpre_execの中ではprctl(PR_SET_NO_NEW_PRIVS)とlandlock_restrict_selfの 2 つの syscall だけを呼びます(fork の後に確保や lock をしない)。プロセスグループの設定と同居します。 - 許可する場所:1a と同じです(ワークスペース・run の一時ディレクトリ・null や tty 等のデバイス・判断 2 のキャッシュ)。Linux のキャッシュの場所は「参照」。読み取りとネットワークは変えません(landlock の handled access に読み取りを入れない)。
- ABI の扱い:ABI1(kernel 5.13)を必須とし、ABI2(5.19、別ディレクトリ間の link・rename)と ABI3(6.2、truncate)は best-effort で使います。
- ABI1 未満・無効化・seccomp で拒否されたときは「未適用」と理由を返し、1a のモードの規則(
autoは字句検査だけで続け、requiredは失敗)に従います。 - ABI2・ABI3 が無い kernel では、閉じない操作(外の inode への hardlink、truncate)を
bash_sandbox_statusの reason に書きます。 - 利用可否は run の開始時に、ABI の問い合わせで 1 回だけ確かめます。
- ABI1 未満・無効化・seccomp で拒否されたときは「未適用」と理由を返し、1a のモードの規則(
- GUI の delegate を
requiredにする(判断 1):delegate が起動する commandagent に--sandbox requiredを渡します。隔離が使えない環境(入れ子の sandbox 等)で GUI を動かすと、Bash と検証がbash_sandbox_unavailableで止まることを GUI の文書に書きます。 - 字句検査は変えません。
規模の見積り
- 新規:landlock の backend 約 150〜220 行。
- 配線:葉モジュールの backend の選択 約 10〜15 行、delegate の引数 1〜2 行、依存の追加 1 行。
- 試験:約 80〜150 行。新規 500 行を超えない見込みなので、分けません。
受け入れ条件
- ubuntu の CI で、1a と同じ間接書き込みの形(
sh -c・eval・xargs・python3 -c・find -exec・dd of=・sed -i、システムの一時ディレクトリへの直接の書き込み)が隔離で失敗し、tempdir の中の「外」の fixture が変わらない。 - ubuntu の CI で、外の inode への hardlink の作成が失敗する。ABI2 が無い kernel ではこの試験を外し、その旨を記録する。
- CI の runner の kernel の版と landlock の ABI を記録する(試験の出力、または PR の本文)。CI(GitHub Actions)の上で landlock が「未適用」になったときは、試験が失敗して分かるようにする(黙って外れない)。
- コンテナの中(Docker の既定の seccomp)で landlock が使えるかを 1 回確かめ、結果を記録する。使えないときは
autoが字句検査だけで続け、requiredが失敗することを確かめる。 - 隔離の中で、
mktemp・git status・cargo --version・node -e・python3 -cが成功する。依存のない crate のcargo build、キャッシュ済みの fixture のnpm ci、Next.js のnext build(fixture)、Playwright で Chromium を 1 回起動することを、CI または Linux の手元で隔離の中で試し、結果を記録する。失敗するものは対処か「隔離の中では動かない」ことを文書に書く。 - ABI1 未満を模したとき(backend の判定を差し替える単体試験)、
autoは字句検査だけで続けbash_sandbox_statusに applied=false を出し、requiredはbash_sandbox_unavailableで失敗する。 - GUI の delegate が
--sandbox requiredで起動することを試験で確かめる。 -
pre_execの中で確保や lock をしない(コードのコメントで明示し、レビューで確かめる)。 - プロセスグループでの timeout・中断の挙動が変わらない(既存の試験が通る)。
- 字句検査を緩めていない。
--sandbox offで字句検査の判定が今と同じである。 - event の既存の名前と schema を変えていない。
- 既存の検証・受入・証跡・リリースゲートを緩めていない(AGENTS.md の honest-failure 方針)。
- 成長上限の baseline を引き上げていない。成長上限の対象のファイル(「参照」の一覧)を変えていない。
-
--sandboxを公開のフラグにする(1a では隠しフラグhide = true)。docs/guide/README.mdのフラグの数(doc_drift が検査)を同じ変更で直す。1a のレビュー(H-23)の推奨。 -
cargo fmt --all -- --check・cargo clippy --all-targets -- -D warnings・cargo testが通る。
対象ファイル
Cargo.tomlCargo.locksrc/tools/os_sandbox.rssrc/tools/os_sandbox/landlock.rs(新規)src/bin/gui_server/delegate.rssrc/cli.rsdocs/guide/README.mdtests/issue502_os_sandbox_write.rsSECURITY.mddocs/guide/ja/cli-reference.mddocs/guide/en/cli-reference.md
参照
- 成長上限の対象のファイル:
src/planner/runner.rs・src/minimal_loop/loop_run.rs・src/minimal_loop/loop_run/runtime_bash_effects.rs(変えない) - 1a の葉モジュール(
src/tools/os_sandbox.rs)と試験(tests/issue502_os_sandbox_write.rs) - 判断 2 の Linux のキャッシュの場所:
~/.cargo/registry・~/.cargo/git・~/.cargo/.package-cache、~/.npm、~/.cache/pip、~/.cache/ms-playwright - landlock の ABI:1(5.13、ファイルシステム)、2(5.19、REFER)、3(6.2、TRUNCATE)、4(6.7、TCP の bind・connect)
- CI の workflow は
.github/workflows/ci.yml(この Issue では変えない。kernel と ABI の記録は試験の出力で行う)
根拠(develop d708619a)
- CI の runner は
ubuntu-latest:.github/workflows/ci.yml:16 libcは既に依存にあり、landlockは無い:Cargo.toml:37- プロセスグループ(
process_group(0)):src/bounded_process.rs:518-524。timeout・中断でのグループへの SIGTERM・SIGKILL:src/bounded_process.rs:405-425,461-480 - GUI の delegate の許可:
src/bin/gui_server/delegate.rs:37,299-300 - 設計調査の記録:ローカルの workspace/tmp/1007/wave1/results/H-18/report.md の 2 章(Linux の landlock は未確認)
関連(参考)
-
[security][tools] Bash の字句検査では、プログラム経由の間接書き込みや検証コマンドの副作用を閉じ込められない #502(親。1a と 1b の merge で閉じる)
-
1a(前提)、2:読み取り隔離、3:ネットワークと依存の導入
-
分割の Issue:1a [security][tools] Bash と検証コマンドの書き込みを OS の隔離で閉じ込める(第 1 段 a:macOS の Seatbelt と共通の土台) #655(macOS の書き込み隔離と共通の土台)、1b [security][tools] Bash と検証コマンドの書き込みを Linux の landlock で閉じ込める(第 1 段 b) #656(Linux の書き込み隔離)、2 [security][tools] Bash と検証コマンドの、home の秘密の場所の読み取りを OS の隔離で拒否する(第 2 段:読み取り隔離) #657(読み取り隔離)、3 [security][tools]
--offlineの外向きの通信を OS の隔離で遮断し、runtime の依存の導入を隔離の中で動かす(第 3 段) #658(ネットワークと依存の導入)
Activity
Merge pull request #666 from Kewton/feature/issue-656-security-tools-…
Kewton commentedon Oct 13, 2026
PR #666 で develop に merge しました(merge commit 2ab4895、CI・acceptance success)。ubuntu の runner:kernel 6.17.0-1022-azure、landlock ABI 7。レビュー H-27 の後続の論点(TIOCSTI、/dev/pts、キャッシュの symlink、降格の event、GUI の文書)は別途扱います。