「承認」ボタンを、コマンド自身が欺いていた──Claude Codeが3日連続で塞いだ、エージェント権限チェックの抜け穴群
承認ダイアログに映らない不可視文字でコマンドを隠せた——Claude Codeが8月4〜6日のv2.1.221〜223で連続修正した、エージェント権限チェックの抜け穴群と、無人運用でいま打てる手をまとめる。
承認ダイアログに映らない「見えない文字」
コーディングエージェントの安全設計は、最後は人間の「承認」で担保されます。Claude Code のようなツールは、シェルコマンドやファイル書き込みを実行する前に「このコマンドを実行してよいか」と確認ダイアログを出し、利用者がそこで許可を押して初めて動きます。ところが 8 月 6 日にリリースされた Claude Code v2.1.223 の修正内容は、その最後の砦が欺かれていた可能性を示すものでした。
Anthropic が公開した変更履歴には、「タブや不可視の Unicode 文字で埋められたコマンドが、承認ダイアログからコマンドの一部を隠せる不具合を修正した」と記されています。つまり、利用者が承認ダイアログで見ている文字列と、実際に実行されるコマンドがずれていた——見えている部分だけを見て「問題なさそう」と許可を押すと、隠された部分まで一緒に走ってしまう、という穴です。人間の目には同一に見える文字(confusable characters)を突く手口は以前から指摘されており、この修正はその系譜に連なるものです。
3日で連続した、権限まわりの修正
注目すべきは、これが単発の修正ではない点です。8 月 4 日の v2.1.221 から 6 日の v2.1.223 まで、3 リリース連続で権限チェックと分離(isolation)の抜け穴が塞がれました。主なものを並べると次の通りです。
| バージョン | 塞いだ抜け穴 |
|---|---|
| v2.1.221 (8/4) | zsh の [[ ]] 正規表現条件の中で隠しコマンドが実行できた/Windows で引用符を含むパスが検査を素通りした/ワークフロー・スクリプトが動的 import() でサンドボックス外のコードを実行できた |
| v2.1.222 (8/5) | worktree で分離したはずのセッションとサブエージェントが、本チェックアウトに対して破壊的な git コマンドを実行できた/バックグラウンド処理で PreToolUse の自動許可フックがツール制限を回避できた |
| v2.1.223 (8/6) | タブ・不可視 Unicode でコマンドの一部を承認ダイアログから隠せた/エージェント定義の bypassPermissions が組織側の「無効化ポリシー」を無視していた/worktree 分離の穴を、ファイル編集と Bash の全セッションに適用し直した |
いずれも派手な新機能ではなく、地味な「配管の穴埋め」です。ですが共通しているのは、エージェントに与えたはずの制約(承認・サンドボックス・作業ディレクトリの分離・組織ポリシー)が、特定の条件で効いていなかったという点です。同じ週には、承認を経ずにエージェントが自ら実行判断を下す「自動モード」が全ユーザーに展開されてからちょうど 1 か月が経とうとしていました。判断を機械に預ける度合いが増すほど、これらの「関所」が確実に効くことの重みは増します。
関所が効かないと、何が起きうるか
コーディングエージェントは、外部から読み込んだ内容(Web ページ、スキルファイル、MCP サーバーのメタデータなど)を手がかりに動きます。もし承認ダイアログが欺けるなら、悪意ある指示を「安全そうに見える承認」として通される余地が生まれます。破壊的な git コマンドが分離された作業場を飛び越えて本体に及べば、意図しない変更や履歴の破壊につながりえます。こうしたリスクは、エージェントに強い権限を渡して無人で回すほど大きくなる、という指摘があります。便利さの裏側にある構造的な弱点として、頭の片隅に置いておきたいところです。
一方で、こうした穴が外部の攻撃事例としてではなく、開発元自身の変更履歴として速いテンポで塞がれ、内容まで具体的に開示されている点は前向きに評価できます。修正の透明性そのものが、エージェントを業務に組み込む際の判断材料になります。
いま打てる手
実運用でエージェントを使っているなら、まず Claude Code を最新版(v2.1.223 以降)へ更新するのが最初の一手です。そのうえで、組織で無人運用している場合は、bypassPermissions の無効化ポリシーが意図通り効いているかを確認する価値があります。マーケットプレイスの許可・ブロックを組織単位でまとめて管理したい場合は、v2.1.223 で追加された owner/* のワイルドカード指定が使えます。承認ダイアログを「見て押すだけ」の運用は、今回のような死角がある前提で、権限そのものを絞る設計に寄せておくのが堅実です。
参照: Claude Code changelog(公式) / Releasebot: Claude Code Updates / Claude Code Changelog (August 2026) / TechTimes: Claude Code Seals Bash and Unicode Bypass Gaps / GitHub Issue #29489: Unicode confusable characters can bypass permission rule matching