过去一周(2026/07/13 - 2026/07/19),以下 2 起重大安全事件值得关注,涉及以太坊和 Solana 上约 135 万美元的总损失。
| 日期 | 事件 | 类型 | 预估损失 |
|---|---|---|---|
| 2026/07/15 | BarnBridge | 治理机制不当 | ~$776K |
| 2026/07/16 | DeFiTuna | 健康检查缺陷 | ~$570K |
- DeFiTuna:仓位健康检查在存在非零债务的情况下,将零资产价值视为健康状态;攻击者通过控制的交换路由和单独的低流动性资金池触发了该缺陷,造成坏账仓位。
- BarnBridge:一个已废弃的治理系统被利用,用于修改关键协议配置并转走用户已授权的资金。
Web3 最佳安全审计机构
在上线前验证设计、代码和业务逻辑
本周重点:DeFiTuna
根本原因是仓位健康检查中存在有缺陷的零值分支:一个资产价值为零、未偿债务约 $570K 的仓位被判定为健康状态。攻击者通过将交换路由到单独的低流动性资金池来触发该缺陷,但健康检查本应是捕获由此产生的坏账的控制手段。
2026 年 7 月 16 日,Solana 上支持杠杆现货仓位的借贷协议 DeFiTuna 遭到攻击,损失约 $570K 的 USDC [1]。根本原因是仓位健康检查中存在有缺陷的零值分支,即便资产价值为零、债务为非零时,该分支仍将仓位判定为健康。攻击者以零抵押品开设了一个杠杆仓位,从协议金库借入 USDC,并将交换路由至攻击者控制的低流动性资金池,导致仓位仅收到可忽略不计的目标代币数量。精度截断随后将仓位价值四舍五入为零,健康检查将该仓位判定为健康,从而造成约 $570K 的坏账。
背景
DeFiTuna 是 Solana 上支持保证金交易的借贷协议。用户可以通过提供一种代币作为抵押品、从协议金库借款,并将借入资金兑换为目标代币来开设现货仓位。随后将对所形成的仓位与债务进行比较,以判断其是否处于健康状态。
在 DeFiTuna 现货市场中,两种资金池代币分别称为代币 A 和代币 B。在被攻击的市场中,代币 A 为 TUNA,代币 B 为 USDC。
USDC为抵押代币(collateral_token)。用户存入USDC作为保证金,从 DeFiTuna 金库借入额外的USDC,借入的USDC随后被兑换为TUNA。TUNA为仓位代币(position_token),即兑换后仓位所持有的资产。其净效果是以USDC债务为资金来源,对TUNA进行杠杆做多。- 金库账户持有贷款方流动性,是借入资金的来源。
- AMM 资金池为
TUNA/USDC交易对提供市场流动性和价格参考。
DeFiTuna 通过 Jupiter(一个 Solana 交换聚合器)路由仓位交换。交换路径以 Jupiter 路由数据和路由账户的形式提供给 DeFiTuna 指令。由于调用方提供这些账户,调用方可控制交换所使用的资金池。在执行交换前,DeFiTuna 会通过将正常市场资金池价格与预言机价格进行比较,执行交换前价格检查。
漏洞分析
存在漏洞的程序是 DeFiTuna(tuna4u...nogD)。
根本原因是仓位健康检查中存在有缺陷的零值分支。交换完成后,DeFiTuna 通过将持有的 TUNA 换算为 USDC 来对仓位进行估值。如果 TUNA 余额足够小,向下取整为零,则 total 字段变为 0。健康检查逻辑将 total == 0 视为健康状态,而不要求 debt == 0。


攻击分析
两项设计属性使攻击者得以控制借入资金的路由去向。第一,DeFiTuna 接受调用方提供的 Jupiter RouteV2 数据,而未根据预言机价格和借入金额自行推导最小可接受的 TUNA 输出量。第二,交换前预言机检查仅验证正常的 DeFiTuna 市场资金池,而非 Jupiter 路由实际使用的资金池。

注意: 项目团队认可的事后分析 [1] 将攻击者创建的资金池描述为在接近合法预言机价格处初始化。链上证据显示该资金池以极端价格初始化;交换前检查之所以通过,是因为它验证的是单独的正常市场资金池,而非攻击者控制的资金池。
以下分析基于交易 4x33Dq...EXj1。攻击者执行了多笔攻击交易,此笔交易展示了核心技术手法。
- 第一步:攻击者创建了一个新的 Fusion
TUNA/USDC资金池。该资金池使用真实的TUNA和USDC铸币地址,但与正常的 DeFiTuna 市场资金池相互独立。该资金池以接近刻度208636的极端价格初始化,将TUNA的定价设为每枚TUNA约 10.49 亿USDC。在此价格下,即使极少量的TUNA也能在交换中吸收数十万USDC。


- 第二步:攻击者在新资金池中挂出两个小额卖方限价订单。每个订单存入
0.000526 TUNA,合计0.001052 TUNA。由于资金池价格极高,这一极小量的TUNA供给在交换执行时可以吸收全部借入的USDC金额。


- 第三步:资金池准备就绪后,攻击者以
TUNA为仓位代币、USDC为抵押代币,开设了一个 DeFiTuna 现货仓位。攻击者提供0 USDC作为抵押品,并从 DeFiTuna 的USDC金库借入570,000 USDC。

- 第四步:交换前,DeFiTuna 将正常市场资金池价格与预言机价格进行比较。正常资金池的即时价格接近预言机价格,因此检查通过。该检查仅验证正常的 DeFiTuna 市场资金池,并未验证 Jupiter 路由将使用的 Fusion 资金池。

- 第五步:交换按照攻击者提供的 Jupiter 路由执行,将资金导入攻击者控制的 Fusion 资金池,最小输出量实际上被设为零。扣除协议手续费后,
569,601 USDC被路由至攻击资金池,而 DeFiTuna 仓位仅收到494个TUNA原始单位(0.000494 TUNA)。


- 第六步:交换完成后,该仓位持有约
570,000 USDC的债务,以及仅为尘埃量的TUNA。当 DeFiTuna 将该TUNA余额换算为USDC价值时,结果向下取整为0。健康检查将total == 0视为健康状态,因此该坏账仓位被接受。


- 第七步:攻击者提取了积累在攻击者控制的 Fusion 资金池中的
USDC。两笔提取金额几乎相等,与第二步中创建的两个限价订单仓位相对应。
结论
根本原因在于健康检查的 total == 0 分支无论是否存在未偿债务,均将仓位判定为健康。攻击者控制的路由和流动性创造了触发该缺陷的条件,但健康检查才是本应防止坏账产生的最终控制手段。
最直接的修复方案是拒绝任何 total == 0 且 debt > 0 的仓位。存在未偿债务的零值仓位永远不应被视为健康。此外,协议应根据预言机价格和借入金额独立推导最小可接受的交换输出量,而不依赖调用方提供的路由参数。将预言机/价格检查绑定到实际交换资金池,或根据协议计算的下限验证交换输出,可防止交换前检查通过路由至未经验证的资金池而被绕过。
参考资料
- [1] DeFiTuna 事后声明
本周更多事件
BarnBridge
2026 年 7 月 15 日,以太坊上的收益分配协议 BarnBridge 遭到攻击,损失约 $776K 的 USDC [1]。根本原因是已废弃的治理合约仍保留修改关键协议配置的权限。攻击者获取了足够的投票权,通过了一项恶意提案,替换了某协议组件的控制器,随后利用新控制器转走了用户已授权的 USDC。
背景
BarnBridge 是一个由 DAO 治理的协议,将用户资金分配至不同的借贷市场以产生收益。投票权由质押的 BOND 数量和锁定时长决定。提交提案需要至少相当于总投票权 1% 的投票权。提案须满足最低法定人数 40%,且赞成票须占参与投票总票数的至少 60% 方可通过。提案提交后,需经过两天的预热期、三天的投票期和两天的排队期,方可执行。
漏洞分析
根本原因是已废弃的治理合约在协议废弃后,仍保留修改关键协议配置的权限。该治理系统控制着 CompoundProvider 的 Controller 分配,而 CompoundProvider 是用户此前已授权可支出其 USDC 的合约。由于 BarnBridge 已被废弃,质押的 BOND 总量和活跃参与度大幅下降,使得恶意提案的通过变得极为容易。
攻击分析
以下分析基于交易 0xd191fe...895afb。
攻击者花费约 0.335 ETH 购入约 32,795 枚 BOND,随后存入并锁定 32,000 枚 BOND,获得约 43% 的总投票权。
- 第一步:攻击者部署了一个代理合约并提交了恶意提案。经过两天的预热期后,攻击者投入全部投票权予以支持,同时满足了法定人数和批准要求。


- 第二步:攻击者将提案加入队列。两天排队期结束后,攻击者执行该提案,将
CompoundProvider的Controller设置为攻击者的代理合约。

- 第三步:攻击者升级了代理合约的逻辑,并调用
_takeUnderlying(),利用约 50 名用户的未到期USDC授权,将其USDC转入CompoundProvider。随后攻击者调用transferFees()将资金转至攻击者地址,获利约 $776K 的USDC。

结论
若 DAO 或协议正在被废弃,其治理合约应放弃或永久禁用修改安全关键配置的能力,尤其是管理员、控制器和资金提取权限。具体措施包括:撤销治理合约对下游合约的管理员角色、将所有权转移至销毁地址,或执行最终提案以禁用升级功能并将控制器引用设置为不可变的安全值。在已废弃的协议上保留治理权限会造成低成本攻击面:随着参与度下降,达到法定人数所需的资金也会成比例减少。



