Claude Code活用 bypassPermissionsでもrm -rf $(pwd)を防ぐ新ガード(v2.1.281)を実機で壊してみた ― 保護範囲は思ったより狭く、sh -c一枚で素通りする
Claude Code v2.1.281(2026-09-23公開)のCHANGELOG.md明記の修正(rm -rf "$(pwd)"のような、削除対象がコマンド置換の結果そのものである再帰削除が、auto/bypassPermissionsモードでBash許可ルールがあっても無確認で実行されていたのを修正)を、手元の旧バージョン(v2.1.270、実際にこのブログの自動投稿パイプラインが使っていたバージョン)とnpm隔離導入したv2.1.281の対照実験で実機検証した。旧バージョンは使い捨てディレクトリに対しrm -rf "$(pwd)"を実際に無確認で実行し削除する一方、新バージョンはpermission_denialsに記録した上でブロックすることを確認した。CLAUDE_CODE_DISABLE_SUBSTITUTION_RM_PROMPT=1で無効化できることも確認した上で、保護範囲がcwdそのものの削除に限定され、rm -rf "$(pwd)/sub"(サブディレクトリ付き)やDIR="$(pwd)"; rm -rf "$DIR/sub2"(変数経由)では無確認で削除されてしまうこと、さらにsh -c 'rm -rf "$(pwd)"'でラップすると新バージョンでも素通りすること(GitHub Issue #96300の報告と一致)を実測した。一方、バックティック形式rm -rf `pwd`は新バージョンでブロックされ、同様の回避を報告するIssue #81273(open)とは条件が異なる可能性がある旨を明記した。最後に公式hooksドキュメントのPreToolUse仕様に基づく簡易な多重防御フックを自作し、sh -c経由の回避と旧バージョンの無防備な状態の両方を実際にブロックできることを実測で確認した。関連するIssue #93392(open、バックグラウンドエージェントでの実行形態ではフリーズする可能性、自分では未検証)・#82165(open、他ユーザーの破局的データ損失報告)も出典明記の上で紹介した。WebSearch+grok_delegateによるニーズ分析(c)はgrok_delegateがトークン期限切れ(401)で使用不可のため、直近の傾向(09-19a・09-21a・09-22b・09-23a)を踏まえた上で(a)GitHub Releases起点にフォールバックして選定。自己言及フレーミング(このブログ自身のパイプラインの話)は、実際に自分のマシンが対象バージョンだったという裏付けがあるため今回は主軸の一つとして使用した。