GhostApproval(ゴーストアプルーバル)は、Wizが2026年7月8日に公表した、AIコーディング支援6種に共通する「信頼境界の欠陥」です。同じ穴を先に突いたAdversa AIの研究は SymJack(シムジャック)と名付けられ、2026年5月26日に公開されています。ひとことで言えば——AIエージェントの承認ダイアログに表示されるファイル名と、OSのカーネルが実際に書き込む先が、symlink(シンボリックリンク)によってすり替わる。あなたが承認したのは無害に見えるproject_settings.jsonなのに、書き込まれるのは~/.ssh/authorized_keysだった、という事故が成立します。

この記事の主題は3つです。1つ目は、なぜ「承認したはずのファイル」と「実際に書かれるファイル」がズレるのか——symlinkとフルパス表示という、Unix時代からある古い仕様がAIエージェントの承認フローと噛み合った瞬間に何が起きるのか。2つ目は、6種それぞれのベンダーがどう反応したか。修正したツール、係争中のツール、公表時点で未修正だったツール——そしてAnthropic(Claude Code)が当初「脅威モデルの範囲外」と分類した経緯を、煽らず一次ソースに沿って正確に。3つ目は、あなたが自分の環境で今すぐ実行できる、読み取り専用の確認コマンドです。攻撃の再現手順は載せません。防御側が仕込まれたsymlinkを検出し、被害の有無を確かめるための手順に絞ります。

まずは、当サイト(AI Heartland)が実際に手を動かして確かめた「防御側の検出」の様子から。信頼できないリポジトリに仕込まれた偽装symlinkを、1行のコマンドで炙り出したところです。

find コマンドで、無害に見える project_settings.json の実体が ~/.ssh/authorized_keys を指すsymlinkであること、mcp.json がワークスペース外を指すことを検出したターミナル出力
編集部がmacOS上で実際に実行した検出コマンドの出力。無害な名前のファイルが機密ファイルを指すsymlinkであること、ワークスペース外を指すsymlinkがあることを、実行前に読み取り専用で炙り出せる。攻撃の再現ではなく、あくまで防御側の確認手順。
30秒でわかるポイント
  • 何が起きるか:悪意あるリポジトリが、無害な名前のファイル(例 project_settings.json)の実体を symlink で機密ファイル(例 ~/.ssh/authorized_keys)に向ける。承認ダイアログは偽のパスを表示するため、承認するとカーネルは別の場所へ書き込む。
  • 研究名GhostApproval(Wiz・2026-07-08)と SymJack(Adversa・2026-05-26)。独立した2つの研究が同じクラスの欠陥を報告した。
  • 採番済みCVE:Amazon Q(Language Servers for AWS)が CVE-2026-12958(CVSS 4.0で8.5・v1.69.0で修正)。Cursorのsymlink問題は CVE-2026-50549(別記事で詳述)。
  • Anthropicの経緯:当初「脅威モデルの範囲外」と分類。一方でsymlink警告は報告より前に予防的ハードニングとして投入済みだったと説明(Wiz報道)。現行版で書き込み前のsymlink解決を強化。
  • 今やること:各ツールを修正版へ更新し、信頼できないリポジトリを開く前に find . -type l -ls でsymlinkを確認する。

なお、サプライチェーン攻撃全体の手法・防御ツールを体系的に押さえたい場合は、ピラー記事サプライチェーンセキュリティ2026|攻撃手法・防御ツール・実践チェックリストを先に読むと、本件の位置づけが掴みやすくなります。本記事はその中でも「AIコーディングエージェント固有の、承認フローを騙す新しい攻撃面」に絞って掘り下げます。

GhostApproval・SymJackとは — AIコーディング支援のsymlink承認ハイジャック

GhostApprovalとSymJackは、名前こそ違え、AIコーディングエージェントが持つ「承認(approval)」という安全機構そのものを無力化する攻撃です。まずは全体像を、独立した2つの研究として正確に区別します。

SymJack(Adversa AI・2026年5月26日公表、翌27日更新)は、この一連の問題を最初に公にした研究です。Adversaは「the approval prompt is lying to you(承認プロンプトはあなたに嘘をついている)」という刺激的な題で、複数のAIコーディングCLIに対して攻撃が成立することを示しました。GhostApproval(Wiz・2026年7月8日公表)は、それを別チームが独立に再発見・体系化し、対象を6種のAIコーディング支援として整理したものです。両者は独立した報告であり、対象ツールの一覧は重なりつつも一致しません。この「複数チームが独立に同じ穴を掘り当てた」という事実自体が、これが特定製品のバグではなくカテゴリ全体に及ぶ構造的な欠陥であることを物語っています。

💡 「承認」はなぜ安全機構になり得るのか
現代のAIコーディングエージェントは、ファイル書き込みやシェルコマンドなど「危険な操作」の直前に、ユーザーへ確認ダイアログを出します。「このファイルを編集していい?」——このワンクッションが、暴走やプロンプトインジェクションに対する最後の砦です。GhostApproval/SymJackが突くのは、まさにこの砦。ユーザーが見ている情報(表示パス)と、システムが実際に行う操作(書き込み先)を食い違わせることで、正しく承認したはずのユーザーを、意図しない書き込みに加担させてしまいます。

Wizはこの欠陥を、2つの弱点タイプの組み合わせとして説明しています。ひとつは symlink following(CWE-61・シンボリックリンクの追跡)——エージェントがファイルを開くときに、そのファイルがsymlinkだった場合、リンク先の実体を追ってしまうこと。もうひとつは 情報表示の不備(CWE-451・重要情報のUI上の誤表現)——承認ダイアログが、解決後の実際の書き込み先ではなく、リポジトリ内の見かけ上のパスを表示してしまうこと。NVDはCursorの同種の欠陥(CVE-2026-50549)を CWE-59(ファイルアクセス前のリンク解決の不備) として分類しています。呼び名や整理は研究・機関によって多少異なりますが、指している現象は同じです。

技術的な要点を3行でまとめると、こうなります。

・悪意あるリポジトリに、無害な名前(project_settings.jsonREADME内で参照されるファイルなど)でsymlinkを仕込む。その実体は~/.ssh/authorized_keysや各エージェントの設定ファイルを指す。
・ユーザー(またはエージェント)が「そのファイルを編集する」操作を承認する。ダイアログにはリポジトリ内の見かけ上のパスが表示される。
・カーネルはsymlinkを解決し、ワークスペース外の実体へ書き込む。SSH公開鍵の注入やエージェント設定の乗っ取りにつながり、最終的にリモートアクセスや任意コード実行(RCE)に至り得る。

時系列 — SymJack(2026年5月)からGhostApproval(7月)公開まで

この問題は一度に表面化したわけではありません。非公開でのベンダー報告、独立した2チームによる公表、CVEの採番、修正版の展開——複数の出来事が数か月にわたって折り重なっています。以下は、公開情報として日付が確認できるものを軸に、Wizが開示記録として示した経緯を補って整理したタイムラインです。

timeline title GhostApproval / SymJack 開示タイムライン(公開情報ベース) 2026-02 : Wizが各ベンダーへ非公開で報告を開始
Anthropicは「脅威モデルの範囲外」と分類(Wiz開示記録) 2026-05-26 : Adversa AIが「SymJack」として先行公表
複数のAIコーディングCLIで攻撃成立を提示 2026-06-23 : CVE-2026-12958 採番・公開(NVD)
Amazon Q=Language Servers 1.69.0で修正 2026-06-25 : CVE-2026-50549 採番・公開(Cursor・NVD) 2026-07-08 : WizがGhostApprovalとして6種を体系化して公表

まず押さえておきたいのは、公表そのものはAdversa(SymJack)が先だったという点です。Adversaが5月26日に問題を公にし、その後6月にAmazon Q(CVE-2026-12958)とCursor(CVE-2026-50549)のCVEが相次いで採番・公開され、7月8日にWizがGhostApprovalとして6種を横断的に整理しました。研究の呼び名は違っても、指している欠陥のクラスは共通しています。

Wizが公開した開示記録によれば、非公開でのベンダー報告は2026年2月に始まりました。Wizはこの時期にAnthropicをはじめ複数のベンダーへ順次報告し、各社の反応を記録しています。Anthropicがこの時点で報告を「Claude Codeの脅威モデルの範囲外」と分類した、というのがこの時系列の山場です。ただし後述するように、これは単純な「否認」として片づけられる話ではありません。

📌 日付の扱いについて
上のタイムラインでハードな公開日付として確認できるのは、Adversaの公表(2026-05-26)、CVE-2026-12958の公開(NVD・2026-06-23)、CVE-2026-50549の公開(NVD・2026-06-25)、Wizの公表(2026-07-08)です。一方、2月の非公開報告や各社の初動といった私的開示フェーズの細かな日付は、Wizの開示記録に基づく記述であり、本記事では出典を明示したうえで「およそ2月」として扱います。裏の取れない細部は、断定を避けます。

何が起きたのか — symlinkが承認ダイアログをすり抜ける仕組み

なぜ「承認したファイル」と「実際に書かれるファイル」がズレるのか。ここは攻撃の核心ですが、防御に必要な範囲——どこで表示と実体が食い違うのか——に絞って説明します。攻撃を再現するための具体的な仕込み手順は記載しません。

鍵はsymlink(シンボリックリンク)です。symlinkは「別のファイルのパス名を格納した、小さな道標ファイル」です。project_settings.jsonという名前のsymlinkが、その中身として/Users/you/.ssh/authorized_keysという文字列を持っていれば、多くのプログラムはproject_settings.jsonを開いた瞬間、道標をたどってauthorized_keysの実体を読み書きします。これはUnix由来の正常な仕様であって、バグではありません。問題は、AIエージェントの承認ダイアログが、この「道標をたどった先」ではなく「道標そのものの名前」を表示してしまうことにあります。

承認ダイアログが表示するパス(project_settings.json)と、カーネルがsymlinkを解決して実際に書き込む先(~/.ssh/authorized_keys)が食い違う様子を示した図
承認ダイアログが表示する「見かけ上のパス」と、カーネルが実際に書き込む「解決後のパス」の食い違い。ユーザーは正しく承認したつもりでも、書き込み先は別の場所になる。

Adversaが示した典型的な筋書きはこうです。悪意あるリポジトリのREADMEや指示が、エージェントに「このリポジトリ内のファイルをコピー/編集して」と依頼する。エージェントは一見無害なファイル操作としてユーザーに承認を求める(Adversaの例では「動画ファイルのコピー」のように、まったく警戒されない操作)。ユーザーが承認すると、カーネルはsymlinkを解決し、エージェント自身の設定ファイルを上書きする。次回エージェントを起動したとき、書き換えられた設定によって悪意あるMCPサーバーが起動し、ユーザー権限で任意コードを実行する——という流れです。

書き込み先の候補は、攻撃者にとって「刺されば大きい」場所ばかりです。

flowchart TD A["悪意あるリポジトリ
無害な名前のsymlinkを同梱"] --> B{"エージェントが
ファイル書き込みを提案"} B --> C["承認ダイアログ
見かけ上のパスを表示
例: project_settings.json"] C -->|"ユーザーが承認"| D["カーネルがsymlinkを解決"] D --> E["ワークスペース外へ書き込み"] E --> F1["~/.ssh/authorized_keys
→ SSH公開鍵を注入・リモートアクセス"] E --> F2["エージェント設定 / .mcp.json
→ 次回起動で悪性MCPが実行・RCE"] E --> F3["~/.zshrc / ~/.bashrc
→ 次回シェル起動でコマンド実行"]

ここで重要なのは、この攻撃が「プロンプトインジェクション」単体では完結しないという点です。多くのエージェントは、ファイル書き込みの前に人間の承認を挟むよう設計されています。GhostApproval/SymJackが巧妙なのは、その承認という関門を、嘘の表示によって無害化するところにあります。つまり守るべき砦は健在に見えるのに、砦の門番が別の書類を見せられて判子を押してしまう。Adversaが「承認プロンプトはあなたに嘘をついている」と表現したのは、この構図を指しています。

⚠️ なぜAI開発ツール固有の「新しい」攻撃面なのか
symlink自体は数十年前からある機能で、symlink追跡による書き込みの罠も新しくはありません。新しいのは、AIエージェントが「人間の承認」を安全機構の中心に据えているという前提です。エージェントは大量のファイル操作を提案し、人間はそれを一つひとつ承認する。この「承認の量」と「表示への信頼」が、古いsymlinkの罠に格好の土台を与えました。当サイトが繰り返し扱ってきた通り、AI開発ツールは信頼境界(trust boundary)の引き直しを迫られています。関連して、Claude Codeの通信面を突く攻撃は[Claude CodeのMCP通信ハイジャックでOAuthトークンが窃取される攻撃|検知・対応・防御の手順](/security/claude-code-mcp-hijack/)でも扱っています。

ベンダー対応と影響範囲マトリクス — GhostApprovalに各社はどう答えたか

ここが本記事で最も慎重に書くべき箇所です。「誰が修正し、誰が係争中で、誰が公表時点で未修正だったか」を、一次ソースに沿って、煽らずに整理します。前提として、ステータスは時点情報です。GhostApprovalの各社対応はWiz公表の2026年7月8日時点、SymJackの各社対応はAdversa公表の2026年5月26日時点のものであり、その後変化している可能性があります。

まず、Wizが挙げたGhostApprovalの6種を、修正版バージョンとともにマトリクスにまとめます。これが「6種それぞれどこで直ったか」の一覧です。

ツール ベンダー 対応状況(2026-07-08 Wiz公表時点) CVE / 修正版
Amazon Q Developer AWS 修正済み(自動更新) CVE-2026-12958/Language Servers 1.69.0 で修正
Cursor Anysphere 修正済み CVE-2026-50549/Cursor 3.0 で修正(詳細は別記事)
Google Antigravity Google 修正済み(CVE採番は評価中) 番号未定/修正版で対応
Anthropic Claude Code Anthropic 脅威モデル範囲外と分類・別途ハードニング CVEなし/2.1系でsymlink処理を強化(後述)
Augment Augment 対応中(公表時点で未完了) CVEなし/未修正(当時)
Windsurf Windsurf 認知済み・修正未展開 CVEなし/未修正(当時)

CVEとして正式に採番され、NVDで裏が取れているのは Amazon QのCVE-2026-12958 です。NVDの記述は明快で、「Language Servers for AWSのsymlink検証の欠如により、ワークスペースの信頼境界外への任意ファイル書き込みが起こり得る。バージョン1.69.0以上へ更新することで解消する」とされています。CVSSは4.0で8.5(HIGH)、3.1で7.8(HIGH)。攻撃元区分はローカル(AV:L)で、ユーザーの関与(UI)を要する——まさに「ユーザーが承認する」ことを前提にした攻撃であることが、スコアのベクトルからも読み取れます。AWSはセキュリティ速報2026-047として公表し、言語サーバはネットワークでブロックされていない限り自動更新される、と案内しています。

6種のAIコーディング支援のベンダー対応を、修正済み・係争/範囲外・未修正の3群に色分けした図
Wiz公表(2026-07-08)時点のベンダー対応の分布。修正済み(Amazon Q・Cursor・Antigravity)、脅威モデル範囲外と分類(Claude Code)、公表時点で未修正(Augment・Windsurf)。ステータスは時点情報で、その後変化し得る。

Anthropic(Claude Code)の経緯を正確に

この記事のなかで、いちばん誤読されやすいのがAnthropicの対応です。「否認した」という一語で片づけると不正確になるため、Wizの報告に沿って経緯を分解します。

Wizによれば、Anthropicは当初この報告を「Claude Codeの脅威モデルの範囲外(outside our current threat model)」と分類しました。その論拠は、①ユーザーはClaude Codeをディレクトリで起動する際、そのディレクトリを信頼すると事前に確認している、②その上で承認プロンプトを明示的に承認している——つまり「信頼の確認」と「明示的な承認」という2つの判断をユーザー自身が下している以上、悪意あるsymlinkを含むディレクトリでの承認は脅威モデルの外だ、という整理です。

一方で、Wizは重要な補足も伝えています。Anthropicは、symlinkに関する警告を、この報告を受け取るより前の2026年2月5日にv2.1.32へ、社内レビューに基づく予防的なセキュリティハードニングとして既に投入していた、と説明しているのです。つまりAnthropic側の立場は「報告を受けて慌てて直した」ではなく「関連する強化はもともと進めていた」というものです。研究者側(Adversa)は、この一連の変化を「承認フローが静かにハードニングされ、symlink解決後のパスを表示するようになった」と特徴づけています。Anthropicの主張(予防的・報告以前)と、研究者の見え方(静かなハードニング)の両方を併記するのが、この件の公平な描き方です。

📎 バージョン番号を断定しない理由
「予防的ハードニングとして2026-02-05にv2.1.32へsymlink警告を投入」という点は、Wizの報道および複数の海外セキュリティ媒体の記述が一致しており、出典を明示したうえで記載しています。一方、「書き込み前にsymlinkを完全に解決してから承認プロンプトを出す」というより踏み込んだ修正が、正確にどのパッチバージョンで入ったかは、報道によって数値が食い違います。当サイトはこの数値を断定せず、「現行の2.1系で強化が進んでいる/最新版へ更新する」という実務的な案内に留めます。なお、Anthropicの公式CHANGELOGでも2.1系の後半に .claude/settings.json がsymlinkの場合の挙動修正が複数入っており、2.1系でsymlink周りの手当てが継続していること自体は公式ログからも確認できます。

Anthropicだけを取り上げると不公平になるので、「明示的な承認は意図された動作だ」という論拠は、複数のベンダーに共通していた点も添えます。Adversaの5月時点の記録では、Google(Gemini CLI/Antigravity CLI)は「単一ユーザーの自己攻撃であり、明示的な承認は意図された動作」として却下、OpenAI(Codex CLI)も同様に「明示的な承認は意図された動作」として却下し、委託先のトリアージでは「理論的」と評価された、とされています。「ユーザーが承認したのだから範囲外」という反応は、Anthropicに固有のものではなく、この攻撃クラスに対する業界共通の初期反応だったわけです。そしてそれこそが、GhostApproval/SymJackが問いかけている核心——その「承認」自体が嘘の表示によって騙されているのに、承認を免罪符にしてよいのか——を浮き彫りにします。

SymJack(Adversa)が挙げた追加のツール

Wizの6種とは別に、Adversaのsymjack研究は別の顔ぶれを対象にしていました。両者の対象は重なりつつも一致しないため、混同を避けて別表にまとめます(Adversa公表の2026-05-26時点)。

ツール(Adversa SymJack) 対応状況(2026-05-26 Adversa公表時点)
Claude Code(Anthropic) 範囲外と分類・別途ハードニング(Wizと重複)
Cursor Agent CLI(Anysphere) 既存のsymlink報告の重複として却下
Gemini CLI/Antigravity CLI(Google) 却下(自己攻撃・明示承認は意図された動作)
OpenAI Codex CLI 却下(明示承認は意図された動作・トリアージで「理論的」)
GitHub Copilot CLI 回答待ち(当時)
xAI Grok Build CLI 回答待ち(当時)

こうして2つの表を並べると、Claude Code・Cursor・Antigravityが両研究に共通して登場する一方、Amazon Q・Augment・WindsurfはWiz側にのみ、Copilot CLI・Codex CLI・Grok BuildはAdversa側にのみ登場することが見て取れます。独立した2チームが、部分的に重なる別々のツール群で同じ欠陥を実証した——この事実が、問題がカテゴリ全体に及ぶことの何よりの証拠です。

なお、Cursorのsymlink関連の欠陥であるCVE-2026-50549は、当サイトの別記事Cursor IDE脆弱性DuneSlide解説|CVE-2026-50548/50549でゼロクリックRCEで、Cato Networksが公表したCursor固有の文脈(DuneSlide)とあわせて詳述しています。本記事は「6種横断のsymlink承認ハイジャック」に軸足を置くため、Cursorはマトリクスの1行として位置づけ、CVEの深掘りは重複を避けてそちらに譲ります。

対策手順 — 緊急・推奨・長期の3段階

対策は「今すぐやること」「腰を据えてやること」「設計として抱えるべきこと」の3段階に分けると整理しやすくなります。攻撃の再現手順ではなく、防御と緩和のみを扱います。

🔴 緊急(今日中):修正版へ更新する
Amazon Q Developer:Language Servers for AWSを 1.69.0以上へ。AWSによれば自動更新されるが、ネットワークで更新がブロックされていないかを確認する。
Cursor3.0以上へ更新(cursor --version で確認)。
Claude Code:最新版へ更新。2.1系でsymlink処理の強化が続いている。
Google Antigravity:修正版が出ているため最新へ更新する。
Augment・Windsurf:Wiz公表時点で未修正だった。最新のリリースノート/セキュリティ告知を確認し、修正が出ていれば即更新する。
🟡 推奨(今週中):未信頼リポジトリの扱いを変える
・信頼できないリポジトリ(見知らぬOSS、素性の不明なPR、送られてきたzipなど)をAIエージェントで開く前に、後述の確認コマンドで symlink を洗い出す。
・公表時点で未修正だったツール(Augment・Windsurf)を使う場合は、素性の知れないリポジトリをそのエージェントで開かないことが当面の最も確実な緩和策。
・エージェントの自動承認(auto-approve/YOLOモード相当)を無効化し、ファイル書き込みは人間が個別に承認する運用に戻す。
・「このディレクトリを信頼しますか?」というプロンプトを惰性で承認しない。信頼の可否は、リポジトリの出所で判断する。
🟢 長期(設計として):承認を過信しない多層防御
・素性の知れないコードは、コンテナ/devcontainer/VMなど、ホームディレクトリや鍵から隔離された環境で開く。symlinkがワークスペース外を指しても、隔離環境の外には届かない。
・エージェントを動かすユーザーの権限を最小化し、~/.ssh や設定ファイルへの書き込みを不要に許さない。
・CI環境は特に注意。CIランナーはデプロイ鍵・署名材料・クラウド認証情報を抱えており、悪意あるPR一本で持ち出され得る(Adversaが強調した点)。
・本質的な解決はツール側にある——承認プロンプトを出す前にsymlinkを解決し、書き込み先がワークスペース外なら明示的に警告すること。ユーザーとしては、この挙動を備えた最新版を使うことが最良の防御になる。

「AIエージェントの暴走コマンドを実行前に止める」という発想自体は、承認フロー以外のガードレールでも実装が進んでいます。そうした「実行前ブロック」の考え方は、当サイトのサプライチェーン/エージェント安全性の記事群とあわせて読むと、多層防御の全体像が掴めます。

自システムでの確認方法 — symlinkを検出する読み取り専用コマンド

ここが当サイトの本領です。以下はすべて読み取り専用で、ファイルを書き換えたり攻撃を再現したりしません。信頼できないリポジトリを開く前、あるいは「もしかして踏んだかも」と不安なときに、自分の環境で実行して確かめるためのコマンドです。編集部がmacOS(Darwin)で実際に実行し、出力を確認しています。

① リポジトリ内のsymlinkをすべて洗い出す(最も基本)

信頼できないリポジトリのルートで、まずこれを実行します。無害な名前のファイルがsymlinkだったら、それだけで警戒の対象です。

# カレント配下のsymlinkを、リンク先つきで一覧表示(読み取りのみ)
find . -type l -ls

編集部が仕込みを模したテスト用ディレクトリで実行すると、project_settings.json の実体が .ssh/authorized_keys を指すsymlinkであることが一目で分かりました。設定ファイルやドキュメントの名前をしているのに l(symlink)で始まる行があれば、中身を確認すべきサインです。

② 各symlinkが「どこを指しているか」を解決して表示する

一覧だけでなく、リンク先の実体パスまで並べて確認します。

# 各symlinkの「見かけの名前 → 実際の指し先」を表示
find . -type l -exec sh -c 'for p; do printf "%s -> %s\n" "$p" "$(readlink "$p")"; done' _ {} +

③ ワークスペースの外を指すsymlinkだけを警告する(最重要)

GhostApproval/SymJackの本質は「ワークスペース外への書き込み」です。そこで、リンク先がカレントディレクトリの外に出るものだけを炙り出します。~/.ssh~/.zshrc/etc などを指すsymlinkがここに出たら、明確な危険信号です。

# リンク先がリポジトリ(カレント)の外を指すsymlinkだけを ⚠ 表示
find . -type l | while read -r l; do
  target=$(readlink -f "$l" 2>/dev/null)
  repo=$(pwd)
  case "$target" in
    "$repo"/*) : ;;                       # リポジトリ内 → 問題なし
    *) echo "⚠ ESCAPES WORKSPACE: $l -> $target" ;;  # 外を指す → 要確認
  esac
done

編集部の環境では、/etc/hosts を指すsymlink(mcp.json)を仕込んだところ、⚠ ESCAPES WORKSPACE: ./mcp.json -> /private/etc/hosts と正しく警告が出ました。冒頭のターミナル画像は、この出力を撮ったものです。macOSでは readlink -f が使えます(古い環境で使えない場合は python3 -c "import os,sys;print(os.path.realpath(sys.argv[1]))" "$l" で代替できます)。

④ 「刺さると痛い」ファイルに身に覚えのない追記がないか監査する

万一すでに踏んでいた場合に備え、攻撃者が狙う代表的な書き込み先を点検します。いずれも表示するだけの読み取り専用です。

# SSH公開鍵に身に覚えのない鍵が注入されていないか
cat ~/.ssh/authorized_keys 2>/dev/null

# シェル起動時に走る設定に不審なコマンドが混じっていないか
tail -n 20 ~/.zshrc ~/.bashrc 2>/dev/null

# 各エージェントの設定 / MCP定義に見覚えのないサーバーが無いか
cat ~/.claude/settings.json 2>/dev/null
find . -maxdepth 2 -name ".mcp.json" -exec cat {} +

⑤ 使っているツールが修正版かをバージョンで確認する

# Claude Code(最新版へ)
claude --version

# Cursor(3.0以上であること)
cursor --version

# Amazon Q は Language Servers for AWS 1.69.0 以上であること
# (IDEの拡張機能/言語サーバのバージョン表示で確認)
💡 運用に落とすなら
③のワークスペース脱出チェックは、信頼できないリポジトリを開く前の“検疫”として習慣化する価値があります。clone した直後、AIエージェントを起動する前に一度流す。出力が空なら(=外を指すsymlinkが無ければ)通常運用へ、⚠ ESCAPES WORKSPACE が出たら中身を精査する、という運用です。完璧な防壁ではありませんが、「承認ダイアログの表示を信じる前に、自分の目で実体を確かめる」という一手間が、この攻撃クラスに対する現実的な最初の一枚になります。

まとめ — GhostApproval/SymJackが示す新しい攻撃面

GhostApproval(Wiz)とSymJack(Adversa)は、AIコーディングエージェントの「承認」という安全機構が、symlinkという古い仕様によって静かに無力化され得ることを、独立した2チームが別々のツール群で実証した事例です。承認ダイアログが表示するパスと、カーネルが実際に書き込む先が食い違う——たったそれだけの食い違いが、SSH鍵の注入やエージェント設定の乗っ取りを通じてRCEにつながります。

一次ソースで確実に裏が取れるのは、Amazon QのCVE-2026-12958(CVSS 4.0で8.5・Language Servers 1.69.0で修正) です。Cursorはsymlink関連のCVE-2026-50549を3.0で修正済み(詳細は別記事)。Anthropic(Claude Code)は当初「脅威モデルの範囲外」と分類しつつ、symlink警告は報告以前に予防的ハードニングとして投入済みだったと説明しており、現行の2.1系で書き込み前のsymlink解決を強化しています——この経緯は、煽らず正確に受け止めるべきものです。そして「明示的な承認は意図された動作」という初期反応は、Google・OpenAIを含む複数ベンダーに共通していました。

ユーザーとして今できることは、明快です。各ツールを修正版へ更新し、信頼できないリポジトリを開く前に find . -type l でsymlinkを確かめる。 承認ダイアログの表示を鵜呑みにせず、自分の目で実体を確認する——この一手間が、AI開発ツール固有の新しい攻撃面に対する、最も現実的な守りになります。

参照ソース

GhostApproval: A Trust Boundary Gap in AI Coding Assistants(Wiz) — 6種の対象・ベンダー対応・Anthropicの経緯・開示記録の一次ソース
SymJack: the approval prompt is lying to you(Adversa AI) — 先行研究。攻撃クラスの概念と各社の初期反応
NVD — CVE-2026-12958 — Amazon Q / Language Servers for AWS。CVSS・修正版1.69.0・公開日の一次データ
AWS Security Bulletin 2026-047 — AWS公式の告知(自動更新の案内)
GHSA-6v3r-4p5c-mrp5(aws/language-servers) — GitHub Security Advisory