3 月 5 日,Solv Protocol 部署的 BitcoinReserveOffering (BRO-SOLV-20MAY2026) 合约遭受攻击,损失 38 SolvBTC (价值约 270 万美元)。

作者:Beosin

3 月 5 日,Solv Protocol 部署的 BitcoinReserveOffering (BRO-SOLV-20MAY2026) 合约遭受攻击,损失 38 SolvBTC (价值约 270 万美元)。Beosin 安全团队对本次事件进行了攻击手法与资金流向分析,并将结果分享如下

攻击手法分析

本次事件的攻击交易交易哈希为: 0x44e637c7d85190d376a52d89ca75f2d208089bb02b7c4708ad2aaae3a97a958d

该攻击主要是利用了 BRO 合约中的一个逻辑漏洞:mint() 会把 ERC-3525 代币通过 safeTransferFrom() 转移到 wrapper 中,并触发 onERC721Received();回调函数会铸造一次 BRO,而外部的 mint() 会再次铸造相同的代币。

https://etherscan.io/address/0x15f7c1ac69f0c102e4f390e45306bd917f21cfcf#code

如上图所示,mint() 通过 nonReentrant 安全修饰符防止重入,但 onERC721Received() 并没有。在 mint() 中,当 amount_ == sftBalance 时,mint() 会执行 doSafeTransferIn(),该函数会执行 safeTransferFrom(from, address(this), tokenId)。在 mint() 执行到自身的 _mint(msg.sender, value) 之前,该操作会调用 BRO 合约上的 onERC721Received(),在onERC721Received() 里调用_mint(from_, value) 从而实现重入

攻击流程:

1. 攻击者调用 burn(amount, 0),将一个 ERC-3525 代币转移到攻击合约。

2. 随后调用 tokenOfOwnerByIndex(looper, 0),解析出可重用的代币 ID 49323. 然后通过 mint(4932, fullAmout),触发 amount_ == sftBalance 执行分支,实现攻击

攻击者通过 22 次上述的操作,成功从合约中提取 38 SolvBTC 并兑换成 1,211.05 ETH。

被盗资金追踪

根据链上交易数据,Beosin 通过旗下区块链链上调查与追踪平台 Beosin Trace进行了详尽的资金追踪,并将结果分享如下

目前,被盗的 1,211.05 ETH 经过转移被存入 Railgun,随后地址 0xad64a432153906f805ad13fafd3f05d7e29a3f06 提取 181 ETH,并将这部分资金存入 Tornado Cash。整体资金流向如下图所示:

被盗资金流向分析图 by Beosin Trace

以上地址均已被 Beosin KYT 标记为高风险地址,以攻击者地址为例:

Beosin KYT

结语

本次被盗资金涉及业务合约,对于此类合约,项目方应对合约的实现进行完整审计,引入紧急暂停、参数限制、防重入等安全特性安全审计依然是合约必不可少的环节。通过安全审计,Web3 企业可以尽可能全面地检测智能合约代码,发现并修复潜在漏洞,提高合约安全性。

免责声明:作为区块链信息平台,本站所发布文章仅代表作者及嘉宾个人观点,与 Web3Caff 立场无关。文章内的信息仅供参考,均不构成任何投资建议及要约,并请您遵守所在国家或地区的相关法律法规。