Repository navigation
[tools] Bash の cd の行き先が決められないとき、コマンドの名前まで読み取りとして数え、普通のコマンドを誤って拒否する(#568 のレビューで発見) #580
Copy link
Copy link
Closed
Labels
enhancementNew feature or requestNew feature or request
Description
背景
#568(PR #579)の直した箇所の再確認(2026-10-03、H-03)で見つかった誤拒否です。どちらも拒否が増える側(厳しい側)で、安全性には関係しません。記録に残る agent の Bash コマンドでは、相対の cd・CDPATH・DIRSTACK を使うものは 0 件なので、今は起きにくい形です。判定の関数を呼んで確かめただけです。
問題
-
決められない状態では、コマンドの名前も読み取りの語として数える
[security][tools] Bash の書き込み検査が同じコマンドの cd・pushd の後の cwd を追わず、symlink を通ってワークスペース外へ書き込める(#509 の調査で発見) #568 は、cd・pushd の行き先が決められないとき(CDPATH・DIRSTACK が出る、cd とループ・関数の組み合わせ、候補が 64 を超える)、2 段目で相対の読み取りの語が 1 つでもあれば拒否します。このとき、ファイルを指さない語(コマンドの名前、予約語、option)まで読み取りの語として数えるため、ほぼすべてのコマンドが拒否されます。入力(例) 今の判定 望ましい判定 CDPATH= cd sub && cargo test拒否 許可(相対のファイルを読まない) for d in a b; do (cd sub && cargo test); done拒否 許可 cd を 7 つ重ねた後の tee $ROOT/a.txt拒否 許可(絶対 path は root の中) CDPATH=sub cd link && cat secret拒否 拒否のまま -
語の一部に DIRSTACK を含むだけで決められないとする
cd sub && echo MYDIRSTACKは拒否されます。CDPATH も同じく部分一致です。
根拠(PR #579 の HEAD 175b61da。merge 後は develop の同じ箇所)
- src/tools/bash.rs:807-815(決められない場合、relative_words が空でなければ拒否)
- src/tools/bash_write_guard/working_directory.rs:93-96(
word.contains("CDPATH")・word.contains("DIRSTACK"))
対処の方向(案。着手前に設計を決める)
- 決められない場合の読み取りの語から、各 segment の program の語(前置きを剥がした後の先頭)、予約語、
-で始まる option を除く。ファイルを読みうる語だけを数える。 - CDPATH・DIRSTACK は、代入の名前(
NAME=・NAME[i]=・NAME+=)、declare・export・read・unsetなどに渡す名前、$NAME・${NAME…}の参照として現れる場合に限る。ただし、名前を引用や\で分けた形("DIR"STACK[1]=・DIR\STACK[1]=)は、[security][tools] Bash の書き込み検査が同じコマンドの cd・pushd の後の cwd を追わず、symlink を通ってワークスペース外へ書き込める(#509 の調査で発見) #568 と同じく拒否のままにする(字句解析の後の語で判定する)。 - 見逃しを増やさないこと:[security][tools] Bash の書き込み検査が同じコマンドの cd・pushd の後の cwd を追わず、symlink を通ってワークスペース外へ書き込める(#509 の調査で発見) #568 の H-02・H-03 の probe の表で、拒否だった形が 1 つも許可にならないこと。
受け入れ条件
- 上の表の「望ましい判定」どおりになる。
cd sub && echo MYDIRSTACKは許可になる - [security][tools] Bash の書き込み検査が同じコマンドの cd・pushd の後の cwd を追わず、symlink を通ってワークスペース外へ書き込める(#509 の調査で発見) #568 の H-02・H-03 の probe の表を流し直し、拒否から許可に変わる形が上の誤拒否の形だけである
- 直す前の develop で新しいテストが失敗し、直した後で通ることを記録した(二点測定)
- 既存の検証・受入・証跡・リリースゲートを緩めていない(AGENTS.md の honest-failure 方針)
- 成長上限(docs/dev/dev-guardrails.md)の baseline を引き上げていない
関連(参考)
- [security][tools] Bash の書き込み検査が同じコマンドの cd・pushd の後の cwd を追わず、symlink を通ってワークスペース外へ書き込める(#509 の調査で発見) #568(cd の後の作業場所)、[security][tools] Bash の字句検査では、プログラム経由の間接書き込みや検証コマンドの副作用を閉じ込められない #502(字句検査の限界)
- レビュー:workspace/tmp/1003/issue-568/results/H-03/report.md の「後続の論点」2・3、probe はローカルの /Volumes/SSD_NX/tmp/issue-568-20261003-01/probe-h03
対象ファイル(2026-10-17 追記。develop 61cd5afa で再確認)
src/tools/bash.rs(決められない場合の拒否::862-876)src/tools/bash_write_guard/working_directory.rs(word.contains("CDPATH")・word.contains("DIRSTACK")::219-222)tests/issue580_bash_undecidable_read_words.rs(新規)
進め方の注意(2026-10-17 追記)
#568・#635・#643 の既存の試験(tests/issue568_bash_cwd_write_targets.rs・tests/issue635_bash_glob_cd_destination.rs ほか)は変えない。変える必要が出たら、着手を止めて PM に返す。
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
enhancementNew feature or requestNew feature or request
Activity
Merge pull request #691 from Kewton/feature/issue-580-tools-bash-cd-568
Kewton commentedon Oct 17, 2026
PR #691 で merge しました(develop
6f86b0cb、CI・acceptance・Next.js domain oracles すべて success)。cd・pushdの 2 段目の検査で、program の語・予約語・単純な option・cargo の最初の subcommand を読み取りの語として数えないようにしました。MYDIRSTACK・MYCDPATHのような部分一致も「決められない」にしません。for/selectの変数を含む)、DIRSTACK、読めない行き先、root の外の候補、固定点の上限超過は今どおり全語を数えます。for CDPATH in)→ 修正 → R-68b2 で blocker 0。後続の論点(non-blocker):存在しない相対の行き先を root の中と扱う点、
popd・pushd +Nを候補にしない点、裸のCDPATHの語がechoの引数でも拒否になる点(develop も同じ)。🤖 Generated with Claude Code