Polymarket 前端脚本被换:726 个钱包一小时内被搬走 264 万美元

一次针对第三方脚本的供应链攻击,让预测市场 Polymarket 在 10 月 29 日的一个小时里损失了约 264 万美元。被换掉的不是平台自己的代码,而是它从外部公司 DebugBear 加载的一段页面性能监控脚本。Polymarket 已确认向 726 个受影响钱包全额赔付约 270 万美元,并向因暂停交易受损的约 5500 个钱包追加 119 万美元补偿,合计约 390 万美元。

事件概述:一小时、33 个钱包、28.6 万枚 POL

根据 Ohey 的链上追踪,攻击者钱包在 10 月 29 日 17:10 UTC 收到第一笔资金,18:02 UTC 收到最后一笔,其间从 33 个钱包收走 28.6 万枚 POL 及若干仓位。18:19 UTC 按 DefiLlama 报价 0.0922 美元计算,仅 POL 部分价值约 264 万美元,未计入被卖出的仓位。18:28 至 18:38 UTC,这笔 POL 被拆到另外三个地址。

Polymarket 在 17:38 UTC 首次发布钱包异常状态公告,18:05 UTC 把交易所切换到仅可撤单模式并暂停中继器动作,随后在一小时内移除被篡改的脚本、清空缓存、重置全部登录会话。截至 10 月 30 日,726 个钱包中 689 个已全额退款,剩余 37 个在核对后陆续支付。

技术细节:入口在域名注册商,不在服务器

DebugBear 提供的 RUM(真实用户监控)工具用于测量页面在真实访客浏览器中的加载速度。该公司在 X 上说明,其 DNS 记录是经由域名注册商被篡改的,早期排查显示攻击只针对某一个客户的网站,尚未发现自身系统被入侵的迹象。Ohey 在 18:13 UTC 观察到 DebugBear 的 Web 地址已由另一台服务器应答,当时恶意文件仍在线;当天早些时候,正常脚本还是从 Google Cloud Storage 返回的。

关键点在于:DebugBear 每个客户加载的是各自一份脚本,被替换的恰好是 Polymarket 那一份。这意味着攻击者并非盲扫,而是挑了一个高价值目标。

不偷私钥,也能把钱转走

Hudson Rock 在未执行文件的情况下做了静态分析,结论是这段代码并不窃取私钥、助记词或密码。它做的是复用页面上已登录用户本来就有的权限:先读取浏览器中保存的账户信息,其中包含一组交易 API Key,再在页面里定位下单模块和负责签名的 signer 组件。

随后按账户类型分两条路径处理:用自有钱包登录的账户,直接把持仓转到攻击者钱包;用邮箱登录的账户,则以越来越差的价格把仓位卖出,再把资金转出。两条路径都通过账户自己的 signer 完成签名,再交给 Polymarket 的中继器上链。Hudson Rock 也指出,签名请求本身并不能证明用户是在无提示的情况下签的,钱包服务商仍有可能弹出确认、拒绝请求或按自己的会话规则拦截。

影响评估

  • 资金损失:链上确认约 264 万美元,平台赔付总额约 390 万美元,属于典型的「平台兜底」处理。
  • 信任损失更贵:受影响的不是私钥保管环节,而是「你在页面上签的每一笔到底是什么」这个基础假设。
  • 同类风险面极大:任何在交易、支付、后台页面加载第三方脚本的站点,都可能成为下一个被替换的入口。

修复建议

DebugBear 已要求 RUM 客户移除其嵌入代码,恶意文件所在的 cdn.debugbear[.]com 在 11 月 1 日查询时已无 DNS 记录。Polymarket 表示将以更强的 CSP、固定版本和沙箱化方式重新接入第三方脚本。对普通站点,可以落地的动作有:

  • 凡是可以固定版本的外部脚本,一律加 Subresource Integrity(SRI),文件内容变化时浏览器直接拒载。只写一条「允许某 CDN」的 CSP 策略,并不会校验该 CDN 实际返回的内容。
  • 交易、支付、登录、后台这类敏感页面,能不加载第三方代码就不加载;统计与监控脚本尽量放在非关键路径。
  • 把第三方脚本域名纳入监控,DNS 记录变更、证书更换、响应体哈希变化都应触发告警。
  • 对用户侧,只签自己预期内的请求;任何「莫名其妙弹出来的签名确认」,先拒绝再排查。
<script src="https://cdn.example.com/rum.js"
        integrity="sha384-..."
        crossorigin="anonymous"></script>

参考来源