20251217 Yearn攻击事件中,协议错设地址,黑客为何自断一臂操控价格?
摘要:背景信息 20251217,Yearn 距离上次被攻击不到一个月,又被攻击了。这次被攻击的是自动化收益优化金库 yTUSD。攻击的原因是因为 yTUSD 协议错误配置了相关的衍生品代币地址,导致攻击者可以通过该代币操纵 share 价格,套
背景信息
20251217,Yearn 距离上次被攻击不到一个月,又被攻击了。这次被攻击的是自动化收益优化金库 yTUSD。攻击的原因是因为 yTUSD 协议错误配置了相关的衍生品代币地址,导致攻击者可以通过该代币操纵 share 价格,套取超额的 yTUSD 代币。
Exploit TX:https://app.blocksec.com/explorer/tx/eth/0x78921ce8d0361193b0d34bc76800ef4754ba9151a1837492f17c559f23771c43
项目背景
yTUSD 是一个自动化收益优化金库(Yield Vault)专门用于 TUSD(TrueUSD)稳定币的收益优化。
主要功能:
用户存入 TUSD,获得 yTUSD 代币作为存款凭证
合约自动将资金分配到收益最高的 DeFi 借贷协议中
随着时间推移,yTUSD 的价值会因利息累积而增长
合约集成了4 个主流借贷协议:
dYdX-去中心化保证金交易协议
Compound- 去中心化借贷协议
Aave- 去中心化借贷协议
Fulcrum (bZx)- 保证金交易与借贷协议
Trace 分析
攻击者首先进行了一大堆的代币兑换,在一堆的衍生品代币之间换过来换过去,感兴趣的读者可以深入查看。主要执行攻击的环节在 trace 的8370-10485 之间,攻击者在闪电贷的 callback 函数中进行了这次攻击。
通过 UniswapV3 闪电贷出 165305 sUSDe,调用 uniswapV3SwapCallback
通过 sUSD+sUSDe 把 165305 sUSDe 兑换成 215192 sUSD
通过 iSUSD 把 2125192 sUSD 兑换成 213848 iSUSD
通过 yTUSD.deposit 将 1169030 TUSD 兑换成 732294 yTUSD
把 213848 iSUSD 发送到 yTUSD
通过 yTUSD.withdraw 销毁 769318 yTUSD 赎回 1414919 TUSD
调用 yTUSD.rebalance 销毁 yTUSD 持有的 213848 iSUSD,赎回 215192 sUSD
发送 0.00000001 TUSD 给 yTUSD
通过 yTUSD.deposit 将 1000 TUSD 兑换成 117004400475278030 yTUSD
代码分析
在用户 yTUSD 协议进行 deposit/withdraw 操作时,会通过 _calcPoolValueInToken() 来计算兑换的比例。
_calcPoolValueInToken()函数
_calcPoolValueInToken()函数用于计算以 TUSD 计价的整个金库的总价值
返回值为以下内容的总和:
存入 Compound 的 TUSD 价值
存入 Fulcrum 的 TUSD 价值
存入 dYdX 的 TUSD 价值
存入 Aave 的 TUSD 价值
合约中持有的 TUSD
其中 _balanceFulcrumInToken() 函数是通过计算 yTUSD 持有多少对应 iToken 的数量,再乘上 rate 来得出对应的 TUSD 价值。
但是!本该是 Fulcrum 对应 TUSD 的代币,被错误设置为了 iSUSD 代币。
