GhostApproval(CVE-2026-12958 / CVE-2026-50549 ほか): 6つのAIコーディングエージェントに影響するSymlink+UI誤表示の複合脆弱性、Wizが実証

この記事は約18分で読めます。

クラウドセキュリティ企業のWiz(Google傘下)は2026年7月8日、Amazon Q Developer、Anthropic Claude Code、Augment、Cursor、Google Antigravity、Windsurfという主要な6つのAIコーディングエージェントに影響する脆弱性パターン「GhostApproval」を公表しました。攻撃者は悪意あるリポジトリ内にシンボリックリンク(symlink)を仕込み、READMEに書かれた指示を通してエージェントに「無害な設定ファイルを編集する」と見せかけて、実際には`~/.ssh/authorized_keys`や`~/.zshrc`のような開発者のホームディレクトリ内の機密ファイルへ書き込ませることができます。sshdが有効で到達可能な環境では、攻撃者が開発者のマシンへ永続的なパスワードレスSSHアクセスを得る可能性があり、Wizはこれを実現するPoCを6ベンダー全ての製品で成立させています。

GhostApprovalの核心は、シンボリックリンクの追跡(CWE-61)という数十年前から知られた古典的なUnix問題に、UI上の重要情報の誤表示(CWE-451)というAI特有の情報非対称性が重なる二層構造にあります。特にAnthropic Claude Codeでは、エージェントの内部推論が「project_settings.jsonは実際にはzsh設定ファイルへのシンボリックリンクである」と正しく認識していたにもかかわらず、ユーザに表示された承認プロンプトは「project_settings.jsonへの編集を許可しますか?」とだけ提示されるという情報非対称が観測されました。Wizはこれを「informed consent bypass(情報に基づく同意の迂回)」と命名し、Human-in-the-Loopの安全網が形式的に存在しても実質的に機能しない状態を指摘しています。6ベンダーの対応は分かれており、AWS・Cursor・Googleは修正済み、AugmentとWindsurfは進行中、Anthropicは自社の脅威モデル外として当初拒否(後に個別の対応あり)という状態で公表されました。

GhostApproval脆弱性の全体像

本脆弱性はWizが「systematic vulnerability pattern(体系的な脆弱性パターン)」と表現するカテゴリレベルの設計問題で、6ベンダーの製品に個別バグとしてではなく、AIコーディングエージェント全般に共通する構造的な設計の穴として整理されています。初期発見は2026年2月10日、6ベンダーへの報告は2月12日から3月5日にかけて行われ、90日以上の調整済み開示期間を経て2026年7月8日に公開されました。

項目 内容
脆弱性通称 GhostApproval
脆弱性クラス Symbolic Link Following(CWE-61)+ UI Misrepresentation of Critical Information(CWE-451)の二層構造
発見・公表 Wiz Research(研究者Maor Dokhanian、Google傘下)
公表日 2026年7月8日
初期発見日 2026年2月10日
影響を受けるAIコーディングエージェント Amazon Q Developer、Anthropic Claude Code、Augment、Cursor、Google Antigravity、Windsurfの6製品
Amazon Q Developer Fixed。CVE-2026-12958。language server 1.69.0で修正(2026年5月27日配布)。修正前は書き込み後に「Undo」ボタン提示の承認前書き込み(pre-authorization write)挙動。
Anthropic Claude Code Disputed。当初は「outside our current threat model」として扱われたが、現行版ではsymlink解決と機密ファイル書き込み前の警告を実装。Anthropicは、symlink警告はWiz報告前のv2.1.32(2026年2月5日)で事前ハードニングとして導入済みと説明。
Augment In Progress(受領確認済み、更新なし)。v0.754.3で確認。読み取りと書き込みの両方でシンボリックリンクを追跡し、いずれも確認ダイアログを一切表示しない挙動。
Cursor Fixed。CVE-2026-50549。v3.0で修正(2026年6月5日公表)。修正前はdiff UIにシンボリックリンクのパスを表示し、Accept時にバックエンドが解決済みターゲットへ書き込む挙動。
Google Antigravity Fixed(2026年5月22日配布)。CVEは検討中。修正前は承認ダイアログにシンボリックリンクのパスを表示し、解決済みの正規化パス(canonical path)を表示しない挙動。
Windsurf In Progress(受領確認済み、更新なし)。v1.9566で確認。Accept/Rejectボタンが表示される前にディスク書き込みが完了する承認前RCE(pre-authorization RCE)挙動。
攻撃効果 攻撃者制御下のSSH公開鍵を開発者の`~/.ssh/authorized_keys`に書き込むことによる永続化(sshdが有効で到達可能な環境ではパスワードレスSSHアクセスにつながる可能性)、`~/.zshrc`書き換えによるシェル永続化、AWS認証情報などワークスペース外の機密ファイル読み取り
関連する類似研究 Adversa AI「SymJack」(2026年5月、6つのAIコーディングエージェントに対する同種symlink+approval攻撃)、Cato AI Labsの以前のCursor symlink研究「DuneSlide」(今回のCVE-2026-50549にはCato AI LabsとMaor Dokhanianがクレジット)、Adversa AI「TrustFall」(MCPサーバ経由のone-click RCE)

AIコーディングエージェントという新しい攻撃面

AIコーディングエージェントは、開発者がプロジェクトディレクトリで自然言語による指示を与えると、READMEやコード、設定ファイルを読み込み、ファイル編集・コマンド実行・外部リポジトリのクローンといった一連の操作を自律的に実行するツール群です。Claude Code、Cursor、GitHub Copilot、Amazon Q Developer、Google Antigravity、Windsurfなどが代表格で、いずれもここ1年で急速に採用が広がっています。エージェントは開発者マシン上でユーザ権限を継承して動作するため、開発者のホームディレクトリ、SSH鍵、シェル起動ファイル、他のAIエージェント設定など、ワークスペース外のあらゆる機密ファイルにも技術的にはアクセス可能です。

この広範なアクセス権を制御する主要な仕組みが「Human-in-the-Loop(人間の承認ステップ)」で、機密性のある操作の前にダイアログを提示してユーザに承認を求める設計です。プロジェクトディレクトリを最初に開いたときの「このディレクトリを信頼するか」というワークスペース信頼プロンプトと、個別のファイル書き込みやコマンド実行時の承認プロンプトの二段構えで、悪意あるリポジトリからの攻撃を防ぐ想定になっています。GhostApprovalが浮き彫りにしたのは、この承認プロンプトが「表示している対象」と「実際に操作している対象」が乖離し得るという構造的な問題です。

攻撃の技術的な原理

シンボリックリンク(symlink)は、あるパスから別のパスへの参照を持つUnixファイルシステムの機能で、`project_settings.json`という名前でありながら実体は`~/.ssh/authorized_keys`を指す、といったすり替えを可能にします。ファイルシステムの通常操作では、シンボリックリンクへの書き込みは自動的にターゲットファイルへの書き込みとして解釈されます。これはCWE-61として長年知られたクラスの問題で、Docker脱出のCVE-2024-21626、npmパッケージマネージャのCVE-2021-32803、レース条件のCVE-2018-15664など、過去にも様々な文脈で悪用されてきました。

GhostApprovalの攻撃者は、公開GitHubリポジトリなどに悪意あるリポジトリを設置します。リポジトリには`project_settings.json`のような無害に見える名前のファイルが含まれますが、実体は`~/.ssh/authorized_keys`などのユーザ機密ファイルへのシンボリックリンクです。同時にREADMEには「このプロジェクトのセットアップには、`project_settings.json`に以下の一行を追加してください」といった指示と、追加する内容として偽装されたSSH公開鍵の文字列が書かれています。

被害者がこのリポジトリをクローンし、AIコーディングエージェントに「READMEを読んでセットアップしてください」といった指示を与えると、エージェントはREADMEの指示に従って`project_settings.json`への書き込みを実行しようとします。エージェントは通常のファイル操作APIを使うため、シンボリックリンクが自動的に追跡され、実際の書き込みは`~/.ssh/authorized_keys`に到達します。この時点で攻撃者のSSH公開鍵が被害者のauthorized_keysに追加され、パスワードレスSSHアクセスが成立します。

Human-in-the-Loopの二層目の失敗

シンボリックリンクの追跡そのものは古典的な問題ですが、GhostApprovalが「systematic vulnerability pattern」と評される理由は、上位の防御層であるはずのUI承認プロンプトが、実際のターゲットパスを隠す形で表示されることにあります。Wizが最も明確な例として示したのがAnthropic Claude Codeで、以下の情報非対称が観測されました。

エージェントの内部推論(thinking)では「project_settings.jsonは実際にはzsh設定ファイルへのシンボリックリンクだ」と正しく認識されていました。しかし、ユーザに表示された承認ダイアログは「Make this edit to project_settings.json?(project_settings.jsonへの編集を許可しますか?)」とだけ書かれ、実際の書き込みターゲットは表示されませんでした。エージェントは知っている、ユーザは知らない、という情報非対称です。

Wizはこの現象を「informed consent bypass」と命名し、CWE-451(UI Misrepresentation of Critical Information)として整理しました。承認プロンプトという安全境界は形式的に存在しているものの、意思決定に必要な情報が伝達されていないため、ユーザは実質的に意味のあるセキュリティ判断ができない状態です。結果としてHuman-in-the-Loopは、実質的なガードではなく「単なる形式的な承認手続き(rubber stamp)」に退化します。

6ベンダー各製品の実装差異

Wizは6つのAIコーディングエージェントすべてで脆弱性パターンを確認しましたが、実装の細部と危険度は製品ごとに異なります。以下、Wizの検証結果に基づく主要な差異です。

Amazon Q Developerは、シンボリックリンクを内部推論で識別しながらも、そのままファイルシステムに書き込みを実行してから、事後に「Undo」ボタンをユーザに提示する承認前書き込み挙動を示しました。書き込みが完了してからのUndoは、authorized_keysへのSSH鍵追加のような、Undoしても損害が確定するタイプの操作に対しては実質的な防御にはなりません。AWSは対応が迅速で、CVE-2026-12958を割り当ててlanguage server 1.69.0(2026年5月27日配布)で修正しました。

Cursorは、diff UIにシンボリックリンクのパス(すなわち`project_settings.json`)を表示し、ユーザがAcceptを押した瞬間にバックエンド側でシンボリックリンクが解決されて実際のターゲットへ書き込みが飛ぶ挙動でした。CVE-2026-50549を割り当ててv3.0で修正されています(2026年6月5日公表)。

Google Antigravityは、Cursorと類似の挙動で、承認ダイアログにシンボリックリンクのパスを表示し、解決済みの正規化パスを提示しない設計でした。Googleは建設的に対応し、2026年5月22日に修正を配布、CVE発行を検討中です。

Augmentは6ベンダー中でとくに重大な挙動を示しました。読み取り操作でも書き込み操作でもシンボリックリンクを追跡し、いずれの操作についてもユーザへの確認ダイアログを一切表示しませんでした。Wizの検証では、ワークスペース外の`~/fake_aws_credentials`ファイルの内容がチャットに表示され、SSH公開鍵の`~/.ssh/authorized_keys`への追加と`~/.zshrc`書き換えによるシェル永続化が確認ダイアログなしで達成されています。Augmentは受領確認まで返しましたが、記事執筆時点で修正配布はなく、Wizは「Acknowledged, no update」と記載しています。

Windsurfは、Amazon Qと類似した承認前書き込みパターンですが、より危険な挙動です。Accept/Rejectボタンがユーザに表示される前の時点で、既にディスクへの書き込みが完了しています。つまり承認ダイアログは「これを行いますか?」という認可ゲートではなく、「これは既に起こりました、取り消しますか?」というundoボタンとして機能します。攻撃者のSSH鍵は、被害者が承認画面を見る前にすでにauthorized_keysへ追加されています。Windsurfも受領確認のみで、記事執筆時点で修正配布はありません。

Anthropicの立場と設計思想の議論

Anthropic Claude Codeへの対応は6ベンダー中で唯一の「disputed」で、AnthropicはWizの報告に対して次のように応答しました(Wizのレポートに引用された原文):「これは我々の現在の脅威モデルの範囲外です。ユーザがClaude Codeをディレクトリで最初に起動する際、セッション開始前にディレクトリを信頼することを確認する必要があります。あなたが記述したシナリオは、悪意あるシンボリックリンクを含むディレクトリの中でユーザが明示的に権限プロンプトを承認することを含んでおり、これはClaude Codeの脅威モデル外にあたります」。

Anthropicの立場は、ユーザによるディレクトリ信頼とプロンプト承認の二重の同意があった時点で、責任はユーザ側の判断に移るという設計思想に基づきます。一方、Wizの反論は「informed consentは正確な情報を要求する」というもので、承認プロンプトが`project_settings.json`を表示している一方で実際のターゲットが`~/.ssh/authorized_keys`であれば、ユーザは意味のあるセキュリティ判断ができないため同意は形式的にしか成立していない、という主張です。

Wiz自身はこの議論について、「決定的な答えを持っているわけではない」と留保しつつも、「AWS、Google、Cursorを含む主要ベンダーが脆弱性として扱い修正した」という比較を提示しています。Anthropicはその後、記事公開直前の2026年7月7日にWizに追加応答し、「シンボリックリンク警告はv2.1.32(2026年2月5日リリース、Wizからの報告受領の9日前)で内部レビューに基づく事前ハードニングとして既に配布済み」「最初の『no comment』応答は自動応答システムからのものだった」と説明しました。現行バージョン(2.1.173+)は解決済みの正規化パスを表示し、機密ファイルへの書き込み前に警告を出す挙動になっています。

AIエージェント攻撃面の系譜

GhostApprovalは、2026年前半に相次いだAIコーディングエージェントに対する研究の一連の流れに位置付けられます。同月に公開されたNoma SecurityのGitLostは、GitHub Agentic Workflowsに対する間接プロンプトインジェクションで、公開Issueから非公開リポジトリを漏洩させる攻撃面でした。同じく7月にはHong Kong University of Science and TechnologyのSkillCloakが、AIエージェント用Skillパッケージの静的スキャナ回避手法を実証しました。

類似の研究として、2026年5月にAdversa AIが公開した「SymJack」があります。SymJackは同じsymlink+承認パターンをClaude Code、Cursor、GitHub Copilot、Grok Build、Gemini CLI、OpenAI Codex CLIの6ツールで確認しており、独立した2チームが同種のパターンを別々に発見した事実は、これが個別ベンダーの実装ミスではなくカテゴリ全体の設計パラダイム上の問題であることを示唆しています。Adversa AIの別研究「TrustFall」も、悪意リポジトリからのMCPサーバ自動起動によるone-click RCEを示しており、Cato AI Labsの以前のCursor symlink研究「DuneSlide」もCursorのシンボリックリンク経路を扱っています。今回のGhostApprovalに関するCursor側のCVE-2026-50549は、Wiz Researchに加えてCato AI Labsもクレジットされており、両組織が独立に類似の脆弱性を報告した経緯があります。

これら一連の研究が共通して指摘するのは、AIエージェントが「ユーザに代わって行動する認証済みアクター」として動作し始めた段階で、従来のセキュリティ境界(サンドボックス、承認プロンプト、権限モデル)がエージェントの内部推論と外部提示の非対称、および悪意ある入力による指示解釈の書き換えに対して脆弱になる、という構造です。GhostApprovalは特にファイルシステム層でこの構造を実証したケースにあたります。

実務対応と運用上の推奨事項

WizのGhostApproval対策と、報道各社が業界専門家から集めた運用上の推奨事項を統合すると、GhostApprovalへの実務対応は次の観点に集約されます。単一のパッチ待ちではなく、エージェント運用側でも複数の防御層を積み上げる必要があります。

  • ベンダーごとのパッチ状況の追跡:Amazon Q Developer(language server 1.69.0以降)、Cursor(v3.0以降)、Google Antigravity(2026年5月22日以降の配布)は修正済みです。AugmentとWindsurfは記事執筆時点で修正未配布のため、これらのツールを利用している組織は代替製品への移行またはより厳格な運用制限が必要です。Anthropic Claude Codeについては、v2.1.173以降でシンボリックリンクの解決と機密ファイル書き込み前の警告が実装されており、この版以降への更新が推奨されます。
  • ワークスペース外への書き込みを警戒:信頼していないリポジトリで作業する際は、`git status`に表示されないファイル、すなわち`~/.ssh/`、`~/.zshrc`、`~/.bashrc`、AIツール自身の設定ファイル(`.claude/`、`.cursor/`など)を作業後に手動で確認する運用を追加します。GhostApproval型の攻撃はこれらのファイルを狙うため、リポジトリ内には痕跡が残りません。
  • 制限付きファイルアクセスでの実行:AIエージェントを可能な限り最小のファイルアクセス権限で実行するか、コンテナやサンドボックス内で動作させる運用を検討します。開発者のホームディレクトリ全体にアクセス可能なエージェントは、GhostApprovalに限らず類似の攻撃面を潜在的に開いています。
  • 信頼していないリポジトリの事前レビュー:エージェントに「セットアップ」を任せる前に、READMEと隠しファイル(`.git`、`.claude/`、その他ドットファイル)を人間の目で確認する運用を徹底します。シンボリックリンクの存在は`ls -la`や`find . -type l`で発見可能で、悪意リポジトリのREADMEに書かれた指示に不自然な点(具体的なファイルパスや文字列の書き込み指示)がないかを事前確認します。
  • CI/CDランナーでの自動信頼の見直し:Adversa AIのSymJack研究が指摘したように、CI/CDランナー上でエージェントがワークスペースを自動的に信頼する構成は、悪意プルリクエスト1つで全シークレットが流出するリスクを持ちます。CI環境でのエージェント使用は、認可ゲートを明示的に維持できる構成に限定します。
  • Human-in-the-Loopの実質的な運用:Wizの結論部の指摘通り、Human-in-the-Loopが機能するには、承認判断に必要な情報がユーザへ正確に提示される必要があります。承認ダイアログに表示されるファイルパスが実際の書き込みターゲットと一致しているか、そもそも承認ダイアログが書き込みの「前」に表示されているかを、ベンダーごとに確認する運用が推奨されます。

Wizが結論で指摘するように、GhostApprovalは「個別バグの集まりではなく、AIコーディング業界が完全には対処していないカテゴリレベルの設計問題」です。AIエージェントが自律機能の追加競争を続ける中で、ユーザ・エージェント・ファイルシステム間の信頼境界の定義をより明確にする作業が業界全体に求められています。「Human-in-the-Loopを正しく実装する、単に形式的に存在させるのではなく実質的に機能させる」というWizの提言は、GhostApprovalの個別対応を超えて、AIエージェント全般の設計原則として重要です。

一次情報・公式情報

参考情報

コメント

タイトルとURLをコピーしました