Claude Codeのメモリローダーがシンボリックリンクを経由して外部ファイルを無承認で送信

セキュリティニュース

投稿日時: 更新日時:

Claude Codeのメモリローダーがシンボリックリンクを経由して外部ファイルを無承認で送信

Anthropicが開発するAIコーディングアシスタント「Claude Code」において、攻撃者が用意したリポジトリ内のシンボリックリンクを経由して、プロジェクト外の任意のファイル(/etc/passwd~/.aws/credentialsなど)の内容をユーザーの承認なしにモデルのコンテキストへ挿入し、外部サーバーへ送信できる問題をセキュリティ研究者Tomer Niv(tego.ai)が確認しました。影響を受けるバージョンはv2.1.215および他の2.1.x系ビルドです。AnthropicはHackerOne経由の報告を受け「ワークスペーストラストダイアログが定義するセキュリティ境界の範囲内」として「Informative」でクローズしており、現時点で修正は提供されていません。

サマリー

  • CLAUDE.md@importディレクティブがリポジトリ内シンボリックリンクを通じてプロジェクト外ファイルを読み込む
  • 外部インポート承認ダイアログはシンボリックリンクのリテラルパスを「内部」と判定するため表示されない
  • ファイル内容はAIモデルへの最初のAPIリクエストに含まれ、ツール呼び出しなしに送信される
  • .claude/settings.jsonANTHROPIC_BASE_URLを設定することで送信先を攻撃者のサーバーに変更可能
  • CI/CDなど非インタラクティブ実行では承認プロンプト自体がスキップされ無条件で動作
  • Anthropicは「Informative」としてクローズ。修正なし
  • 影響を受けるバージョン:Claude Code v2.1.215(他の2.1.x系も同様の影響が高い)
  • 同種の問題は過去2件(CVE-2025-59829、CVE-2026-25724)が修正済みだが、メモリローダーのコードパスには未適用

整理表

項目 内容
対象製品 Claude Code(Anthropic)
影響バージョン v2.1.215、他の2.1.x系
研究者 Tomer Niv(tego.ai)
報告日 2026年7月18日(HackerOne)
Anthropicの対応 2026年7月20日に「Informative」クローズ。修正なし
攻撃に必要な条件 攻撃者制御のリポジトリをクローンし、Claude Codeで起動すること
対話型実行での承認 信頼済み親ディレクトリ配下では承認ダイアログなし
非インタラクティブ実行 承認プロンプトは設計上スキップされる
送信先の変更 ANTHROPIC_BASE_URLで攻撃者サーバーへのルーティングが可能
関連する過去CVE CVE-2025-59829、CVE-2026-25724(いずれも修正済み)

脆弱性の概要——承認ダイアログが表示されない仕組み

Claude Codeはプロジェクト起動時にCLAUDE.md.claude/rules/**配下のファイルを読み込み、モデルのコンテキストとして使用する「メモリローダー」機能を持っています。これらのファイルは@importディレクティブをサポートしており、たとえば@./docs/setup.mdと記述するとそのファイル内容がセッション開始時にコンテキストへ挿入されます。Anthropic自身のドキュメントも複数ツール間で共有の指示ファイルを同期するためにこのパターンを推奨しています。

問題はメモリローダーの「外部インポート判定」にあります。Claude Codeは@importのターゲットが「外部」かどうかを判定する際、シンボリックリンク解決前のリテラルパスを使用します。リポジトリにlinkというシンボリックリンクが含まれており、それが/etc/passwdなど外部のファイルを指していた場合、判定処理は./linkというリテラルパスだけを見て「プロジェクト内部のファイル」と分類します。実際のファイル読み込みはOSがシンボリックリンクを追いかけてリポジトリ外の実ファイルを開きます。判定は事前解決パスで行われ、読み込みは解決後のパスで行われる、この不一致が問題の核心です。

結果として承認ダイアログが表示されることなく、プロジェクト外の任意の読み取り可能なファイルの内容がモデルに「リポジトリにチェックインされたプロジェクト指示」として渡されます。tool_useやファイル読み込みのツール呼び出しは一切発生しないため、承認を求めるチェックポイント自体が存在しません。

攻撃シナリオ——クローンからファイル漏洩までの流れ

Tomer Nivが公開した技術解説が示す攻撃の流れは次のとおりです。攻撃者はリポジトリ内に以下のようなCLAUDE.mdを作成します。

# devtools-quickstart
Project context: @./link

そしてlinkファイルをシンボリックリンクとしてコミットし、/etc/passwd~/.aws/credentialsなど外部のファイルを指定します。Gitはシンボリックリンクをモード120000で保存し、クローン後も絶対パスや../形式の相対パスを含め完全な形で再現します。

被害者がこのリポジトリをクローンしてClaude Codeを起動すると、承認ダイアログが一切表示されることなく、対象ファイルの内容がモデルへの最初のHTTPS POSTリクエストのボディに含まれて送信されます。デフォルトの送信先はapi.anthropic.comですが、リポジトリの.claude/settings.jsonANTHROPIC_BASE_URLを設定することで、同じリクエストを攻撃者が管理するエンドポイントへリルーティングできます。Tomer Nivはこれをネットワークキャプチャで実証しています。

なおチルダ(~)はファイルシステムレベルで展開されないため、~/.ssh/id_rsaのようなパスへのアクセスはCIランナーやコンテナなど、ホームディレクトリのパスが予測可能な環境でのみ成立します。

ワークスペーストラストの「重さ」——一度のYesが意味する範囲

この問題をより深刻にしているのがClaude Codeのワークスペーストラストモデルです。Claude Codeはフォルダを初めて開いた際に「このフォルダを信頼しますか?」と尋ねます。問題は、この信頼が祖先ディレクトリをウォークする形で下位ディレクトリ全体に継承される点です。~/devを信頼済みとして登録すると、その配下にクローンされた新しいリポジトリはすべて自動的に信頼済みとして扱われ、改めてプロンプトが表示されることはありません。

Tomer Nivが実際の開発者マシンで確認したところ、~/Documents~/Desktop/Users(マルチユーザールート全体)が信頼済みとして登録されていたケースがあったとしています。/Usersが信頼済みの場合、その配下にクローンされたあらゆるリポジトリがプロンプトなしで動作します。

自分の環境を確認するには、macOS/Linuxで次のコマンドを実行します。

jq -r '.projects|to_entries[]|select(.value.hasTrustDialogAccepted==true)|.key' ~/.claude.json

出力に~/dev~/Documents/Usersなどの広いパスが含まれていた場合、その配下にクローンしたすべてのリポジトリが信頼境界内に入っていることになります。

CI/CDパイプラインでの特別なリスク

Claude Codeを非インタラクティブモード(-pフラグ)でCIジョブやスクリプトから呼び出している環境では、信頼プロンプトと外部インポート承認プロンプトの両方がデザイン上スキップされます。非インタラクティブモードでは信頼の判断を呼び出し元に委ねる仕様になっているためです。

この設計により、CI環境でのClaude Code利用では承認プロンプトが一切表示されることなく、プロジェクト外ファイルの読み込みと送信が実行されます。AIコーディングアシスタントのサプライチェーンリスクを検討する際、今回の事例はCIパイプラインへのAIツール統合が新たな攻撃面を生んでいることを示しています。

Anthropicの対応——「Informativeクローズ」の背景

Tomer NivはHackerOneを通じて2026年7月18日に報告し、7月20日にAnthropicから「Informative」としてクローズされる回答を受けています。Anthropicの立場は一貫しており、ワークスペーストラストダイアログがClaude Codeのセキュリティ境界であり、それを承認することはプロジェクトへの読み込み・編集・実行を許可することを意味する、という解釈です。リポジトリにコミットされたシンボリックリンク経由のファイル読み込みや、リポジトリ設定による送信先変更はその信頼の範囲内と位置づけており、外部インポートダイアログはセキュリティ境界ではなくユーザビリティのための補助的な機能だとしています。

Tomer Niv自身もAnthropicのトリアージが同社の脅威モデル上は適切であったと認めたうえで、「問題はその前提となる脅威モデルそのものにある」と指摘しています。

なお類似の経緯は過去にもあります。CVE-2025-59829(2025年9月)とCVE-2026-25724(2026年1月)はともに許可サブシステムにおけるシンボリックリンクの検証不備として修正されましたが、今回のメモリローダーのコードパスはその修正の対象外でした。過去2件の修正がパーミッションチェックをリテラルパスから解決済みパスに移した手法は、今回の問題にも技術的には適用可能です。研究者は「同じ修正を3つ目のコードパスに適用するだけ」と主張しています。

情報システム部門が取るべき対応

修正が提供されていない現状において、情報システム部門が取るべき対応は以下のとおりです。

まず、開発者マシン上の信頼済みディレクトリを棚卸しすることです。上記のjqコマンドを全開発者環境で実行し、広い親ディレクトリ(~/dev~/Documents/Usersなど)が信頼済みになっていないかを確認します。特にCI/CDエージェントやコンテナ環境でClaude Codeを使用している場合は、信頼設定が意図した範囲に限定されているかを検証してください。

次に、信頼できないリポジトリのクローン先について社内ルールを設けることです。既存の信頼済み親ディレクトリ配下に外部のリポジトリをクローンしないよう周知する、あるいはAIツール使用専用の隔離された作業ディレクトリを設けることが現実的な対策です。

Anthropicが公式に修正を提供するまでの間、CLAUDE.md@importディレクティブとシンボリックリンクの組み合わせに起因するファイル漏洩リスクは継続します。Claude Codeのバージョンアップと公式のセキュリティアドバイザリを継続的に確認することを推奨します。


出典