Skip to content

[security][tools] 書き込み隔離(1a)の後続:workflow の子 node の隔離の記録・mktemp の案内・run の一時ディレクトリの後片付け・文書の追記 #659

Closed

Description

@Kewton

背景

#655(#502 の第 1 段 a)で、モデルの Bash と検証・受け入れのコマンドの書き込みを macOS の Seatbelt で隔離しました。merge 前レビュー(H-23、2026-10-11、merge 可・blocker 0)で、blocker ではない後続の論点がいくつか出ました。この Issue は、そのうち 1a の範囲の近くで直せるものをまとめます。#655 の merge が前提です。

問題

  1. workflow の子 node が親の隔離の設定を使い回す:隔離の設定は、プロセスで 1 回、run の開始時に親のワークスペースで設定されます。workflow の子 node は同じプロセスの中で別の設定(--origin のワークスペース)で走りますが、設定し直しません。--origin が --workspace と違うと、子 node は親のワークスペースに書け、origin の中には書けず、event は applied=true のままです。既定(origin とワークスペースが同じ)では起きません。
  2. 裸の mktemp が macOS の auto で失敗する:macOS のユーザーごとの一時ディレクトリは隔離の許可の外なので、引数なしの mktemp が EPERM で失敗します。文書には書いてありますが、モデルは失敗の理由を知らずに試し直します。
  3. run の一時ディレクトリが消えない:隔離の設定は、run ごとに state-dir の下に一時ディレクトリを作りますが、終了時に消しません。--doctor や --runs のような読み取りだけの action でも作ります。
  4. 文書の不足:runtime の依存の導入(setup.py・npm の postinstall を実行する)が隔離の外であること、run の前からワークスペースにある hardlink(外の inode を指す)を通した書き込みは隔離で止まらないこと(Seatbelt は path で判定するため)が、SECURITY.md の「What remains lexical-only」に書かれていません。
  5. 適用の試験の 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.rs
  • src/tools/os_sandbox/seatbelt.rs
  • src/tools/bash.rs
  • src/lib.rs
  • src/workflow/orchestrator.rs
  • tests/issue502_os_sandbox_write.rs
  • SECURITY.md

参照

根拠(#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

関連(参考)

Activity

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

    @Kewton
    OwnerAuthor

    PR #665 で develop に merge しました(merge commit fe9cc7a、CI・acceptance success)。H-25 の P1(cleanup 後に required で素通し)も同じ PR で修正済みです。

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