はじめに
Claude Code v2.1.289 がリリースされました。今回の最重要ポイントは、権限ルール(deny/ask)や管理ポリシーが迂回されうる問題が4件まとめて修正されたことです。あわせて、プラグイン API に agent.spawn(チームメイト起動)などのマルチエージェント向け機能が追加されています。
📌 影響を受ける人
- サンドボックスの自動許可と Bash の deny/ask ルールを併用している人
- 組織の管理端末(managed settings)で Claude Code を運用している管理者
- Read の deny ルールで機密ファイルを守っている人
- 組織管理の MCP サーバーを使い、かつユーザーがプラグインを自由に入れられる環境の人
- プラグイン/mod の開発者
結論から言うと、v2.1.289 以上へのアップデートを推奨します。以降、重要度の高いものから順に解説します。
変更の全体像
権限まわりの修正は、いずれも「ルールを書いていたのに効いていなかった」タイプです。設定ミスではなく製品側の不具合なので、ユーザー側の設定を見直しても防げません。アップデートが唯一の対策です。
変更内容
1. 重要度 critical:権限・アクセス制御の迂回(4件)
| # | 影響範囲 | 内容 | 対象 |
|---|---|---|---|
| 1 | Bash tool / サンドボックス自動許可 | 特定の形のコマンドで deny/ask ルールが効かない | サンドボックス自動許可の利用者 |
| 2 | 管理端末 | ネストした複合シェルコマンドで、mod の承認が deny/ask より優先される | 組織管理端末の管理者 |
| 3 | Read tool / IDE 連携 | シンボリックリンク経由で Read の deny が効かない | deny で機密ファイルを保護している人 |
| 4 | 管理 MCP / プラグイン | ユーザーのプラグインが管理 MCP のサインイン用ツールの description を書き換え可能 | 組織管理 MCP の利用組織 |
(1) サンドボックス自動許可時の Bash deny/ask 迂回
サンドボックスがコマンドを自動許可する設定のとき、次の2パターンで deny/ask ルールが評価されていませんでした。
-
パターンA: 環境変数を先頭に付け、その値が展開されるコマンド。例:
TZ="$HOME" rm -rf build。deny/ask に一致すべきコマンドを見落としていた。 - パターンB: コマンドの前に変数代入だけが置かれている場合。deny/ask ルールの判定自体が飛ばされていた。
つまり、rm を deny/ask にしていても、先頭に環境変数を付けるだけで確認なしに実行されうる状態でした。
(2) 管理端末での mod 承認による deny/ask の上書き
組織管理の端末で、複合シェルコマンドの内側の部分に deny/ask ルールが一致しても、ユーザーがインストールした mod の承認がそれを上書きしていました。組織の権限ポリシーが、ユーザー側の mod で迂回されうる問題です。v2.1.289 ではルール側が優先されます。
(3) シンボリックリンク経由の Read deny 迂回
Read の deny ルールで禁止したファイルでも、シンボリックリンクを経由すると、次の経路から内容がコンテキストに入る可能性がありました。
-
@メンション - ファイルの変更
- IDE での選択
.env などの機密ファイルを deny で守っている場合、リンク経由でモデルに読まれるリスクがありました。
(4) プラグインによる管理 MCP サインインツールの説明書き換え
ユーザーがインストールしたプラグインが、組織管理 MCP サーバーのサインイン(認証)用ツールの description を書き換えられました。認証フローへの誘導やプロンプトインジェクションに悪用されうる問題です。
2. 重要度 high:プラグイン API の拡張
| 追加点 | 内容 | 嬉しいこと |
|---|---|---|
agent.spawn |
チームメイトを起動 | プラグインからマルチエージェントを起動できる |
| 共通エージェント ID | プラグインフックの各イベントで同じ ID を使用 | イベントをまたいで同じエージェントを追跡できる |
$.agent.list() の状態追加 |
idle(アイドル)と waiting(待機中)を返す |
エージェントの状況を可視化しやすい |
💡 Tips
これまではイベントごとにエージェントを紐付ける工夫が必要でしたが、共通 ID により「どのエージェントのイベントか」が一貫して判別できます。ステータスパネル用の mod などで特に便利です。
3. 重要度 medium/low:安定性・表示まわりの改善
| 区分 | 内容 |
|---|---|
| フリーズ修正 | 閉じていない <script> や深くネストした ${ を含む短いコードブロックでターミナルがフリーズ。公開アーティファクトページでは閲覧者のブラウザタブもフリーズ/クラッシュしていた |
| VSCode | 2.1.288 の claude auth status 変更を取り消し(サインアウトが増えた可能性) |
| mod ロード | アップグレード直後の初回セッションで、インストール済み mod が読み込まれない問題を修正 |
| セッション終了の修正 | 未知のボーダースタイルの Box、非同期例外、高さゼロ領域の増大、ui.render フックの値による描画例外など、プラグイン起因のセッション終了/フリーズを修正 |
| 障害の局所化 | mod の Client の描画失敗がその Client 内に閉じ込められ、ui.fault が発火するように。失敗状態がセッション中ずっと残る問題も修正 |
| 性能 | プラグインのコードペインで大きなファイルを開く速度が向上(最終幅で1回だけレイアウト) |
| 表示・CLI | 古い行の残存、ペインが何も描画されない問題(localhost、パス中の @、大文字ホスト名、file: パス)、右寄せの重なり、制御文字の重なり、plugin list/eval/update の古い表示、シンボリックリンクの --plugin-dir のホットリロード、claude plugin validate の誤判定、エラーメッセージの改善 |
影響と対応
今すぐやること
- v2.1.289 以上にアップデートする(全員)。
- サンドボックス自動許可 + deny/ask を併用している場合は、v2.1.289 未満では deny/ask が効かないコマンド形がある前提で扱ってください。アップデートまでは、自動許可の無効化も検討してください。
- 組織管理端末の管理者は、配布している Claude Code のバージョンを v2.1.289 以上に統一してください。
- Read の deny で機密ファイルを保護している場合は、シンボリックリンクの有無を棚卸しし、過去に意図せず参照されていなかったか確認してください。
- 組織管理 MCP を使っている場合は、ユーザーがインストールしているプラグインの一覧と出所を確認してください。
CLAUDE.md への追記提案
サンドボックス自動許可と deny/ask ルールを併用する環境では、運用ルールに次の旨を書いておくと再発防止になります。
## 権限・サンドボックス運用
- サンドボックス自動許可と deny/ask ルールを併用する環境では v2.1.289 以上が必須
- 環境変数プレフィックス付きコマンド(例: TZ="$HOME" rm -rf build)で
ルールが迂回されうる既知事例として記録する
プラグイン/mod 開発者向けには、「agent.spawn でチームメイトを起動できる」「フックイベント間で共通のエージェント ID が使える」「$.agent.list() で idle/waiting を取得できる」を追記しておくとよいでしょう。
プラグイン/mod 開発者の注意
-
ui.renderフックが書いた値で描画例外が出ても、セッションは終了せず、エンジンが代わりに自前の行を描画するようになりました。 - mod の Client の描画失敗は
ui.faultとして通知されます。必要に応じてハンドラの追加を検討してください。 - 右寄せコンテンツの位置が変わります。閉じるマークと
[-]はターミナル右端から1列内側に置かれるため、右端ぴったりに描画している mod はレイアウトを確認してください。
コード例
Before:迂回されうるコマンドの例(v2.1.289 未満)
deny に rm 系を指定していても、サンドボックス自動許可の環境では次のような形で評価が飛ぶ場合がありました。
# パターンA: 環境変数を先頭に付け、値が展開される
TZ="$HOME" rm -rf build
# パターンB: 変数代入だけが先行する
FOO=bar
rm -rf build
After:v2.1.289 以降
上記はどちらも deny/ask ルールの判定対象になります。
# バージョン確認
claude --version
# 2.1.289 以上であること
プラグイン API の利用イメージ
⚠️ 注意
以下は変更内容から組み立てた利用イメージです。引数や戻り値の正確なシグネチャはリリースノートに記載がありません。実装前に公式ドキュメントで確認してください。
// チームメイトを起動(引数は公式ドキュメントで要確認)
await agent.spawn({ /* ... */ });
// エージェント一覧と状態の取得
const agents = await $.agent.list();
for (const a of agents) {
// 状態に idle / waiting が加わった
console.log(a.id, a.status);
}
まとめ
- v2.1.289 は 権限・アクセス制御の迂回4件を修正したセキュリティ上重要なリリースです。
- サンドボックス自動許可時の Bash deny/ask 迂回
- 管理端末で mod の承認が deny/ask に勝つ問題
- シンボリックリンク経由の Read deny 迂回
- プラグインによる管理 MCP サインインツールの説明書き換え
- 設定の見直しでは防げないため、アップデートが唯一の対策です。特に管理端末の管理者と、サンドボックス自動許可を併用している人は最優先で対応してください。
- プラグイン API には
agent.spawn、共通エージェント ID、idle/waiting状態が追加され、マルチエージェント制御・可視化がしやすくなりました。 - プラグイン/mod まわりでは、描画失敗によるセッション終了やフリーズが多数解消され、
ui.faultによる障害の局所化も入りました。