Skip to content

[security][tools] Bash と検証コマンドの書き込みを Linux の landlock で閉じ込める(第 1 段 b) #656

Closed

Description

@Kewton

背景

#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 では入れられません。

設計(決定)

  1. landlock の backend:landlock crate を足します。ruleset の作成と、許可する場所の fd を開くのは親で行い、子の pre_exec の中では prctl(PR_SET_NO_NEW_PRIVS) と landlock_restrict_self の 2 つの syscall だけを呼びます(fork の後に確保や lock をしない)。プロセスグループの設定と同居します。
  2. 許可する場所:1a と同じです(ワークスペース・run の一時ディレクトリ・null や tty 等のデバイス・判断 2 のキャッシュ)。Linux のキャッシュの場所は「参照」。読み取りとネットワークは変えません(landlock の handled access に読み取りを入れない)。
  3. 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 回だけ確かめます。
  4. GUI の delegate を required にする(判断 1):delegate が起動する commandagent に --sandbox required を渡します。隔離が使えない環境(入れ子の sandbox 等)で GUI を動かすと、Bash と検証が bash_sandbox_unavailable で止まることを GUI の文書に書きます。
  5. 字句検査は変えません。

規模の見積り

  • 新規: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.toml
  • Cargo.lock
  • src/tools/os_sandbox.rs
  • src/tools/os_sandbox/landlock.rs(新規)
  • src/bin/gui_server/delegate.rs
  • src/cli.rs
  • docs/guide/README.md
  • tests/issue502_os_sandbox_write.rs
  • SECURITY.md
  • docs/guide/ja/cli-reference.md
  • docs/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 は未確認)

関連(参考)

Activity

  1. added a commit that references this issue on Oct 13, 2026
  2. Kewton commented on Oct 13, 2026

    @Kewton
    OwnerAuthor

    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 の文書)は別途扱います。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions