0x1 事件背景
零时科技区块链安全情报平台监控到消息,北京时间2022年5月9日凌晨 Fortress Loans 遭到攻击。
Fortress Loans 是一种算法货币市场和稳定币协议,旨在为 Binance Smart Chain(BSC)上的用户带来安全和拥有信任度的信贷和借贷服务。
目前该项目已损失约 1048.1 ETH 和 40万DAI(总价值约298万美元),零时科技安全团队及时对此安全事件进行分析。
0x2 攻击者信息
- 攻击者主要的漏洞利用交易
0x13d19809b19ac512da6d110764caee75e2157ea62cb70937c8d9471afcb061bf
- 攻击者地址
0xA6AF2872176320015f8ddB2ba013B38Cb35d22Ad
- 攻击者创建的合约地址
0xcd337b920678cf35143322ab31ab8977c3463a45(已自毁)
0x0db3b68c482b04c49cd64728ad5d6d9a7b8e43e6(用于提案以及投票的工具合约)
0x39e7fc9f6565c68104b01689ffc0487afbf06656 (攻击者前期测试的工具合约)
- 预言机相关合约地址
0xc11b687cd6061a6516e23769e4657b6efa25d78e
- 治理相关合约地址
0xe79ecdb7fedd413e697f083982bac29e93d86b2e
0x3 攻击分析
根据分析攻击者发送的攻击交易,可以梳理出大致攻击流程:
1、攻击者通过 PancakeSwap: Router v2 将大约 11.126 个 ETH 兑换了约 400413.3278 个 FTS Token
2、攻击者在正式发起攻击前进行了大量的测试,并且向 Fortress Governor Alpha 发起了11号恶意提案(改变贷款合约中 FTS Token 的抵押系数),随后攻击者使用兑换的 FTS Token 对其提案投了赞成票。同时将 FTS Token 存入贷款合约作为抵押品。
3、该提案通过后,攻击者使用攻击合约执行该提案,并且利用预言机相关合约中的 submit() 函数更新了贷款合约使用的价格,通过更新抵押系数,攻击者的抵押品(FTS)的价值被大幅提高;
4、攻击者使用 FTS Token换取大量其他 Token ,并最终将所有其他 Token 兑换成 ETH 以及 DAI Token。
0x4 漏洞细节
通过攻击交易分析可以看出,攻击者是通过治理合约执行恶意提案,通过恶意提案篡改 Fortress Loans 项目中价格预言机的相关参数,导致FTS币价激增,最终获利;
之所以恶意提案成功执行,是因为 Fortress Loans 所使用的治理合约中存在设计缺陷;根据治理合约源码中相关配置(同一提案最小票数)小于攻击者持有的金额,所以该提案被通过。
投票成功的情况所需最低的 FTS Token 是 40万,但由 FTS Token 价格较低,致使攻击者仅通过约11 ETH 就兑换了超过 40万个 FTS Token。
通过分析预言机合约源码, 可以发现用于更新价格的 submit() 函数任意角色都可调用的问题如下:
①处只对签名数量进行校验,但并未对②处获取的签名地址有效性进行判断,从而可以使用任意数量的地址签名绕过;③必要的校验语句被注释掉,故未对投票数进行校验,这几处问题合在一起导致了 submit 函数可被任意人员调用。
0x5 总结
通过此次攻击事件来看,出现安全风险的是在链上治理相关功能的设计缺陷,以及预言机合约中更新价格的函数可以任意调用,是多个漏洞组合而成,环环相扣,缺一不可。并且从攻击者交易中可以看出,攻击者蓄谋已久,从一个月前甚至更早就开始对项目进行“踩点”和测试。创建了一系列的攻击合约或攻击辅助合约,并且主要的攻击合约已在完成攻击后进行自毁,攻击获利也通过 cBridge(Celer Network) 等跨链桥后被转移到以太链,并且在一系列后续交易中被发送到 Tornado Cash 混币平台。‘
0x6 安全建议
- 项目方和社区应高度关注所有提案,并且增加对恶意提案的废除机制,如果出现恶意提案,可及时禁止其接受投票、执行提案;
- 预言机相关合约需要保证关键校验不可缺失,避免导致恶意操控;
- 建议项目上线前对所属合约风险进行严格审查。