あなたのAIコーディングアシスタントが、気づかないうちにSSHキーを書き換えているかもしれません。

Wiz Researchは、「GhostApproval」と呼ばれる脆弱性を発見しました。これは、悪意のある project_settings.json のシンボリックリンク(symlink)がプライベートキーを指すように仕向け、アクションごとの承認ダイアログにはシンボリックリンクの名前しか表示されないというものです。ダイアログを承認してしまうと、アシスタントに認証情報への無制限のアクセス権を与えてしまうことになります。

エクスプロイトの仕組み

  • 攻撃者がリポジトリに project_settings.json というファイルを追加します。
  • そのファイルは通常のJSONファイルではなく、ユーザーの ~/.ssh/id_rsa(または同等のもの)のプライベートキーへリダイレクトするシンボリックリンク(symlink)です。
  • 開発者がAIアシスタントに「ワークスペースをセットアップして」と依頼すると、アシスタントはシンボリックリンクを辿り、実際のSSHキーファイルへの書き込み準備を行います。
  • 表示される承認ダイアログには project_settings.json しか記載されません。シンボリックリンクを解決して、ディスク上の実際のパスを表示することはありません。
  • 「Approve(承認)」をクリックすると、アシスタントにプライベートキーを修正する権限が与えられ、そのキーを信頼しているすべてのサービスにおいて、実質的にユーザーのアイデンティティが侵害されます。

このバグは、広く使用されている6つのツール、Amazon Q Developer、Claude Code、Augment、Cursor、Google Antigravity、および Windsurf に存在します。これらすべてにおいて、UIが受け取った名前を表示し、解決されたターゲットを表示しないため、同じ誤解を招くダイアログが表示されます。

なぜアクションごとのダイアログでは不十分なのか

アクションごとの承認は、人間がAIが行う各操作を精査できることを前提としています。実際には、数秒おきに完璧な判断を下すことを強いることになりますが、エージェントの動作速度に人間が追いつくことは不可能です。

ベンダーの対応 — そしてそれがなぜ重要なのか

  • Amazon、Google、Cursor はすでに修正済みです。
  • Anthropic(Claude Codeの開発元)は、ユーザーは理解できるものだけを承認すべきだと述べています。しかし、これはシンボリックリンクを見抜くための認知負荷を無視しており、ユーザーがすべてのファイルパスを即座に監査できるという非現実的な期待に基づいています。
  • Cursor はまた、承認プロンプトなしで攻撃者がマシン上でコードを実行できる DuneSlide と呼ばれる別の問題を公開しました。同社はこのバグを修正しましたが、これは権限チェックが脆弱な場合、これらのアシスタントがいかに迅速に攻撃ベクトルになり得るかを示しています。

対応の分かれ方は、より深い問いを投げかけています。セキュリティとは、事後的なダイアログであるべきか、それともアシスタントが決して越えてはならない事前定義された境界であるべきでしょうか?

スコープ付き権限:実用的な代替案

各ファイル操作ごとにプロンプトを表示する代わりに、開発者はアシスタントを実行する前に**スコープ(範囲)**を設定できます。

  • AIが読み書きできるディレクトリツリー(例:/src)を定義します。
  • ~/.ssh/id_rsa のような、そのツリー外のファイルに触れようとする試みは、オペレーティングシステムまたはサンドボックス層によってブロックされます。
  • スコープは一度設定すれば済み、アシスタントの影響を抑えつつ、人間が下さなければならない判断の回数を減らすことができます。

スコープ設定は、セキュリティモデルを「毎回確認する」から「必要なものだけを許可する」へと転換させます。これは、コンテナランタイムやモバイルOSがアプリケーションをサンドボックス化して、問題が発生した際の影響を制限する方法と同様です。

今後の注目点

  • ベンダーによる展開: 影響を受ける6つのツールのアップデートノートに注意してください。

結論

GhostApprovalのエクスプロイトは、ポップアップダイアログを信頼することが誤った安心感を与えることを証明しています。すべてのAIコーディングアシスタントがシンボリックリンクを解決してフルパスを表示するようになるまでは、開発者はスコープ付きの書き込み権限を強制すべきです。つまり、アシスタントが作業を開始する前に、どこで作業できるかを正確に伝えることです。その単純な変更によって、クリック疲れを引き起こすことなく、最も危険な種類の攻撃を防ぐことができます。

Source: dev.to/girish_r/your-coding-agents-approval-dialog-is-lying-to-you-ih1