文章总结: 本文详细分析了Allbridge跨链桥攻击事件,攻击者利用CCTP协议信任假设缺陷,通过伪造跨链消息绕过销毁铸造环节,等待24天后在真实入金后6秒发动攻击,结合闪电贷补足余额,最终获利约19万美元。根因是合约缺少对消息头sender和recipient字段校验,Router未核验真实余额。建议修复时守住三条边界:校验sender和recipient参数,确保Router余额真实增加。
综合评分: 88
文章分类: 漏洞分析,应急响应,区块链安全,安全运营
横跨近一个月的跨链攻击,Allbridge被黑,损失约19万美元
子午猫
子午猫
网络侦查研究院
2026年9月22日 06:16
湖南
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
一、背景与前置知识:Circle CCTP 如何转账
2026年8月19日,知名跨链桥项目 Allbridge 遭到攻击,损失约 19万美元;本次攻击却横跨接近一个月才完成。理解这次攻击需要先理解 Circle 的 CCTP 协议:它的基本做法是在源链销毁 USDC、在目标链重新铸造同等数量的 USDC。正常流程为:源链 TokenMessenger 销毁 USDC → Circle MessageTransmitter 认证并转发消息 → 目标链 Circle TokenMessenger 接收消息 → 验证后铸造 USDC → Router 看到真实到账后再把 USDC 转给用户。其中 MessageTransmitterV2 会对完整消息出具 attestation(Circle 对指定跨链消息签名证明),但这个证明只能说明消息内容经过 Circle 认证,不能单独说明消息里写的金额已经真实发生转移。
二、根本原因:缺失的三项检查
在 Allbridge 的 CCTPTokenMessenger 合约中,接收跨链消息的 receiveCctpMessage 函数缺少对 CCTP 消息头中 sender 字段是否与远端 TokenMessenger 相等的检查,recipient 字段也没有检查是否等于 Circle 的 TokenMessengerV2 合约,导致 MessageTransmitterV2.receiveMessage 会把转发的跨链消息交给攻击合约来判断代币是否铸造成功;由于本合约中没有再检查 Router 的 USDC 余额在记账前是否真实增加,合约直接信任了攻击者构造的消息中的金额,最终将其记账成可付款余额(hookData 中 messageHash 对应的 receivedTokenAmount 数值)。此次 hookData 中也没有提供任何检查保护——Router 执行付款时会根据调用参数重新计算 messageHash,再查询该 hash 先前的内部入金余额,而攻击者可在 Polygon 发消息前离线算好同一组参数对应的 hash,再把 messageHash 放进跨链消息的 hookData 中,匹配的是攻击者自己创建的内部记录,与真实资产结算无关。
三、攻击步骤:24天等待 + 闪电贷补足
①2026年7月26日,攻击者提前在 Polygon 上直接调用 Circle MessageTransmitterV2 的 sendMessage 函数(通用跨链消息发送操作),交易产生 MessageSent 事件但实际没有发生 USDC 销毁;消息被填成 CCTP 风格数据(源域 Polygon、目标域 Base、声明金额 1,000,000 USDC、feeExecuted 为零、destinationCaller 指向 Allbridge 的 CCTPTokenMessenger,消息头 recipient 设为攻击者自己的合约,正文 sourceSender 设为配置里的远程 Messenger 地址,并把提前算好的 Router messageHash 放进 hookData),Circle 随后按协议签发 attestation。②攻击者等待约 24天——因为 Base Router 是转发路由、平时不长期持有大额流动性;直到 8月19日 Allbridge relayer 刚把一笔真实 CCTP 入金的约 191,112 USDC 铸到 Router(余额约 191,156 USDC),攻击者在真实入金发生后六秒开始执行正式攻击交易。③攻击合约先调用 receiveCctpMessage(destinationCaller 与 sourceSender 检查均由攻击者控制构造、均通过),再调用 Circle MessageTransmitterV2 的 receiveMessage,其中根据消息头 recipient 回调攻击合约,攻击合约直接返回成功、并未执行预期的铸币操作;而 Allbridge 也没有再次确认 Router 余额、没有检查被回调的目标合约是否等于 Circle TokenMessengerV2,直接把 amount – feeExecuted 写入 receivedMessages[messageHash],生成一笔 1,000,000 USDC 的内部 credit。
四、补足余额与获利
④由于假消息声明 1,000,000 USDC 而 Router 当时只有约 191,156 USDC,攻击者先通过 Aave 闪电贷 为 Router 提供 808,844 USDC,让余额暂时达到声明金额。⑤随后调用 Router 的 receiveToken 处理结算:Router 重新计算 hash 得到与 hookData 中一致的 messageHash,只检查该 messageHash 对应的 receivedTokenAmount 记录是否大于零,就视为已收到真实入金;扣除 0.1% 手续费后将 999,000 USDC 直接转给攻击合约。⑥窃取后向 Aave 归还 808,844 USDC 本金与约 404 USDC 闪电贷手续费,最终留下约 189,751 USDC 完成获利,基本清空了 Router 的 191,156 USDC(损失主要来自刚到达、尚未转给用户的真实跨链入金)。有趣的是,Router 收取的 1,000 USDC 费用,后来被其他攻击者用相同手法取走。
五、慢雾建议:守住三条边界
核心问题是 Allbridge 缺少对跨链消息合理性的检查——Circle 的 attestation 只能证明消息内容未被篡改,并不能证明跨链消息真实触发过代币的燃烧或铸造。慢雾安全团队建议项目方修复时同时守住三条边界:①消息头中的 sender 参数必须对应受信任的源端组件合约;②消息头中的 recipient 参数必须限制为目标链的 Circle TokenMessengerV2 合约;③只有在 Router 的 USDC 余额确实被铸造增加后才能建立可兑现的入金记录。
情报价值:这是一份高质量的跨链桥攻击复盘,对涉虚拟币案件研判有直接参考价值。启示:一是”attestation 有效 ≠ 资产真实到账”是跨链协议的核心信任假设瑕疵,攻击者可用”合法签名 + 伪造语义”的组合绕过销毁/铸造环节,提示审核跨链资金流时不能只看”消息已认证”,必须核对链上真实资产变动;二是攻击者”提前 24 天构造消息、等待真实入金后 6 秒发动、用闪电贷临时补足余额”的精算手法,显示攻击已高度金融工程化,链上取证须回溯”消息创建—attestation—真实入金—攻击执行”的完整时间线;三是”消息头 sender/recipient 未校验 + Router 未核验真实余额”属于典型”信任外部输入”,与此前多起桥攻击同源,可作为同类案件定性与风险提示的技术要点。
来源:慢雾安全团队 / 慢雾科技(2026-08-22 10:00
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:网络侦查研究院 子午猫
子午猫《横跨近一个月的跨链攻击,Allbridge被黑,损失约19万美元》