Claude Code v2.1.289 — 権限ルールの抜け穴修正とmod描画の安定化
Claude Code v2.1.289は、Bashのdeny・askルールとReadのdenyルールが効かなくなる経路を塞ぎ、mod・プラグインまわりの描画クラッシュを多数修正したリリースです。
このリリースで何ができるようになるか
Claude Code v2.1.289は、新機能よりも「禁止したはずの操作が通ってしまう経路」と「mod・プラグインの描画まわりの落ち方」を直したリリースです。27項目のうち、読む前に押さえておきたい点は3つに絞れます。
- 権限ルールの抜け穴が3系統で塞がった: sandbox自動許可の下でのBashのdeny・ask、IDEでsymlink経由に選んだファイルへのReadのdeny、管理対象マシンでのmodの承認に対するdeny・ask
- 組織管理のMCPサーバーを守る範囲が広がった: ユーザーが入れたプラグインが、サインイン用ツールの説明文を書き換えられなくなった
- modの描画が壊れても、セッションごと落ちにくくなった: 高さのない領域やターミナルが知らない枠線スタイルなど、落ちる原因が個別に直っている
権限を厳密に運用している環境と、modを書く側にとっては、更新の意味がはっきりあります。ターミナルで使うだけの個人利用では、効く場面は多くありません。
あなたの開発フローはどう変わるか
denyルールとsandboxを併用している人
Bashのdenyルールやaskルールが「効いているつもりで効いていない」状態が2件直りました。どちらも、sandboxの自動許可(auto-allow)が働く構成が前提です。
1つ目は、環境変数を前置きしたコマンドです。TZ="$HOME" rm -rf buildのように、展開される値を持つ変数が先頭に付くと、その後ろのコマンドをルールが見落とすことがありました。2つ目は、FOO=barのような単独の変数代入がコマンドの前にあると、ルールの照合ごと飛ばされるケースです。
公式docsは、auto-allowの下でも明示的なdenyルールは常に守られると書いています。rmのような破壊的コマンドをdenyで止めている場合は、ルールを書き直さずに更新するだけで効き方が揃います。auto-allowの仕組みはautoAllowBashIfSandboxedの解説、同じ系統の過去の穴は拒否ルールをevalですり抜けられる問題で扱っています。
IDEとsymlinkを使う人
IDEで@メンションしたファイル、変更されたファイル、選択したファイルがsymlink経由だったとき、Readのdenyルールが適用されませんでした。denyルールは「要求されたパス」と「解決先の実体」のどちらかが一致すれば適用される仕様で、IDEから渡されるファイルにも同じ扱いが及ぶようになりました。
たとえばRead(~/.ssh/**)をdenyにしている環境で、プロジェクト内のsymlinkが鍵ファイルを指していても、IDEの選択経由で中身が読まれることはなくなります。
VS Code拡張で認証が頻繁に切れていた人
VS Codeでは、2.1.288で入ったclaude auth statusの変更を元に戻しました。この変更はサインアウトを増やした可能性があるとされています。VS Codeで再認証を求められる頻度が上がったと感じていたなら、このバージョンで戻ります。
なお、2.1.288には別の回帰があり、終了時にセッションの最後のメッセージが失われることがありました。これはv2.1.291で修正されています。2.1.288から上げるなら、v2.1.289で止めずにv2.1.291以降まで進める選択肢があります。
組織でプラグインとmodを管理する人
ユーザーが入れたプラグインが、組織管理のMCPサーバーのサインイン用ツールの説明文を書き換えられる穴が塞がりました。組み込みの守り役(cc-plugin-sec-default)は、管理対象MCPサーバーのツールと説明文をユーザーのmodから保護します。サインイン用ツールの説明文は、この保護からこぼれていた箇所と読めます。
もう1点、管理対象マシンでは、ネストしたシェルコマンドの一部に付けたdeny・askルールが、ユーザーが入れたmodの承認に負けることがありました。守り役が読み込まれる環境では、modはdenyルールが拒否する呼び出しを承認できません。複合コマンドの内側に書いたdenyルールでも、denyがmodの承認より優先するこの関係が崩れなくなりました。例外は、管理設定でallowModsToOverrideDenyRulesを有効にした場合で、このときはmodがdenyを上書きできます。
modやプラグインを作る人
27項目の大半はmod・プラグインまわりの修正です。直った内容は、検証コマンド・描画・フックイベントの3方面に分かれます。
claude plugin validateは、フォルダにマーケットプレイスのマニフェストも入っているとプラグインの検査を飛ばす問題と、Anthropicのマーケットプレイス自身のプラグインを失敗扱いにする問題が直りました。--jsonの出力に、問題のないplugin.jsonが一覧されていた件も同じ修正に含まれます。
claude plugin validate ./my-plugin --json描画まわりでは、ui.renderフックの返した値が原因で行の描画が例外を投げたとき、セッションが「unrecoverable interface error」で終わっていました。今後はエンジンが自分の行を描きます。Client領域が描画中に失敗した場合も、mod全体ではなくClientだけが失敗し、ui.faultイベントが上がります。docsでは、ui.faultを処理するフックが返ったあと、Claude Codeがui.renderをもう一度呼ぶので、フック側で失敗したClientを除いて描き直せます。
イベント側の追加は3つです。agent.spawnはteammate(エージェントチームの一員)にも対応し、docsではe.isTeammateがtrueになります。プラグインのフックイベント全体でエージェントIDが1つに揃い、$.agent.list()にはidleとwaitingの状態が入りました。
主な変更点
権限・セキュリティ
| 修正内容 | 効く環境 |
|---|---|
| ネストしたシェルコマンド内のdeny・askが、管理対象マシンでmodの承認に負けない | 効く環境管理設定を使う組織 |
symlink経由でIDE選択・変更・@メンションされたファイルにReadのdenyが適用される | 効く環境IDE連携 + denyルール |
| 展開される値を持つ環境変数が先頭に付いたコマンドでも、Bashのdeny・askを見落とさない | 効く環境sandbox auto-allow |
| コマンド前の単独変数代入があってもBashのdeny・askを飛ばさない | 効く環境sandbox auto-allow |
| ユーザーのプラグインが組織管理MCPのサインイン用ツールの説明を書き換えられない | 効く環境管理対象MCPサーバー |
画面の固まり・クラッシュ
| 修正内容 | 備考 |
|---|---|
<script>の閉じていない短いコードブロックや、深くネストした${置換でターミナルが固まる | 備考ターミナル |
公開したartifactのページで、閉じていない<script>を多く含む短いコードブロックでタブが固まる・落ちる | 備考閲覧側のブラウザ |
| タブ・孤立したエスケープ・C1制御文字を含む文字列や、タブとCRLFを含む短い文字列が下の行に重なる | 備考描画 |
未知の枠線スタイルを持つBoxを描くと、起動時に固まる・強制終了する | 備考プラグイン描画 |
| 高さのない領域が伸び続けると、インターフェースエラーでセッションが終わる | 備考プラグイン描画 |
| プラグインの画面ハンドラーが非同期に例外を投げると、supervisedセッションとバックグラウンドセッションが終わる | 備考supervised・バックグラウンド |
プラグイン管理・表示
次の不具合の修正と表示の改善が入りました。
- ローカルフォルダのマーケットプレイスから入れたプラグインについて、
plugin list・plugin eval・plugin updateが古いコピーを見ていた - symlinkした
--plugin-dirのホットリロードが効かなかった - アップグレード後の最初のセッションで、インストール済みのmodが読み込まれなかった
- localhostアドレス、パスに
@を含むリンク、大文字ホスト、file:パスのリンクを使うと、ペインが何も描かなかった - Backgroundタスクのダイアログをフルスクリーンで開くと、プロンプト上のプラグインの行が古いままだった
- modのペインやバンドの右寄せ要素が閉じるマークや
[-]の下に描かれ、端の1桁も空かなかった - 失敗したプラグインのコンポーネントが、メッセージのない失敗で理由を
Errorか空欄にしていた - mod作者向けの表示が、modの名前と「何も描かれなかった」ことを示す行に変わった
- 描画に失敗したmodのバンドが、下のカードに一時的に場所を空けさせていた
Client領域が、ターミナル側の例外のあとセッション中ずっと失敗扱いになっていた
高速化も1点あります。プラグインのコードペインで大きなファイルを開くとき、ハイライト済みの表示を最終的な幅で1回だけ配置するようにして、開くまでの時間を短くしました。
使い方別の効き方
27項目のうち、自分の使い方に当たる修正はごく一部です。効き方は、権限ルールを実際に運用しているかどうかで大きく分かれます。
| 使い方 | 影響度 | 該当する修正 |
|---|---|---|
| CLIの個人利用 | 影響度ほぼ影響なし | 該当する修正描画の固まりの修正が中心。deny運用がなければ体感は小さい |
| sandbox + deny運用 | 影響度明確な恩恵あり | 該当する修正環境変数の前置きと単独変数代入で、Bashのdeny・askが外れる2件 |
| IDE連携(symlinkあり) | 影響度条件次第 | 該当する修正symlink経由のファイルへのReadのdeny。denyを設定している場合に効く |
| 組織管理(managed + mod) | 影響度明確な恩恵あり | 該当する修正modの承認に対するdeny・ask、管理対象MCPのサインイン用ツール |
| mod・プラグイン作者 | 影響度明確な恩恵あり | 該当する修正ui.render・Client領域・ui.faultまわりの描画修正、plugin validate |
| VS Code拡張(2.1.288から更新) | 影響度条件次第 | 該当する修正claude auth statusの変更の取り消し。再認証が増えていた場合に効く |
表の「条件次第」は、該当する設定を使っている場合にだけ効く修正です。symlinkを含むリポジトリでも、Readのdenyを書いていなければ挙動は変わりません。
権限ルールは「書き方の形」で抜けるものだと分かる
今回の修正のうち、Bashの2件に共通するのは、ルールの内容ではなくコマンドの書き方の形で照合が外れた点です。TZ="$HOME" rm -rf buildとFOO=bar rm -rf buildは、どちらもrm -rf buildが実体です。docsは、Bashルールはコマンド全体の文字列に対して照合し(*は任意の文字列を表す)、複合コマンドや前置きのラッパーを分解してから突き合わせると説明しています。さらに、denyとaskのルールは先頭の変数代入を越えて照合され、FOO=bar rm -rf tmp/にもBash(rm *)のdenyが当たると書かれています。今回の2件は、sandbox auto-allowが働く経路でその照合が守られていなかった不具合と読めます。
過去のリリースでも、入力の形で拒否が外れる穴は繰り返し塞がれてきました。主なものを並べます。
| バージョン | 抜けた入力の形 | 塞いだ経路 |
|---|---|---|
| v2.1.257 | 抜けた入力の形< fileのリダイレクトやtac・egrepなどの読み取りコマンド | 塞いだ経路BashのRead()・Edit()拒否ルールの適用範囲を拡大 |
| v2.1.268 | 抜けた入力の形env -C・evalなど、権限チェッカーが解析できないコマンドが同じ行にある形 | 塞いだ経路解析できない行にも拒否ルールを適用(v2.1.273でリバート) |
| v2.1.282 | 抜けた入力の形CLAUDE.mdやルールファイルのsymlink経由の読み込み(macOSの/Network) | 塞いだ経路symlink経由の読み込みを遮断 |
| v2.1.282 | 抜けた入力の形パターンの途中に:*を含むBash権限ルール | 塞いだ経路設定ファイル経由でも--allowedToolsと同じく有効に |
| v2.1.289 | 抜けた入力の形環境変数の前置き、単独の変数代入が付いたBashコマンド | 塞いだ経路sandbox auto-allow下でもdeny・askを照合 |
| v2.1.289 | 抜けた入力の形IDEからsymlink経由で渡されたファイル | 塞いだ経路Readのdenyを適用 |
この系譜の読みどころは、塞ぐ側が「ルールの書き方」でなく「入力の側の形」を一つずつ足している点です。v2.1.268の例のように、広げた照合が正当なコマンドまで拒否して戻された前例もあり、入口ごとに塞ぐやり方は誤拒否との綱引きを伴います。v2.1.282の権限設定の抜け穴の修正と拒否ルールをevalですり抜けられる問題も、同じ流れの記録です。
denyルールを自作している場合、更新後にルール自体を増やす必要はありません。一方で、sandboxを使わない構成(auto-allowが働かない構成)は今回の2件の対象外です。
symlinkのReadと管理対象マシンのmod承認も、方向は同じです。「拒否は、経路が変わっても拒否のまま残る」という性質を、入口を1つずつ確かめて埋めています。
まとめ
権限ルールとsandboxを併用している環境、IDEでsymlinkを含むリポジトリを扱う環境、組織でmodを管理している環境では、このバージョンで抜け穴が埋まります。それ以外の個人利用では、体感できる変化は小さい更新です。
modやプラグインを作る側にとっては、描画クラッシュの修正が多く、ui.faultでClientの失敗を拾える前提で設計しやすくなりました。v2.1.287で入ったClaude Modsを試した後なら、更新の価値が大きいリリースです。2.1.288から上げる人は、終了時のメッセージ欠落が直ったv2.1.291以降まで進めると、一度で済みます。
関連ガイド
このバージョン単体の位置づけや前後の版とのつながりは、Claude Codeとは — できること・料金・使い方でまとめて確認できます。
関連する記事
Claude Code をもっと見る →Claude Codeとは — できること・料金・始め方と使い方の全体像
Claude Code v2.1.246 — Auto mode可視化とバックグラウンド安定化など61項目
Claude Code v2.1.290 — WebSearch上限が補充式に、セッションを名前で開けるように
Claude Code v2.1.287 — Claude Modsの導入と1Mコンテキスト既定化
Claude Code v2.1.277 — AGENTS.mdに対応し空のテキストブロックによる全リクエスト失敗を修正
Claude Code v2.1.275 — claude.aiのSkillとプラグインを端末セッションに同期