Claude Codeで確認なしに実行されていた5つの穴、v2.1.214で修正

Claude Codeで確認なしに実行されていた5つの穴、v2.1.214で修正

Claude Code v2.1.214で、dir/**の過剰マッチ・PowerShell 5.1・zshの変数添字・help/manの危険オプション・1万文字超コマンドという5つの権限チェック回避が修正された。それぞれの仕組みと実害範囲、バージョン確認とアップデートの手順までエンジニア視点で解説する。

エンジニアのゆとです。

結論から言う。Claude Code v2.1.214(2026年7月18日リリース)で、パーミッションチェックを回避できる不具合が5件まとめて修正された。どれも「確認ダイアログが出ないままコマンドが実行される」系の穴で、allow/denyをちゃんと設定していた人ほど「設定した覚えがある挙動と実際の挙動がズレていた」ことになる。

自分はこの手のアップデートを見るたびに、公式のchangelogを一行ずつ確認する癖がついている。今回のは正直、流し読みして終わらせていい内容じゃなかった。

Claude Codeのパーミッションプロンプトを設計する——allowlistとsettings.jsonで確認頻度を最適化する
Claude Codeのパーミッションプロンプトを設計する——allowlistとsettings.jsonで確認頻度を最適化するClaude Codeのパーミッションプロンプトが頻繁に出て作業が止まる問題を解決する。settings.jsonのallowlist設定、プロジェクト別権限とグローバル権限の使い分け、危険コマンドは残しつつ安全なコマンドを通す設計パターンを実装例付きで解説。読む →

僕自身、パーミッション周りはsettings.jsonのallowlistをかなり作り込んで運用してる方だと思う。上の記事でも書いた通り、「読む系は全部許可、書く系は都度確認」という設計を信じてやってきた。でも今回の5件は、その信頼の前提——「allow/denyのルールは書いた通りに評価される」——が一部のケースで成立してなかった、という話だ。1つずつ中身を見ていく。

dir/** ルールが想定外のディレクトリまで許可していた

一番影響範囲が広いのがこれ。Edit(src/**)のような「1つのディレクトリだけを許可する」つもりで書いたルールが、ツリーのどこにあっても同名のdir/ディレクトリへの書き込みを許可してしまっていた。

つまり、カレントディレクトリ直下のsrc/だけを許可したつもりが、たとえばvendor/some-package/src/のような、まったく別の場所にある同名ディレクトリの書き換えまで通ってしまう可能性があった、ということだ。プロジェクトの構造によっては「許可したつもり」と「実際に許可した範囲」の差がかなり大きくなる。

modeが複雑な大規模リポジトリで、node_modulesやvendor配下に同名フォルダが大量にある環境ほど影響が出やすい。自分のブログ運用みたいな比較的シンプルな構造では実害は小さそうだけど、モノレポでClaude Codeを動かしてる人は無関係じゃない。

PowerShell 5.1セッション固有のバイパス

Windows環境、それもPowerShell 5.1(Windows標準搭載の古いバージョン。PowerShell 7系ではない方)でセッションを動かしていた場合に、コマンドの権限チェックをすり抜けるパターンがあった。

Claude Code Windows完全ガイド 2026 — WSL・Git Bash・PowerShell徹底比較
Claude Code Windows完全ガイド 2026 — WSL・Git Bash・PowerShell徹底比較Claude CodeをWindowsで使う3つの方法(WSL/Git Bash/PowerShell)を徹底解説。インストール手順・パフォーマンス比較・トラブルシュート・各環境の使い分けを2026年最新情報で網羅。読む →

以前この記事でWSL・Git Bash・PowerShellの3択を比較したけど、PowerShell 5.1はWindowsに最初から入ってる分、意識せずそのまま使ってる人が一定数いるはず。7系にアップデートしてれば影響を受けないケースもあるが、「標準搭載だから」という理由だけでPowerShell 5.1を使い続けてる人は、これを機にバージョンごと見直してもいいと思う。

zshの変数添字が「ただの文字列」として素通りしていた

これが個人的には一番地味に怖いやつ。zshには${array[1,3]}のような変数添字(subscript)や、[[ ]]条件式の中で使う修飾子の書き方がある。権限チェックのパーサーがこの構文を理解しておらず、「危険な操作を含むコマンドかどうか」を判定する対象としてスキップしていた、という不具合だ。

bashとzshは似てるようで構文の解釈が結構違う。パーミッションのチェック処理がbash寄りの想定で書かれていて、zsh特有の書き方に対する「読み方」が足りてなかった、というのが実態に近い。macOSはデフォルトシェルがzshなので、Mac miniやMacBookでClaude Codeを使ってる人はまず対象になる環境だったはず。自分もそうだ。

help / man コマンドが危険なオプション付きで無確認実行されていた

helpmanは「情報を見るだけの安全なコマンド」という前提で、通常より緩い扱いを受けやすい。ところが一部のhelp/man呼び出しは、コマンド置換($(...)のような、別のコマンドの実行結果を埋め込む書き方)やバックスラッシュを使ったパス指定を含んでいても、そのまま確認なしに実行されていた。

「マニュアルを見るだけ」のふりをして、実際には任意のコマンドを埋め込んで実行させる余地があった、というのがこの穴の本質。ヘルプコマンドだから安全、という判断基準そのものが甘かったパターンで、地味だけど設計思想として一番学びがある修正だと思う。

1万文字を超えるコマンドが自動実行されていた

これが一番わかりやすく「怖い」と感じたバグ。Claude Codeのパーミッションチェックには、コマンド文字列の長さによって挙動が変わる処理があって、10,000文字を超える長さのコマンドは判定処理がうまく走らず、確認プロンプトを出さずにそのまま実行されていたらしい。

普段自分が打つようなコマンドは長くてもせいぜい数百文字なので、直接は関係なさそうに思える。でも実際には、生成AIが組み立てた長大なワンライナー、大量のファイルパスを埋め込んだコマンド、複数コマンドを&&で連結したような処理は普通に1万文字を超えてくる。「なんか長い処理を投げたら、確認画面が出る前にもう終わってた」みたいな体験をしたことがある人がいたら、これが原因だった可能性は十分ある。

長さという、コマンドの中身とは無関係な要素だけでチェックがすり抜けられていた、という点で、他の4つとは少し毛色が違うバイパスだ。

今すぐやること

読んでわかる通り、5件とも「悪意ある第三者が仕込んだ脆弱性」というより、パーミッションチェックというロジック自体の実装の穴だ。OpenClawの一件のような外部からの攻撃とは性質が違う。

OpenClawセキュリティ危機の全貌 — GitHub最速スターから3週間で「2026年最初のAIセキュリティ災害」になるまで
OpenClawセキュリティ危機の全貌 — GitHub最速スターから3週間で「2026年最初のAIセキュリティ災害」になるまでGitHub史上最速でスターを集めたOpenClawが3週間で「2026年最初のAIセキュリティ災害」になるまでの経緯を徹底解説。CVE-2026-25253をはじめ8件のCVE、ClawHavocサプライチェーン攻撃の技術詳細、13.5万台のインターネット露出、そしてSecureClawの対策まで。読む →

とはいえ「確認ダイアログが出る前提で運用していたのに、実は出ないケースがあった」というのは、信頼してる仕組みの前提が崩れる話なので軽視はできない。やることはシンプルで、v2.1.214以降にアップデートするだけだ。

まず自分の今のバージョンを確認する。

claude --version

v2.1.214より古ければ更新する。

claude update
Claude Codeを初めて動かした日、僕は5分で固まった — 始め方と「あの日知りたかったこと」全部書く
Claude Codeを初めて動かした日、僕は5分で固まった — 始め方と「あの日知りたかったこと」全部書くClaude Codeのインストールから実務活用まで、実体験ベースで全部書く。初めて動かした時の衝撃、CLAUDE.mdで世界が変わった話、コスト管理で痛い目を見た話まで。2026年最新。読む →

自動アップデートを有効にしてる人は既に当たってるはずだけど、念のため一度claude --versionを打っておくのをおすすめする。特にmacOSでzshを使ってる人、Windowsで古いPowerShellを使い続けてる人、モノレポでdir/**系のallowlistを組んでる人は、今回のアップデートで実際に挙動が変わる可能性がある。

まとめ

Claude Code v2.1.214では、パーミッションチェックを回避できる5つの穴——dir/**ルールの過剰マッチ、PowerShell 5.1固有のバイパス、zshの変数添字の見落とし、help/manの無確認実行、1万文字超コマンドの自動実行——がまとめて修正された。どれも派手な脆弱性というより「確認が必要なはずの操作が、確認なしに通っていた」という地味な穴だけど、地味だからこそ気づきにくい。バージョンを確認して、古ければ更新する。それだけで塞がる話だ。

code.claude.com
← 記事一覧に戻る