ShadowPrompt:あらゆるウェブサイトがClaudeのChrome拡張機能を乗っ取れた仕組み

Anthropicが提供するClaude Chrome Extensionは、300万人を超えるユーザーに利用されています。これはブラウザのサイドバーに常駐するAIアシスタントで、ページの閲覧やコンテンツの読み取り、JavaScriptの実行、ユーザーに代わってウェブサイトを操作することができます。

私たちは、あたかもユーザー自身が入力したかのように、任意のウェブサイトがこのアシスタントにプロンプトをひそかに注入できる脆弱性を発見しました。クリックも許可プロンプトも一切不要です。ページを開くだけで、攻撃者がブラウザを完全に掌握できてしまいます。

Image

この攻撃は2つの欠陥を連鎖させたものです。1つは拡張機能における過度に許容的なオリジンの許可リスト(*.claude.ai)、もう1つはa-cdn.claude.ai上でホストされているArkose Labs製CAPTCHAコンポーネントに存在するDOMベースのXSSです。この2つを組み合わせることで、攻撃者はClaudeに対して任意の指示を送信できてしまいます。そしてClaudeは、ユーザーに対して与えているのと同じ信頼と権限のもとで、その指示を実行してしまうのです。

Claude Chrome Extensionを利用している方は、インストール済みのバージョンが1.0.41以上であることを確認してください。これより前のバージョンは、依然として脆弱である可能性があります。chrome://extensionsを開いてClaude拡張機能を探し、バージョン番号を確認してください。

攻撃者は実際に何ができたのか

ほぼ何でもできてしまいます。Gmailのアクセストークンを盗む、Googleドライブを読み取る、LLMのチャット履歴をエクスポートする、なりすましてメールを送信する――これらすべてが、クリックひとつ、許可プロンプトひとつなしで実行可能でした。

ここでは、ShadowPrompt脆弱性を悪用してGoogleアカウントを盗み取る悪意あるウェブサイトのデモをご紹介します。攻撃者はGmail、ドライブ、連絡先に対する永続的なアクセストークンを取得します。

デモではわかりやすさのため、すべてアクティブタブ上で行っていますが、実際には悪意あるウェブサイトはバックグラウンドタブを作成してこれを操作したり、Claudeのサイドバーがまだ開いていない場合はそれを開かせたりすることも可能です。

では、この仕組みはどのように成立するのでしょうか。

*.claude.aiから完全な乗っ取りへ

ワイルドカードの問題

発端はClaude Chrome Extensionのメッセージング用APIでした。Chrome拡張機能は、chrome.runtime.sendMessage()を通じてウェブページからメッセージを受け取ることができます。

そのうちの1つのメッセージタイプ、onboarding_taskに注目しました。これはpromptパラメータを受け取り、それを直接Claudeに送って実行させます。本来これはオンボーディングのデモ用フロー向けに設計されたものですが、拡張機能はオリジンを区別していません。*.claude.aiのサブドメインであればどのページからでもプロンプトを送信でき、Claudeはそれを実行してしまいます。

そこで問題は、「JavaScriptを実行できる*.claude.aiのサブドメインは存在するのか」という点に絞られました。

CAPTCHA用サブドメイン

AnthropicはCAPTCHA認証にArkose Labsを利用しており、Arkoseはそのチャレンジ用コンポーネントをa-cdn.claude.ai上でホストしています。つまり、ファーストパーティのサブドメイン上でサードパーティのベンダーコードが動作している状態です。

ところが拡張機能側はこれを区別しません。a-cdn.claude.ai*.claude.aiにマッチするため、claude.ai自体と同じメッセージング権限を得てしまいます。ここでJavaScriptを実行できれば、Claudeにプロンプトを送信できるはずです。

バージョン探し

Arkose LabsのCDNには、さまざまな種類のCAPTCHAチャレンジがホストされています。利用できそうなものがないか、一つひとつ調べていきました。ほとんどのコンポーネントはしっかりと作り込まれていましたが、あるURLの中に気になる点を見つけました。

/fc/assets/ec-game-core/game-core/1.26.0/standard/index.html

バージョン番号です。バージョン管理されたURLがあるということは、古いバージョンがまだデプロイされたまま残っている可能性があります。1.26.0を起点に、バージョン番号を遡ってブルートフォース的に調べていきました。すると、古いバージョンがまだ稼働しており、しかも現行バージョンにはない脆弱性を抱えていることがわかりました。

XSSの正体

この脆弱なgame-coreコンポーネントには、2つのミスに起因するDOMベースのXSSが存在していました。

第一に、このコンポーネントはあらゆるウェブサイトからのメッセージを受け付けてしまいます。親ページからデータを受け取るためにpostMessageを使用していますが、送信元のチェックを一切行っていません。

window.addEventListener("message", function(event) {
// event.origin is NEVER checkedif (event.data.message === "assign_session_data") {
// Attacker-controlled stringTable gets merged into app state    }
});

このメッセージに含まれるフィールドの1つ、stringTableは、CAPTCHAチャレンジ内に表示されるUIテキストを制御するものです。攻撃者はこれを任意の内容で上書きすることができます。

第二に、そのテキストは生のHTMLとしてレンダリングされてしまいます。このコンポーネントはReactのdangerouslySetInnerHTMLを使ってこれらの文字列を表示しており、サニタイズは一切行われていません。

var kn = React.forwardRef(function(e, t) {
return React.createElement('div', {
dangerouslySetInnerHTML: { __html: e.children }
    });
});

この2つを組み合わせれば、攻撃者はstring table内に<img src=x onerror="...">のようなHTMLペイロードを含むpostMessageを送信できます。コンポーネントはこれをHTMLとしてレンダリングし、onerrorが発火します。こうして、a-cdn.claude.aiのコンテキストで任意のJavaScriptが実行されてしまうのです。

すべてをつなぎ合わせる

a-cdn.claude.ai上でJavaScriptを実行できるようになれば、最後のステップはおのずと見えてきます。注入したスクリプトからClaude拡張機能へメッセージを送信するのです。

chrome.runtime.sendMessage(
'fcoeoabgfenejglbffodgkkbkcdhcgfn',
  {
type: 'onboarding_task',
payload: { prompt: 'ATTACKER_CONTROLLED_PROMPT' }
  }
);

拡張機能は*.claude.aiのオリジンであると判断してこれを通してしまい、攻撃者のプロンプトはユーザーからのリクエストとしてClaudeのサイドバーに届いてしまいます。

この一連の攻撃は、すべて不可視のiframe内で実行されます。攻撃者のページは、脆弱なArkoseコンポーネントを非表示の<iframe>に埋め込み、postMessage経由でXSSペイロードを送信し、注入されたスクリプトが拡張機能へプロンプトを発火させます。被害者には何も見えません。

開示のタイムライン

  • 2025年12月26日:HackerOne経由でAnthropicに報告
  • 2025年12月27日:Anthropicが脆弱性を確認しトリアージ
  • 2026年1月15日:Anthropicが厳密なhttps://claude.aiのみを要求するオリジンチェックを追加し、Chrome拡張機能に修正を展開
  • 2026年1月18日:拡張機能の修正を検証。PoCはもはや機能せず、新バージョンはclaude.ai以外のオリジンを「Untrusted origin」エラーで拒否することを確認
  • 2026年1月27日:Anthropicが報告をクローズ
  • 2026年1月29日:古いバージョンの拡張機能を保護するためArkose LabsのXSSにまだパッチが必要だったため、Anthropicが報告を再オープン
  • 2026年2月3日:Arkose LabsのHackerOneプログラム経由でXSSを報告
  • 2026年2月4日:Arkose Labsが24時間以内に脆弱性を確認
  • 2026年2月6日:Arkose Labsが問題をトリアージ
  • 2026年2月19日:Arkose LabsがXSSを修正。脆弱だったURLは現在403を返す
  • 2026年2月24日:全項目の再テストにより、すべての問題が解決していることを確認。報告をクローズ

正当な評価として述べておくと、Anthropicのセキュリティチームは対応が迅速で、24時間以内に確認を行い、3週間以内にパッチを適用しました。

まとめ

AIによるブラウザアシスタントが高機能になればなるほど、攻撃対象としての価値も高まります。ブラウザを操作し、認証情報を読み取り、ユーザーに代わってメールを送信できる拡張機能は、いわば自律的なエージェントです。そして、そのエージェントのセキュリティは、信頼境界の中で最も弱いオリジンの強度に等しくなります。

この拡張機能――あるいは他のいかなる拡張機能であっても――脆弱なバージョンが組織内にインストールされていないかを確認したいなら、まさにそれこそが私たちがKoiを開発した理由です。私たちはセキュリティチームに対し、環境内のすべてのブラウザ拡張機能を可視化し、過度に許容的な信頼モデルや脆弱な依存関係、そして今回の攻撃を可能にしたような信頼境界の問題をフラグ立てして提供します。

デモを予約することで、Koiが組織をどのように保護できるかをご確認いただけます。

どうかご安全に。

翻訳元: https://www.koi.ai/blog/shadowprompt-how-any-website-could-have-hijacked-anthropic-claude-chrome-extension

本記事は koi.ai の記事を翻訳・要約したものです。