要点
- 予測市場 Polymarket のサイトが読み込んでいた外部の計測スクリプトが、2026年10月29日に、資金を抜き取るコードへすり替わった。
- ログインしたまま見ていた利用者の持ち高が勝手に売られたり移されたりした。Polymarket は約270万ドルを返すとしている。
- サイトの外から読み込むスクリプトは、サイト本体と同じ権限で動く。日本のサイトでも、同じ形の穴は珍しくない。
何が起きたか
Polymarket は、出来事の結果に賭ける「予測市場」のサイトである。お金は暗号資産で動く。
このサイトは、表示の速さを測るために、DebugBear という会社のスクリプトを読み込んでいた。実際の訪問者のブラウザーで、ページの読み込み時間を測る道具である。
10月29日(日本時間では30日の未明)、このスクリプトが置かれていた住所から、別の中身のファイルが配られた。中身を調べた Hudson Rock の報告によると、このコードは次のように動くものだった。
- ブラウザーに保存されたログイン情報や取引用の鍵を読む
- ページの中にある、注文を出す部品と署名の部品を探す
- 財布でログインした人なら、持ち高を攻撃者の財布へ移す
- メールでログインした人なら、持ち高をどんどん悪い値段で売り、そのお金を外へ移す
つまり、パスワードを盗むのではなく、ログイン中の利用者の権限をそのまま使って取引を出させるやり方だった。Hudson Rock は、パスワードや秘密鍵を外に送る処理は見つからなかったとしている。ただし、署名を求めたことと、実際に送金が終わったことは別で、すべての処理が動いたかは確認できていないとも書いている。
ブロックチェーンの記録を追った Ohey によると、攻撃者の財布に最初のお金が入ったのは17時10分(UTC)だった。17時45分ごろからは、別の財布へも持ち高が移されている。18時38分までに、集めたお金はすべて3つの財布へ送り出された。
Polymarket のステータスページによると、17時38分に「利用者の財布に不正な動き」と知らせた。18時05分には取引を取り消しだけにし、送金の中継も止めた。そのあと、外部業者のスクリプトが乗っ取られたのが原因だとした。
10月30日の事後報告では、Polymarket は次のことをしたとしている。
- 問題のスクリプトを外し、キャッシュをすべて消した
- ログイン中のセッションをすべてリセットした
- 被害者に270万ドル、取引を止めていた間の損失に120万ドル、あわせて390万ドルを返す
- 被害を受けた財布の95%に、すでに全額を返した
The Hacker News によると、Polymarket は被害を受けた財布を726としている。DebugBear は X で、ドメインの登録業者を通じて DNS(住所を引く仕組み)の記録を書き換えられたと説明したという。DebugBear は、自社のシステムに侵入された跡は今のところ見つかっていないとし、RUM の利用者に埋め込みコードを外すよう求めた。
日本の利用者への影響
日本の利用者に被害が出たかどうかは、分からない。DebugBear が日本のサイトでどれだけ使われているかも分からない。DebugBear は、この攻撃は一つの顧客のサイトを狙ったものとみられるとしている(The Hacker News による)。
ただ、仕組みそのものは日本のサイトにもそのまま当てはまる。アクセス解析、広告、チャット、表示速度の計測などで、外のスクリプトを読み込んでいるサイトは多い。そのスクリプトの配り元が乗っ取られれば、ログイン中の利用者の画面で何でもできてしまう。ネット銀行、証券、通販、暗号資産の取引所のように、ログインしたままお金を動かせるサイトほど危ない。
今すぐやること
- サイトの運営者は、外から読み込んでいるスクリプトを一覧にする。 だれの、何のためのものか、今も要るかを確かめる。要らないものは外す。
- ログインした後の画面や、お金を動かす画面からは、外部のスクリプトをできるだけ外す。 Hudson Rock は、取引や署名をする画面から要らない外部コードを外すよう勧めている。
- 中身が変わったら読み込まない仕組みを入れる。 SRI(ファイルの指紋を決めておき、違えば読み込まない仕組み)と、CSP(読み込んでよい先を決める仕組み)を組み合わせる。Hudson Rock は、信頼できる配り元を許可するだけでは中身の確かめにならないと書いている。
- 利用者は、思い当たらない署名や承認の求めを断る。 よく使うサイトの中で出たものでもそうする。Hudson Rock はこう勧めている。
- Polymarket の利用者は、ステータスページの案内で返金を確かめる。 金額がおかしいときはフォームから再確認を頼める。「取り戻します」と近づいてくる連絡は無視し、シードフレーズ(財布を元に戻すための言葉の並び)は誰にも教えない。
背景
サイトが外から読み込むスクリプトは、そのサイトのページの中で、サイト本体と同じ力を持つ。配り元の会社が攻撃されなくても、今回のように住所の引き先(DNS)を変えられれば、別のファイルが配られてしまう。Ohey は、ふだんは Google Cloud Storage から配られていたファイルが、このときは別のサーバーから返っていたと報告している。
外部スクリプトを通した攻撃は、これまでもあった。2024年には、多くのサイトが使っていた polyfill.io の配り先が持ち主を変え、悪いコードを配った。決済画面にカード番号を盗むコードを入れる手口も、長く続いている。
Polymarket は、2026年6月にも外部の部品が原因とされる被害で、約300万ドルを盗まれたと報じられている(今回とは別の件)。Polymarket は今後、外部スクリプトを戻すときは、より厳しい CSP、版を固定した読み込み、隔離した環境(サンドボックス)で動かすなどの対策をとるとしている。
技術者向けの詳細
- 問題のファイル(Hudson Rock による):
cdn.debugbear[.]com上のC7xcKKrjUnXK.js、15,187 バイト- SHA-256:
0755e767504d8103f6c27b9e765a1026507a17c04513242adb503df7777879e5 - 結果の送り先:
data.debugbear[.]com
- SHA-256:
- 攻撃者の財布(Polygon、Ohey による)
- 受け取り先(コードに書き込み済み):
0x3F99139F1C5854bb628c2e576Aaf638e99dFfc18 - 持ち高の移し先:
0x5a2764fbbe5d139ef0ed988ec5f95320ce730c0b - POL の送り先:
0xe4c4c39c1733e1c7c06b79f97ed442b68df41ec6、0x5392587814ce8c6af6789764f88e5e9ab0b9962c、0xc91ee0574a14446de200923729c349b9cae19b60
- 受け取り先(コードに書き込み済み):
- 受け取った額(Ohey による): POL 28,636,284.45、USDC.e 10,383.33、USDC 6,320.69。33 の入金用財布から、持ち高を 36 回移した
- 時刻(10月29日 UTC、Ohey と Polymarket による): 16:54 配り元が応答しなくなる(Cloudflare 521)/17:10 最初の入金/17:59:20 Polymarket が DebugBear RUM を外したビルド/18:05 取り消しのみのモード/18:28〜18:38 POL をすべて送り出し/20:37 両方のホスト名が NXDOMAIN
- コードの動き(Hudson Rock による。中身を読んだだけで、実際には動かしていない): localStorage から認証情報と CLOB API の鍵を読む。React の内部をたどって取引クライアントと署名の部品を見つける。EIP-712 の一括メッセージを作り、今の署名の部品で署名を求めて relayer に送る
- 自分のサイトを確かめる
- HTML とタグマネージャーで、
debugbear.comやそのほかの外部ドメインを読み込んでいないか探す - 外部の
<script>にintegrity属性(SRI)が付いているか見る。版が変わるファイルには SRI を付けられないので、自分のサーバーに置いて版を固定することも考える - CSP の
script-srcとconnect-srcを、本当に要る先だけにする。Hudson Rock は、CSP でホストを許可しても、配られるファイルの中身は確かめられないと注意している - 署名や送金のような大事な操作は、ページのコードから呼ばれたときも、利用者に改めて確かめる作りにする
- HTML とタグマネージャーで、
- 事故が起きたら: 返ってきたファイルそのもの、ハッシュ、HTTP ヘッダー、ブラウザーの通信の記録を、消える前に残す(Hudson Rock の勧め)