By:Dig2@慢雾安全团队
5 月 9 日上午,由于恶意攻击,Fortress Protocol 中的资金被盗。此次 Fortress Protocol 遭受攻击的根本原因在于治理合约存在设计缺陷及 Umbrella Network 预言机存在任意操纵漏洞。具体分析如下:
相关信息
Fortress Protocol 是 BSC 上的一个 DeFi 借贷协议。以下是本次攻击涉及的相关地址:
攻击者地址:
最终攻击获利交易 Hash:
FTS 代币合约地址:
具体细节分析
早在正式攻击的 19 天前,攻击者就已经开始做准备。
4 月 29 日,攻击者在 ETH 上通过 TornadoCash 获取了 20 ETH,并将其中的 12.4 ETH 通过 cBridge 跨链到 BSC 上。
FTS 代币是 Fortress Protocol 的治理代币,发行于 21 年 4 月,总供应量为 10,000,000。
由于 FTS 价格较低,攻击者仅花费约 11.4 ETH 购买约 400,000 个 FTS 代币,占总量的 4%。
5 月 4 日,攻击者创建恶意提案合约:
然后它被加入提案队列,是 11 号提案。
提案有三天投票期,在 5 月 7 日投票结束前的几个小时,攻击者用之前购买的约 400,000 个 FTS 给该提案投赞成票:
0xc368afb2afc499e7ebb575ba3e717497385ef962b1f1922561bcb13f85336252;
0x83a4f8f52b8f9e6ff1dd76546a772475824d9aa5b953808dbc34d1f39250f29d。
如下图,治理合约中要求,只要赞成数大于反对数,并且赞成票数大于等于 FTS 总量的 4%,也就是 400,000 个 FTS,提案即可通过。
投票结束后,提案为通过状态,还有两天的执行等待期。
两天后,也就是 5 月 9 日,用户创建攻击合约,并开始正式攻击。
在攻击合约中,首先执行了恶意提案:修改 FTS 代币的抵押率,从 0 修改至 0.7。于是攻击者可以用抵押的 FTS 70% 的价值借出协议中的资产。
Fortress Protocol 获取抵押物价格合约:
如下图,通过不同的预言机获取各个代币的价格:
其中,FTS 代币的价格是从 Umbrella 预言机获取的:
如下图,Umbrella 预言机的 submit 多签喂价函数存在漏洞:
只需要满足签名数量大于 requiredSignatures 即可,没有验证签名者是否拥有喂价权限,因此攻击者可以用任意账号生成签名来进行喂价。
攻击发生后,Umbrella Network 及时修复漏洞并更新了合约:
新的 submit 函数验证了签名者权限:
回到攻击本身,攻击者操纵预言机,将 FTS 设置了极高的价格,因此能借出协议中全部的 BNB, USDC, USDT, BUSD, BTCB, ETH, LTC, XRP, ADA, DAI, DOT, SHIB 等代币。
最终将它们换成三百余万 USDT 并通过 Anyswap 和 cBridge 跨链到以太坊,接着在以太坊上将 USDT 转换成 ETH 和 DAI 并转入了 TornadoCash。
总结
本次攻击同时利用了治理协议的缺陷和预言机币价操纵的漏洞。在治理合约开发时,需要考虑如何设计代币投票模式逻辑,使得作恶的巨鲸难以损害社区利益。同时,除了接入去中心化预言机以外,还要注意外部预言机与协议自身的兼容性。