Repository navigation
[security][tools] 書き込み隔離(1a)の後続:workflow の子 node の隔離の記録・mktemp の案内・run の一時ディレクトリの後片付け・文書の追記 #659
Copy link
Copy link
Closed
Description
背景
#655(#502 の第 1 段 a)で、モデルの Bash と検証・受け入れのコマンドの書き込みを macOS の Seatbelt で隔離しました。merge 前レビュー(H-23、2026-10-11、merge 可・blocker 0)で、blocker ではない後続の論点がいくつか出ました。この Issue は、そのうち 1a の範囲の近くで直せるものをまとめます。#655 の merge が前提です。
問題
- workflow の子 node が親の隔離の設定を使い回す:隔離の設定は、プロセスで 1 回、run の開始時に親のワークスペースで設定されます。workflow の子 node は同じプロセスの中で別の設定(
--originのワークスペース)で走りますが、設定し直しません。--originが--workspaceと違うと、子 node は親のワークスペースに書け、origin の中には書けず、event は applied=true のままです。既定(origin とワークスペースが同じ)では起きません。 - 裸の
mktempが macOS のautoで失敗する:macOS のユーザーごとの一時ディレクトリは隔離の許可の外なので、引数なしのmktempが EPERM で失敗します。文書には書いてありますが、モデルは失敗の理由を知らずに試し直します。 - run の一時ディレクトリが消えない:隔離の設定は、run ごとに state-dir の下に一時ディレクトリを作りますが、終了時に消しません。
--doctorや--runsのような読み取りだけの action でも作ります。 - 文書の不足:runtime の依存の導入(setup.py・npm の postinstall を実行する)が隔離の外であること、run の前からワークスペースにある hardlink(外の inode を指す)を通した書き込みは隔離で止まらないこと(Seatbelt は path で判定するため)が、SECURITY.md の「What remains lexical-only」に書かれていません。
- 適用の試験の 1 本が target の位置に依存する:ignored の
applied_cargo_build_succeedsは、fixture の crate が親の workspace に入っていると判定される配置(target が checkout の下)で失敗します。
対処の方向
- 1:workflow の子 node の実行の前に、子のワークスペースで設定し直すか、親のワークスペースと違うときは
bash_sandbox_statusを applied=false(理由つき)で出し、requiredでは失敗させる。どちらを採るかは着手時に決め、「隔離した」と記録しながら別のワークスペースで走る状態を無くす。新しいコードは葉のモジュールに置き、成長上限の対象のファイルは変えない。 - 2:隔離が適用されている run で、Bash の失敗の要約が一時ディレクトリの EPERM を含むとき、「
mktemp -p "$TMPDIR"を使う」という案内を足す。判定や許可は変えない。 - 3:run の終了時(成功・失敗・中断)に、その run の一時ディレクトリを消す。読み取りだけの action では隔離の設定と一時ディレクトリの作成を飛ばす。
- 4:SECURITY.md の「What remains lexical-only」に 2 点を足す(日本語の文書があれば合わせる)。依存の導入を隔離の中に入れるのは [security][tools]
--offlineの外向きの通信を OS の隔離で遮断し、runtime の依存の導入を隔離の中で動かす(第 3 段) #658 で扱う。 - 5:fixture の crate の manifest に空の workspace の節を足し、target の位置に依存しないようにする。
受け入れ条件
-
--originが--workspaceと違う workflow の子 node で、「隔離した」と記録されたまま、記録と違うワークスペースで Bash が走ることが無い。試験で固定する(macOS の適用の試験、tempdir の fixture)。 - 既定(origin とワークスペースが同じ)の workflow の挙動と記録が今と同じである。
- 隔離の中で裸の
mktempが失敗したとき、Bash の結果の要約にmktemp -p "$TMPDIR"の案内が入る。隔離が無いときと、ほかの失敗では入らない。 - run の終了時(成功・失敗・中断)に、その run の一時ディレクトリが残らない。読み取りだけの action では作られない。
- 文書に、依存の導入が隔離の外であることと、事前にある hardlink の限界が書かれている。
- ignored の適用の試験が、target が checkout の下にある配置でも通る。
- 字句検査と隔離の profile を緩めていない。event の既存の名前と schema を変えていない。
- 既存の検証・受入・証跡・リリースゲートを緩めていない(AGENTS.md の honest-failure 方針)。
- 成長上限の baseline を引き上げていない。成長上限の対象のファイル(「参照」の一覧)を変えていない。
-
cargo fmt --all -- --check・cargo clippy --all-targets -- -D warnings・cargo testが通る。
対象ファイル
src/tools/os_sandbox.rssrc/tools/os_sandbox/seatbelt.rssrc/tools/bash.rssrc/lib.rssrc/workflow/orchestrator.rstests/issue502_os_sandbox_write.rsSECURITY.md
参照
- 成長上限の対象のファイル:
src/planner/runner.rs・src/minimal_loop/loop_run.rs・src/minimal_loop/loop_run/runtime_bash_effects.rs(変えない) - 依存の導入の起動点:
src/minimal_loop/dependency_setup.rs(この Issue では変えない。[security][tools]--offlineの外向きの通信を OS の隔離で遮断し、runtime の依存の導入を隔離の中で動かす(第 3 段) #658 で扱う) - merge 前レビューの記録:ローカルの workspace/tmp/1007/wave1/results/H-23/report.md の 6 章(a・b・c・f・g)
根拠(#655 の review head 36d0b3eb)
- プロセス全体の設定:
src/tools/os_sandbox.rs:190(install) - workflow の子 node の実行:
src/lib.rs:209(run_resolved_config_for_workflow)、src/workflow/orchestrator.rs:19 - 「What remains lexical-only」:
SECURITY.md:66
関連(参考)
- [security][tools] Bash と検証コマンドの書き込みを OS の隔離で閉じ込める(第 1 段 a:macOS の Seatbelt と共通の土台) #655(前提)、[security][tools] Bash の字句検査では、プログラム経由の間接書き込みや検証コマンドの副作用を閉じ込められない #502(親)、[security][tools] Bash と検証コマンドの書き込みを Linux の landlock で閉じ込める(第 1 段 b) #656(
--sandboxの公開)、[security][tools]--offlineの外向きの通信を OS の隔離で遮断し、runtime の依存の導入を隔離の中で動かす(第 3 段) #658(依存の導入の隔離)
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels
Activity
Merge pull request #665 from Kewton/feature/issue-659-security-tools-…
Kewton commentedon Oct 13, 2026
PR #665 で develop に merge しました(merge commit fe9cc7a、CI・acceptance success)。H-25 の P1(cleanup 後に required で素通し)も同じ PR で修正済みです。