区块链 区块链技术 比特币公众号手机端

DeFi的Web2外围:资金真正流失之处

摘要

截至 2026 年,DeFi 的大部分损失并非来自智能合约漏洞,而是来自合约周边的 Web2 基础设施:DNS、依赖项、托管、签名者 UI、钱包软件、云密钥以及被劫持的账户。这一层很少被审计,因为安全审查的范围仅限于链上代码。梳理这一层的有用方式是两条轴——投递渠道(攻击者代码如何到达用户)和载荷(真正转走资金的是什么)。渠道在不断增多;载荷却寥寥无几。本文描绘了外围防线,对风险进行排序,并说明审计方和协议方应该做出哪些改变。

引言

链上代码是 DeFi 系统中被审查最多的部分:公开、可形式化分析、被反复审计。它通常是安全的。损失来自它周边的一切——即把代码从开发者的键盘送到用户签署交易的那条流水线。

两个结构性事实解释了为什么这条外围防线是脆弱的。第一,注意力不对称:审计方被聘请来审查合约,因此合约层被严密监控,而 DNS、CDN、依赖图和签名者 UI 几乎无人看管。第二,通过已连接钱包造成的严重性放大:一个在普通应用中属于“低危”的 Web2 漏洞,在这里是致命的。开放重定向在营销网站上只是个麻烦;在带有已连接钱包的 dApp 上,它是通往资产损失的道路。跨站脚本没有单一的严重性等级——OWASP 按上下文评估——而在传统应用中,其影响受限于会话:一个被盗的 cookie、一个被篡改的页面。一旦连接钱包,同一个注入脚本就能改写用户即将签名的交易,其影响上限一跃变为永久性的资产损失。

关键数字:2025 年,Web3 在 630 起事件中损失了 33.5 亿美元(CertiK Hack3d 2025)。当年成本最高的攻击向量是供应链——14.5 亿美元,占总损失的 43%(其中 99.7% 来自 Bybit 签名界面被攻破),其次是钓鱼——7.23 亿美元,占 22%,共 248 起事件,是所有向量中最多的。智能合约代码漏洞在事件数量上排名第二(240 起),但 CertiK 没有公布其年度损失总额——资金集中在周边防线,而不是在合约中。(数据是 Web3 全范围,而非仅 DeFi;没有主要跟踪机构单独发布 DeFi 分类统计,且类别边界因来源而异。)同样的安全预算,花在外围防线上通常比花在已经充分审计的合约上能买到更多的风险降低——但相对而言,花在那里的钱却少得多。

下面的这条流水线是全文的模型。把外围防线理解为一条路径:

从开发者的键盘到用户资金的投递路径。每个阶段都是一个注入点;智能合约审计只覆盖最后一个阶段。

每个阶段都是一个注入点,而智能合约审计只覆盖资金之前的最后一个节点——下文所述的事件都发生在路径的其余部分。

两条轴:渠道 × 载荷

下文的事件跨越 DNS、npm、云端、移动端和 AI——有数十起。按渠道逐一列出,它们看起来像一个庞杂的动物园,每一个新渠道都像一种新威胁。本文中最有用的一个想法恰恰相反:停止按“哪个系统被攻破”来分类事件,而是把每起事件拆解为两条独立的轴。

载荷

载荷——真正偷走钱的东西——种类很少:

  • 授权 / Permit 钓鱼盗币器。 用户被某种常规操作引诱——领奖、兑换、“验证钱包”提示——并被要求签名。他们签的是 ERC-20 的 approve(通常是无限额度授权)或免 Gas 的 ERC-2612 Permit,后者允许攻击者地址之后通过 transferFrom 转走代币。私钥从未被盗;用户授权了盗窃,代币在几分钟或几天后的另一笔交易中离开。Permit 是增长最快的变体,因为它是一个链下签名,而不是链上交易:没有 Gas 提示,也没有“交易”警告。现代钱包越来越多地解码 Permit,能够显示甚至标记支出方和金额,但它仍以“签名请求”而非转账的形式出现,更容易被放行。
  • 浏览器中间人盗币器。 注入的代码位于页面和钱包之间,Hook window.ethereum.request(以及 Solana provider)以拦截 eth_sendTransaction / signTypedData 调用。它在发往钱包的途中改写接收方或 calldata——通常是改成视觉上相似的山寨地址——因此钱包只接收到被篡改的版本并显示那个版本。除非用户在硬件屏幕上验证目标地址,否则看起来正确的页面和被篡改的签名永远不会被相互核对。剪贴板替换变体对复制的地址做同样的事。
  • 凭证 / 密钥窃取器。 从开发者机器、CI 运行器或云环境中收割助记词、私钥、.env 文件、云凭证(AWS/GCP),以及——越来越成为真正目标的——npm 和 GitHub 发布 Token。被盗数据要么被用于直接盗窃,要么被当作跳板:一个被盗的维护者 Token 会成为下一次供应链攻陷的入口。
  • 签名界面欺骗。 签名者是合法的,密钥完好无损,但界面显示一回事,签的却是另一回事——屏幕上是普通转账,字节里却是 delegatecall 或更换 owner。硬件钱包只能部分解决这个问题:它们可以清晰签名标准的、可解码的交易,但复杂的 calldata——delegatecall、未知合约——往往会退回到盲签,此时无论载荷是无害的还是恶意的,显示看起来都一样(这就是下文 Bybit 事件的机制)。

前两种值得当作流程来理解,因为后面每次提到“盗币器”和“Permit”都可以归结为这两张图。授权钓鱼是让用户授权盗窃:

用户被诱导签署一个 Permit/approve,将额度授予攻击者——然后 transferFrom 转走代币。私钥从未被盗。

浏览器中间人盗币器从不要求特殊签名——它在正常签名被发送的途中改写该签名:

注入的代码 Hook 钱包 API,在途中改写交易。页面显示原始版本;钱包收到攻击者的版本。

区别在于谎言在哪里:授权钓鱼的谎言在于可见签名意味着什么;浏览器中间人的谎言在于正在签的是什么,而页面看起来是正确的。

渠道

渠道——载荷如何到达——众多且可互换:DNS、被攻陷的依赖项、第三方前端供应商、开发/CI 机器、被劫持的社交媒体账户、云存储桶、签名者自己的 UI。攻击者的目标只是在已连接的钱包旁边运行载荷;它从哪扇门进来是机会问题,不是不同类型的攻击。堵住 DNS,同一个盗币器会通过 npm 或供应商脚本到达。

用一句话概括,这就是全文的论点:一小套稳定的载荷,通过不断增多的门分发。一个直接推论——严重性 ≠ 传播范围:chalk/debug npm 事件波及约 20 亿周下载量,却只偷了约 500 美元;Polymarket 供应商事件只影响了一个供应商,却偷了约 300 万美元。恶意代码存活了多久以及它针对谁,决定了损失——而不是它传播了多广。

下表把两条轴并排放置。每一行是一个渠道(通往钱包的一扇门):通常搭载的载荷、与之对应的真实事件,以及这一入口的第一道实际防线。用两种方式阅读它。沿着载荷列向下看,同样的几个载荷不断重复出现——这证明了渠道是可互换的,而载荷不是。沿着防御列向下看,对策各不相同,因为每个对策都绑定于特定的门,而非载荷——这正是为什么逐个渠道防御永无止境。它是外围防线的地图,不是一份清单;每一行都在后续章节中展开。

渠道 典型载荷 示例 第一道防线
DNS / 注册商 授权钓鱼盗币器 CoW Swap、Squarespace(228 个前端) 锁定域名——DNSSEC(对 DNS 应答签名,使其无法被伪造)加上注册商的 RegistryLock(阻止未经授权的转移)——并在注册商账户上启用抗钓鱼硬件 2FA。
托管 / CDN / 云 注入盗币器或被盗密钥 BadgerDAO、Bybit(S3) 最小权限 API 密钥,并对任何新密钥的创建进行告警;对提供的 bundle 做完整性检查(CSP + SRI);将协议签名密钥放在多签或硬件安全模块(HSM)中,绝不用单一云密钥。
npm / 依赖项 浏览器盗币器或凭证窃取器 chalk/debug、node-ipc、Axios 使用已提交的 lockfile 锁定精确版本,要求构建来源证明(一份关于谁构建了该包的签名记录),并在 CI 中禁用安装脚本(--ignore-scripts)。
第三方前端供应商 授权钓鱼盗币器 Polymarket 严格的内容安全策略(CSP,限制页面可以加载的代码)配合子资源完整性(SRI)哈希来固定每个外部脚本,并在任何连接钱包的页面上尽可能少地使用第三方脚本。
RPC / BGP 数据欺骗 / MITM KLAYswap(BGP)、恶意 RPC 路由源验证(RPKI/ROV)使被劫持的 BGP 路由被拒绝,固定 RPC 端点白名单,并在多个独立 RPC 之间交叉核验应答。
社交媒体 / 通信 授权钓鱼盗币器 Mandiant、Rublevka 在每个团队账户上启用抗钓鱼硬件 2FA,并发布官方域名列表供用户核对链接。
移动应用商店 假应用盗币器 / OCR 窃取器 假冒 WalletConnect、SparkCat 只链接到官方(canonical)商店页面,绝不在设备上存储或截图助记词——截图正是 OCR 窃取器搜寻的目标。
签名者 UI / 多签 签名界面欺骗 Bybit、Drift 在独立渠道上验证交易(第二台设备、硬件钱包确认),并在链上通过速率限制和熔断器设置价值上限。
AI Agent / 工具 提示注入 / 工具投毒 Grok–Bankr、MCP 投毒 任何转账都必须有人工参与环节,并在 LLM 之外的确定性代码中强制执行限额(最小代理权——给 Agent 它需要的最小权限)。
钱包软件 可计算密钥(弱 RNG) Wintermute、SecondFi 使用密码学安全随机数生成器(CSPRNG)生成密钥,并使用确定性签名 nonce(RFC 6979),使密钥永远不会被重新计算(与 Web2 范围相邻)。

通用模板

在两条轴之下,是一个单一模板,本文中的每个案例都是它的一个实例:

每个案例都归结为同一个模板:信任边界被突破,攻击者代码在已连接的钱包旁边运行,载荷转走资金。

这就是为什么 DNS、npm、Cloudflare、Safe UI、MCP 服务器、AI Agent 和 XSS 漏洞都属于同一个分类体系:它们都是进入同一个四步流程的不同信任边界。渠道对应的是哪个边界被突破;载荷对应的是如何实现第三步和第四步。下面的一切都是这个模板的变体。

攻击面逐层展开

这些渠道沿着流水线分为五个集群。对每个集群:机制、支撑它的案例,以及要点。

构建与供应链

前端由依赖项组装并由 CI/CD 发布,因此构建流程上游的任何环节都能在合法 bundle 中植入代码。三个子类达到同样的结果:可信包维护者账户被接管、依赖混淆(公共包遮蔽私有包)、以及域名上已被信任的第三方供应商脚本遭到投毒。这难以发现的原因在于激活点不断移动:postinstall Hook(安装时运行的代码)可以用 --ignore-scripts 阻止,但在包被导入(require())那一刻运行的代码则无法阻止,而仅修改 manifest 就能在不改动一行源代码的情况下添加恶意依赖。

  • chalk/debug(2025 年 9 月)——传播范围最广的攻陷事件。维护者被来自 npmjs.help 的假冒 npm 2FA 重置邮件钓鱼,这是一个提前几天注册的山寨域名;约 16 分钟内,攻击者重新发布了约 18–20 个基础工具包(chalk、debug、ansi-styles 等),它们作为传递依赖存在于数千个前端和开发工具中——合计约 20 亿周下载量。载荷是一个仅在浏览器上下文中运行的浏览器中间人盗币器,Hook window.ethereum / Solana,并在多条链上将目标地址替换为近乎相同的山寨地址。它只偷了约 500 美元——恶意版本存活了约 2 小时,CI 流水线标记了它们(一个仅限浏览器的 fetch 调用在 Node 中抛错)——但传播范围实际上是整个生态。
  • node-ipc(2026 年 5 月)——运行时触发:载荷在包被导入(require())时触发,而不是在安装时,因此标准缓解措施 npm ci --ignore-scripts 完全无效。初始访问甚至不需要钓鱼:维护者的个人邮箱域名已过期,攻击者只需重新注册它,然后用它重置 npm 密码(过期域名接管)。载荷收割了 90 多种凭证类别——云密钥、SSH 密钥,以及特别值得注意的 AI 开发工具配置(.claude.json、MCP 文件)——通过 HTTPS 和 DNS 隧道外传。
  • Axios(2026 年 3 月)——仅修改 manifest 的注入:包的运行时代码未被触碰;相反,它的 package.json 引入了一个恶意兄弟包(plain-crypto-js),其 postinstall Hook 安装了一个跨平台 RAT(远程访问木马)。因为源码没有变化,对 Axios 本身的代码审查看不到任何东西。微软威胁情报将其归因于 Sapphire Sleet(朝鲜),这是一个针对加密货币、VC 和区块链开发者的组织。Axios 是 npm 下载量最高的包之一——npm 的计数器显示约 1 亿周下载量(微软的报告引用为 7000 万)——这决定了它能传播多远。
  • Polymarket(2026 年 6 月)——不是 npm,而是被攻陷的第三方前端供应商:供应商在 Polymarket 自己的合法域名上提供的脚本被替换为授权钓鱼盗币器。关键在于它只投递给部分用户,因此安全扫描器在获取到干净副本时看不出任何问题。约 300 万美元的 pUSD,桥接为约 1,893 ETH——与 2023 年 12 月的 Ledger Connect Kit 被劫持事件是同一个蓝图。

要点: 一种载荷类别无论搭载在 npm 依赖还是供应商脚本上,都能以相同方式到达钱包;--ignore-scripts 不再能防范它(运行时激活和仅修改 manifest 的编辑可以绕过);而条件投递可以击败定期扫描。

第 0 步:攻击者如何接触到开发者

上面的每个案例都始于更早一步:一个人或一个账户被攻陷。这个“第 0 步”才是整条流水线真正埋下种子的地方,值得单独处理,因为方法很少、在不同无关事件中反复出现,而且比它们所实现的载荷要平凡得多。六种方法反复出现:

  1. 凭证钓鱼。 山寨域名上的假冒登录或 2FA 重置页面捕获维护者的凭证。关键细节是:现代钓鱼套件通常是中间人对抗(AiTM)——假页面是一个位于真实登录页面之前的实时反向代理,因此它实时将受害者的密码和一次性代码转发给真实站点,并偷走生成的会话 cookie(让你保持登录的 Token)。这意味着验证器应用(TOTP)或短信验证码救不了你——只有绑定来源的因素(硬件密钥、passkey)才行,因为它们拒绝向错误的域名进行身份验证。chalk/debug 正是从这里开始的:一封 npmjs.help 重置邮件,几天前注册的山寨域名,以及维护者账户沦陷后约 16 分钟内重新发布的约 18–20 个包。这种方式至今仍是最常见的入口点。
  2. 过期域名接管。 没有钓鱼,没有恶意软件——只是域名到期未续费。维护者的个人邮箱域名到期;攻击者花几美元重新注册它,重建账户恢复所指向的邮箱,并触发密码重置——现在重置邮件落入了他们的收件箱。在 node-ipc 事件中,过期的域名就是维护者自己的,而这足以重置 npm 密码并发布包。令人不安的是,这完全不需要受害者任何交互,并且不会在他们的机器上留下任何可检测的痕迹。
  3. 残留 / 继承的访问权限。 在换工作、离职或供应商关系结束后从未被撤销的 Token、SSO 授权、部署密钥或共享账户——存在于任何人当前组织架构之外的访问权限。这是一个真实的入侵向量,而非卫生细节:一个开发者仍然带着的、来自前雇主的身份,其授权当前组织无法确认是否已被撤销,这正是攻击者会走的那种无人看管的门——先站稳脚跟,再横向移动到生产基础设施。以这种方式埋下种子的入侵可以在被利用前潜伏数周。同一缺口的供应商侧版本是 LastPass 数据泄露事件通过被攻陷的第三方 Klue 波及多个团队。你跳过的每一次离职流程,都是一扇永远敞开的门。
  4. 开发者机器上的信息窃取器。 开发者的日常笔记本在一个地方存有已登录的浏览器会话、ssh-agent、已登录的云 CLI 和 .npmrc 发布 Token——因此一次窃取器运行就能把整套凭证全部收集。投递方式通常是投毒的依赖项、木马化的工具,或伪装成面试的“带回家编程测试”:一个“招聘人员”要求候选人运行的仓库,其 postinstall 或被混淆的依赖项在开发者自己的机器上执行。朝鲜的 Sapphire Sleet 在 Axios 攻陷事件背后所使用的正是这个诱饵;node-ipc 的载荷收割了 90 多种凭证类别,包括 AI 工具配置(.claude.json、MCP 文件);而 QUIETVAULT——一个 AI 辅助的窃取器——专门用于抓取 npm 和 GitHub Token,把偷来的 Token 直接输送回上面的供应链集群中。
  5. 雇佣内鬼。 有时访问权限就是被授予的。朝鲜 IT 工作者团伙(Famous Chollima / Wagemole)申请加密公司的远程开发职位,并借助实时深度伪造面部滤镜通过视频面试;一旦被录用,内鬼将合法访问权限转化为植入后门的提交、被盗密钥和泄露的秘密。门槛已经崩塌——一个没有先前经验的人在一台五年前的电脑上用 70 分钟就构建了一个可用的假身份。在活体检测压力下滤镜仍然会失效(手在脸前掠过、突然转头、唇形同步延迟),这就是为什么带动作检测的视频验证在这里是真正的控制措施。
  6. 会话 Token 窃取和 SIM 卡交换。 两者都完全绕过密码。被窃取的会话 cookie(来自上面的信息窃取器或 AiTM 代理)被重放,从而以已认证状态进入系统,同时绕过密码和 2FA。SIM 卡交换将目标的号码转移到攻击者的 SIM 卡上,把基于 SMS 的 2FA 和基于电话的恢复变成攻击者自己的第二因素。Mandiant 的 X 账户因团队交接期间的 2FA 政策缺口,被“可能[通过]暴力破解密码攻击”攻陷——这种账户接管机制也驱动了下面两个集群中的社交渠道劫持。

贯穿始终的主线是:开发者的笔记本和发布凭证位于投递流水线的头部——生产级的权力,却很少拥有生产级的防御。这种不对称就是 chalk/debug 的全部故事:一个约 500 美元的钓鱼套件触及约 20 亿周下载量,因为守护那个传播范围的一个账户拥有可恢复、可钓鱼的 2FA。真正能够封堵第 0 步的控制措施并不光鲜但很具体:抗钓鱼硬件 2FA / passkey(绝不用 SMS 或纯 TOTP,两者都能被上述方法攻破);带来源证明、作用域限定且短期有效的发布 Token;将密钥材料与日常机器隔离;对新的 API 密钥/Token 创建进行告警;以及在人离开或供应商关系结束的当天撤销每一项授权。

服务与命名

在构建和浏览器之间,是 bundle 被存储、命名和路由的地方——其中每一个都是可以被攻陷的独立账户,且域名和 TLS 事后仍然完全有效。无论哪个账户被攻破,形态都是一样的:

被劫持的注册商、DNS 或托管账户在正确的 URL 上提供攻击者的前端,并带有有效的 TLS 证书——因此挂锁证明不了任何事情。

  • CDN / 边缘账户。 BadgerDAO(1.2 亿美元,2021 年 12 月)——攻击者攻陷了项目的 Cloudflare 账户并创建了一个团队毫不知情的 API 密钥,然后使用 Cloudflare Workers——运行在 CDN 边缘服务器上、在源站和浏览器之间改写 HTTP 响应的代码——注入一个冰钓脚本(诱骗用户批准代币花费的提示)。因为注入发生在边缘,原始 bundle 保持不动,因此源站侧的完整性检查看不到任何东西。脚本时进时出,只对一部分用户触发,这使得它极难复现;最终只能通过在链上冻结 transferFrom 来阻止盗窃。(这是 Polymarket 后来重用的条件投递技巧的最早例子。)
  • 云存储。 Bybit(2025 年 2 月)——Safe{Wallet} Web 应用的 JavaScript 托管在 AWS S3 存储桶中,攻击者——在攻陷了 Safe 开发者的工作站、劫持其 AWS 会话、并绕过 MFA 之后(根据 Safe 与 Mandiant 的复盘)——替换了存储桶中的该 JavaScript。一个激活条件使恶意代码对所有人保持休眠,唯独对 Bybit 的特定冷钱包地址触发,因此它只触发了一次,命中预定目标——然后在几分钟内从 S3 中移除以销毁证据。正确的域名、有效的 TLS,bundle 在底层被换掉了。
  • 云密钥管理。 另一种云故障模式,完全不涉及前端:一个协议通过链下签名者授权特权发行——铸币、升级、提款——而该签名者的密钥是一个在云上持有的单一 EOA(放在 KMS 中而非多签或 HSM 中)。攻破云基础设施就能拿到密钥,而如果合约接受该签名者产生的任何内容——没有链上上限、没有抵押品检查——单个伪造的授权就可以铸造无抵押供应量并打破锚定。特权发行背后的签名权正是那个关键单点,应当由多签或 HSM 加上硬性链上铸币限额来守护,这样任何链下签名——无论如何获得——都无法转移无限的价值。
  • 域名 / 注册商。 拿走域名,你就把整个前端重定向到攻击者的基础设施。CoW Swap(约 120 万美元)因向 .fi 注册商提交伪造文件而沦陷。Squarespace 大规模攻击在结构上不同——一个迁移导致的认证绕过:当 Google Domains 账户被迁移到 Squarespace 时,管理员邮箱在未验证所有权的情况下被预先关联,MFA 也未启用,因此任何控制关联邮箱的人都可以夺取域名。这让 228 个 DeFi 前端面临风险并同时劫持了约十几个——不是客服社会工程,而是供应商侧的规模化缺陷。
  • DNS 之下:BGP。 KLAYswap(约 190 万美元,2022 年 2 月)——攻击者宣告了一条针对前端所加载第三方 SDK 的 IP 段的更具体(more-specific)BGP 路由,使互联网开始通过他们投递该流量。然后他们对证书签发过程本身发动了中间人攻击,为被劫持的前缀获得有效 TLS 证书并在其下提供恶意 JavaScript——因此浏览器看到了一个完全有效的挂锁。TLS 信任它所依赖的路由;这是针对加密服务的第三次 BGP 劫持(2018 年的 MyEtherWallet 通过 Route 53 劫持是更早的一次)。

要点: DNSSEC、SRI 和合约审计都会错过这一层,而且一个云账户往往同时持有前端、边缘、存储协议的密钥——因此它的沦陷是全面的。有效的 TLS 和正确的 URL 在这里证明不了任何事。

触达用户

在用户被钓鱼之前,他们必须先到达——而把他们带来的渠道同样可以被攻击。

  • 社交媒体 / 通信。 两种模式:劫持可信账户(Mandiant 的 X 账户,通过弱 2FA 被劫持以推送 CLINKSINK 钓鱼,整个活动至少 90 万美元),或运营一个由老号、看起来经过验证的账户组成的网络,在合法转发中隐藏恶意链接(Rublevka,260+ 个 dApp URL;一个由 20 个账户组成的 AngelFerno 集群)。
  • 移动端。 官方商店是投递渠道,而它们的审核是可以被击败的。一个假 WalletConnect 应用(以计算器名义发布)运行 MS Drainer 流程,通过伪装(向审核者展示干净版本,向真实用户展示恶意版本)在 Google Play 上存活了五个月,并用虚假五星评价掩盖投诉(>7 万美元)。SparkCat 是在苹果 App Store 中发现的首个 OCR 窃取器:一个 Google ML Kit 模块扫描相册寻找助记词的截图。剪贴板劫持器和假 Ledger/Trezor 应用补全了这幅图景。

要点: “是官方账户”和“是官方商店”都不是安全属性——伪装、老号和虚假评价可以同时击败人工和自动化审核。

客户端与签名

在最末端,资金发生转移——而有记录以来最大的盗窃就在这里:Bybit(14.6 亿美元),一次签名界面攻陷,而非智能合约漏洞。下面的 Drift(2.85 亿美元)是同一类别的慢速变体——签名者被欺骗,而非合约被攻破。

签名界面攻陷不是密钥攻陷。密钥从未被盗;谎言完全存在于 UI 显示的内容与实际签名的内容之间的空隙中。

Bybit(2025 年 2 月,14.6 亿美元)——有记录以来最大的盗窃,值得逐步拆解,因为它与合约漏洞毫无关系。签名者在 Safe{Wallet} Web 界面中看到的是一笔来自冷多签的普通转账——金额和目的地看起来与预期完全一致。他们实际签的是一个 delegatecall,它替换了钱包的实现并覆写了存储槽 0,将多签的控制权交给攻击者。恶意代码是注入到 Safe{Wallet} 前端中的 JavaScript,从应用自己的 AWS S3 存储桶中提供,因此它在该会话中运行在真实域名上,并在交易落地几分钟后从 S3 中被移除。硬件钱包没有帮助:Ledger 忠实地显示并签署递给它的载荷,而在这里,那个载荷——密集、不可读的 delegatecall calldata——已经是恶意版本,因此盲签它与盲签一笔合法的复杂交易看起来完全一样。而 Safe 显示虚假数据的简单原因是:被攻陷的前端控制了签名者看到的一切;显示意图和签署的字节已经分道扬镳,流程中没有任何环节来核对它们。(已由 Safe 与 Mandiant 的复盘确认:攻击者攻陷了 Safe{Wallet} 开发者的工作站,劫持了其 AWS 会话,并绕过 MFA 进入 S3 存储桶,注入的 JS 改写了签名者批准的交易。只有恶意软件最初如何到达那台笔记本——可能是一个恶意的 Docker 项目——仍未确认。)

Drift(2.85 亿美元)——慢速变体:约 6 个月的社会工程,加上利用 Solana Durable Nonces 来执行一笔通过欺骗签名者而预先签名的交易。离线预签名在签名和执行之间打开了一个间隙,签名者在其中没有任何实时反馈。

要点(签名者侧): 这里的答案是独立的交易验证——第二台设备、硬件钱包确认——加上链上速率限制和上限,而不是仅仅依赖签名者的勤勉。

还有一个角色位于本文中每个渠道之下,而不仅仅是这一个:盗币器市场本身。通篇描述的载荷很少是手工构建的——它们是买来的。Inferno(>8000 万美元,约 13.7 万受害者)这类 Drainer-as-a-Service 套件——后来移交给了 Angel 再到 AngelFerno——是带有分成和联盟计划的租赁商品——因此上述整个外围防线实际上只是它们的分发网络。这就是为什么同一个盗币器会不断出现在 DNS 劫持、npm 攻陷和假移动应用背后。

AI 层

AI 横跨上述所有内容,既是一个新的攻击面,又是一个力量倍增器——它使现有攻击更便宜、规模更大。(研究版本将每一项作为独立小节处理。)

一个新攻击面

持有钱包的 Agent 在三个条件同时成立时可被利用:不受信任的文本进入其上下文、一个工具可以在没有人工参与的情况下执行交易、钱包可以转移资金。Grok–Bankr 盗币事件(Base 上约 15 万美元)三者全部命中——一个提升了 Agent 权限的 NFT、一条隐藏在摩尔斯电码中并溜过安全过滤器的指令、以及一个在链上执行解码输出的工具。这一根本属性具有普适性,如今已成为 AI 安全从业者的共识:LLM 无法可靠地区分指令和数据,因此它不能被用作安全边界——授权和限制属于模型之外的确定性代码。同一属性产生了两个供应链变体:slopsquatting(攻击者预先注册助手会可靠地幻觉出的包名——在一项研究中,43% 的幻觉名称在每次运行时都会重复出现,因此它们可以被批量养殖)和 MCP 工具投毒(指令隐藏在模型视为权威但用户永远看不到的工具描述字段中)。

力量倍增器

AI 降低了经典攻击的成本和所需技能。Anthropic 记录了一个行为者使用一个 Agentic 编码工具在一个月内对约 17 个组织进行侦察、凭证收割和入侵;无代码勒索软件和通过财富 500 强面试的朝鲜操作者表明技能门槛几乎已经消失;而运行时 LLM 恶意软件(PROMPTFLUX、PROMPTSTEAL)在每次运行时重写自身以击败基于签名的检测。其中一个变种 QUIETVAULT 窃取 GitHub 和 npm Token——直接输送回上面的供应链集群中。

要点: 旧的推论“高水平的攻击意味着高水平的攻击者”不再成立,而基于签名的检测在面对每次执行都会变形的代码时崩溃。

当前最危险的是什么

实证依据:2025–2026 周期中三起最大的加密货币损失都是基础设施或运营层面的攻陷,而非智能合约漏洞。

# 事件 损失 日期 类别 合约漏洞?
1 Bybit 约 14.6 亿美元 2025 年 2 月 签名界面攻陷
2 KelpDAO 约 2.92 亿美元 2026 年 4 月 被投毒的跨链验证器(RPC)
3 Drift 约 2.85 亿美元 2026 年 4 月 管理密钥社会工程

该周期列表中第一个合约代码漏洞利用是 Cetus(约 2.23 亿美元,2025 年 5 月),排名第四。前三名中的两个(KelpDAO、Drift)与朝鲜国家支持的黑客组织有关,相隔数周。

并非以上所有内容都同样紧急。按实际损失、频率和单点故障的灾难程度排序:

严重

  • 签名者 UI / 多签攻陷——有记录以来最大的盗窃(Bybit 14.6 亿美元),以及 2026 年再次发生的 Drift(2.85 亿美元)。
  • 托管与云(CDN / 存储桶 / KMS)——一个账户即可完全控制(BadgerDAO 1.2 亿美元、Bybit-S3)。
  • 前端供应链(npm + 供应商)——传播范围最广,且在加速(chalk/debug、Polymarket)。
  • DNS / 注册商——反复发生且大规模,攻击者成本低(Squarespace 的 228 个前端、CoW Swap、2026 年的一波攻击)。

  • 社交媒体 / 通信劫持——廉价、高信任度的分发方式。
  • 移动端——官方商店不是过滤器。
  • AI(提示注入 + 进攻性 AI)——今天损失较小,增长迅速。
  • RPC / BGP——罕见但不小:对桥接器的验证器 RPC 投毒使 KelpDAO 损失约 2.92 亿美元,而 MITM 在发生时可以击败 TLS。

  • 钱包软件 RNG / nonce——单事件灾难性,但集中在特定软件和遗留密钥中。

值得记住的模式

核心教训,一次说清:

  • 一个载荷,多个渠道。 围绕载荷和钱包附近的少数关键节点进行防御,而不是追逐每一个新渠道。
  • 有效的 TLS 和正确的 URL 证明不了任何事。 BGP 劫持可以拦截证书签发过程本身;被攻陷的云账户在真实域名上提供恶意代码。将信任建立在比挂锁更深的东西上——来源证明、完整性、路由安全。
  • 补丁不能撤销已泄露或可计算的密钥,也不能撤销已签署的授权。 这些类别需要预防和迁移,而非补救。
  • 假设密钥会泄露——在链上限制爆炸半径。 三分之二的损失来自密钥和访问权限,而没有任何补丁能撤销被盗的密钥或已签署的授权——因此在完全沦陷中存活下来的唯一控制措施,就是限制单个授权操作能做什么的控制措施:链上提款/铸币上限、每区块/每日速率限制、对大型或敏感操作加时间锁(为监控发现和人工否决提供窗口)、熔断器、以及最小权限原则,使单个密钥无法触达一切。反例正是这类预防措施所要阻止的失败——一个被攻陷的链下签名者铸造了无抵押供应量,因为链上没有任何东西对其设限。目标不是“永远不会丢密钥”,而是“让密钥丢失变得可承受”。
  • 朝鲜黑客集群是一个系统性问题,而非一个漏洞。 关联行为者在约 14 个月内造成 >20 亿美元损失(Bybit、KelpDAO、Drift、Axios),跨越签名者 UI、跨链验证器 RPC、签名者社会工程和 npm——其中没有任何一项被合约审计触及。
  • 不对称是结构性的。 攻击者在一扇门上花几个小时;防御者必须守住每一扇门,而几乎没有人把这种纪律变成日常习惯。这就是为什么同样的注册商社会工程和同样的 npm 攻陷一直有效。

审计方应该做什么

合约审计项目审查的是链上代码。最具影响力的一项改变是明确说明——并在可能的情况下审查——合约审计覆盖的外围防线。具体而言:

  1. 在报告中明确边界。 明确写出 DNS、托管、CI/CD、依赖项、签名者基础设施和通信不在合约审计范围内。客户通常默认“已审计”意味着“安全”;这个默认假设是这个领域最昂贵的假设。
  2. 审查链下签名权。 是否有任何特权铸币 / 升级 / 提款由单一 EOA 或云 KMS 密钥控制,而非多签或 HSM?是否有链上上限、速率限制、大型操作时间锁和熔断器,使任何链下签名——无论如何获得——都无法在单笔交易中转移无限价值?无抵押供应量正是以这种方式被铸造的——合约信任链下签名者授权的任何内容,而链上没有任何东西加以限制或延迟。
  3. 审查前端供应链。 依赖项的 lockfile + 来源证明、CI 中的 --ignore-scripts、所提供 bundle 的严格 CSP 和 SRI,以及在任何连接钱包的页面上对第三方脚本的硬性数量限制。
  4. 检查注册商和云加固。 DNSSEC + RegistryLock + CAA、注册商、DNS、云、CDN 和 npm 账户上的硬件 2FA、带密钥创建告警的最小权限 API 密钥。
  5. 审查签名者流程,而不仅仅是被调用的合约。 Safe{Wallet} 完整性、第二台设备上的独立交易验证、以及预签名 / durable-nonce 流程的暴露面。
  6. 将持有钱包的 AI Agent 标记为独立发现项: 转账必须强制保留人工参与环节、最小代理权(给 Agent 执行所需的最小权限)、以及 LLM 之外的策略引擎。

协议方应该做什么

同样的方法,从另一侧出发:把整个外围防线当作生产环境来对待,并将每个安全决策推向确定性和可验证性。

  • 在每个注册商、DNS、云、CDN、npm 和社交媒体账户上启用抗钓鱼硬件 2FA/passkey;在人员离职或供应商关系结束的当天撤销访问权限。
  • 让交付的东西可验证: 依赖项锁定、来源证明、SBOM(软件物料清单)、CSP/SRI、在条件投递下仍然有效的外部完整性监控。
  • 让协议密钥远离单点故障: 多签或 HSM(硬件安全模块),加上链上上限、速率限制、大型或敏感操作的时间锁和熔断器——这样即使密钥被完全攻陷,也只能移动有限的数量,之后监控或人工即可介入。
  • 假设前端和 RPC 可能会撒谎: 钱包级模拟、多 RPC 交叉核验、硬件钱包地址验证。
  • 让事件响应成为常规: 密钥轮换、对任何付款或地址变更的带外验证(通过独立的可信渠道)、品牌保护监控——那些失败最严重的层(包括 Squarespace 域名迁移浪潮)是流程失败,而非密码学失败。

结论

五年的事件指向一个令人不安的结论:在 DeFi 中,合约通常是系统中最安全的部分。损失是通过 DNS、一个依赖项、一个云存储桶、签名者的屏幕或一个被劫持的账户进来的。一个协议应该能够回答的问题不是“合约安全吗?”,而是“在我的一个账户被攻陷之后,我还能被信任去提供正确的代码、持有正确的密钥,并向用户展示真相吗?”回答“是”比记录中的任何单起事件都便宜——而几乎还没有人把钱花在那里。

  • 原文链接: mixbytes.io/blog/the-web...
  • 鸿途知科网 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
版权声明

本文仅代表作者观点,不代表区块链技术网立场。
本文系作者授权本站发表,未经许可,不得转载。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门