Claude Codeの公式Changelogをリリースから最速で翻訳・解説しています。
v2.1.251 で、権限チェックを通った後に差し替えられた symlink を Read / Write / Edit が追ってしまう問題が直りました。承認した場所の外を読み書きできる経路です。Grep と Glob が symlink 越しに Read(...) の deny ルールを無視していた件も、同じ回で塞がりました。
| 変更 | 影響範囲 |
|---|---|
| 権限チェックをすり抜ける経路の修正 | ファイルツール / Grep / Glob / Workflow / plugin / Bash |
プロジェクト設定の env から CLAUDE_CONFIG_DIR などが外れる |
リポジトリ側で環境変数を配っていた設定 |
PreModelSwitch / PostModelSwitch hook の追加 |
モデル切り替えを止めたい hook 運用 |
/cost のプロンプトキャッシュ行 |
キャッシュのヒット率と再キャッシュ量 |
承認の後ろで symlink が差し替わる
検査したパスと、実際に開くパスがずれていました。 Read / Write / Edit は作業ディレクトリ内のパスを検査して通した後、そのパスを開き直します。検査から実行までの間に作業ディレクトリ内の symlink が別の場所を指すよう差し替わると、Claude Code は承認済みの範囲外を読み書きできていました。v2.1.251 でこの追従が止まります。
Grep と Glob 側も同じリリースで直りました。検索パスが symlink の場合、Grep と Glob はその先のファイルに Read(...) の deny ルールを適用していませんでした。deny で特定ディレクトリを外していても、symlink を張った経路からは中身が読めた形です。
permissions の deny に Read(...) ルールを書いていた環境では、v2.1.250 以前の Grep / Glob が symlink 経由でその中身を返していました。
権限チェックの外側にあった経路
symlink 以外にも、権限チェックの前や外でファイルを開いていた箇所が v2.1.251 で塞がりました。
| 対象 | v2.1.250 以前の挙動 |
|---|---|
| Workflow ツール | 権限チェック前に scriptPath を読み、エラー文にその中身を引用していた |
| plugin コマンド | marketplace エントリの宣言でプラグインディレクトリの外を指せた |
| Bash 権限チェック | 整数変数への算術式代入 (OPTIND=1/0、RANDOM=2+2) を自動承認していた |
| サンドボックス内の Bash | Bash コマンドの出力ファイルをリダイレクトや差し替えで書き換えられた |
plugin コマンドは path traversal エラーとして弾かれるようになり、Bash の算術代入は承認プロンプトに回ります。
プロジェクト設定でできることが減る
プロジェクトの .claude/settings.json の env は、CLAUDE_CONFIG_DIR、CLAUDE_CODE_TMPDIR、TMPDIR / TMP / TEMP を設定しなくなりました。指定先はシェル、ユーザー設定、managed settings に移りました。
Claude Code はプロジェクト設定からの詳細ベータトレースと生の API ボディログの有効化も受け付けなくなりました。managed settings やホストアプリが OTLP コレクタを固定していても、より低いスコープのベータトレース送信先がそれを迂回していました。v2.1.251 でこの迂回も塞がります。
サンドボックスの TLS 終端、通信の自前プロキシ経由、資格情報の注入、分離の弱化。この 4 種に触れるサーバー管理の設定は、適用前に承認を挟むようになりました。ANTHROPIC_CUSTOM_HEADERS も承認対象に入りました。managed 設定やプロジェクト設定から Authorization や Host のような資格情報・ルーティング系のヘッダを設定する場合が該当します。
モデル切り替えに hook が挟まる
新しい hook イベントは PreModelSwitch と PostModelSwitch。モデルの切り替えをブロックする、確認を出す、注記を付けるのいずれかを hook から指定できます。SessionStart の resume hook は、セッションの陳腐化と再キャッシュの推定コストを受け取るようになりました。
CLAUDE_CODE_SUBAGENT_MODEL は意味が変わりました。これまでは全部を上書きしていましたが、v2.1.251 からは既定のサブエージェントモデルの指定になりました。エージェント定義の model: と spawn 時の明示指定が、こちらより優先されます。/effort はモデルごとに既定値を保存する形に変わり、モデルを切り替えても各モデルの設定が残ります。
Opus 5 で effort を xhigh / max にしたまま thinking を切ると「effort … is not supported when thinking is disabled」で失敗していた不具合も直りました。この場合、Claude Code は effort を high として送ります。
/cost と /usage に増えた行
/cost にセッション単位のプロンプトキャッシュ行が入りました。ヒット率、ミス数、再キャッシュしたトークン数、warm / cold の別が並びます。ステータスラインのスクリプトからは prompt_cache オブジェクトで同じ値を読めます。
/usage 側には Spend limit バーが追加されました。支出上限付きの Claude apps ゲートウェイを経由する開発者が対象で、ステータスラインからは rate_limits.spend_limit で読めます。フォアグラウンドのサブエージェントは、ツール呼び出しと結果が Remote Control クライアントへライブで流れるようになりました。既定のバックグラウンドサブエージェントは、従来どおりステータスだけを表示します。
v2.1.251 の重心
v2.1.251 は権限チェックの取りこぼしと設定経由の権限拡大に手を入れた回で、新機能はモデル切り替え hook とコスト表示の追加にとどまりました。バイナリは約 5 MB 縮み、うち 2.5 MB は 1c / gml / isbl / mathematica / maxima / sqf のシンタックスハイライト削除分です。
前回: Claude Code v2.1.248〜v2.1.250|実行系ツールを丸ごと外す --restricted|毎日Changelog解説