操纵预言机+提案攻击—Fortress Loans被黑事件分析
2022年5月9日消息,Fortress Loans遭到黑客攻击。此次攻击事件损失了1048.1 ETH以及40万DAI。
SharkTeam第一时间对此事件进行了分析,并总结了安全防范手段,希望后续的区块链项目可以引以为戒,共筑区块链行业的安全防线。
攻击者地址:0xa6af2872176320015f8ddb2ba013b38cb35d22ad(简记为0xa6af)
攻击合约地址:0xcd337b920678cf35143322ab31ab8977c3463a45(简记为0xcd33)
被攻击合约地址:0x00fcf33bfa9e3ff791b2b819ab2446861a318285(简记为0x00fc)
从攻击合约创建开始的交易如下:
攻击发生在5月8日,攻击过程如下:
1. 攻击者创建攻击合约0xcd33,交易如下:
txHash: 0x4800928c95db2fc877f8ba3e5a41e208231dc97812b0174e75e26cca38af5039
2. 攻击者通过两笔交易向攻击合约转入100 FTS和3.02 MAHA
3. 发起攻击交易
txHash:0x13d19809b19ac512da6d110764caee75e2157ea62cb70937c8d9471afcb061bf
交易分析如下:
(1)攻击者合约调用Fortress治理合约执行了Id=11的提案。
另外,Id=11的提案的内容为设置fToken的抵押因子为700000000000000000,如下:
(3)修改完抵押因子后,攻击合约调用了Chain合约的submit函数,修改了其中的状态变量,进一步影响到了价格预言机的价格计算。
submit函数如下:
这里之所以能够成功修改状态变量fcds,是因为submit函数中缺少了对signer本身的校验以及power的校验。另外,价格预言机中的价格是如何被影响到的呢?我们看一下价格的获取过程,如下:
正是由于调用submit函数修改了状态变量fcds,最终修改了价格预言机中的价格。
(4)完成以上修改后,攻击者从借贷合约中借取了大量的其他Token。
4.将合约中借取的所有Token转换为USDT并从攻击合约提取到攻击者地址。
5. 通过跨链协议将USDT转移到了以太坊。
5. 以太坊上面,攻击者通过跨链协议提取转移的USDT。
6.攻击者将USDT兑换成ETH以及DAI。
7. 攻击者将兑换的ETH和DAI存入了Tornado平台。
此外, Id=11的提案的创建、投票以及执行过程如下:
1. 提案创建,时间为5月3日,交易如下:
txHash: 0x12bea43496f35e7d92fb91bf2807b1c95fcc6fedb062d66678c0b5cfe07cc002
2. 提案投票然后添加到执行队列,时间为5月6日。
该提案在加入到执行队列之前,接收到2次投票,然后将提案添加到队列中。
将提案添加到队列中,调用queue函数,如下:
这里,支持的票数只需要不低于400,000 FTS,投票就可以添加到执行队列中等待执行。两次投票支持的总票数为296,193 + 119,774 = 415,917 FTS > 400,000 FTS,并且eta一直为0,因此提案的状态应该为Suceeed,可以被加入到执行队列中。
此外,投票的FTS则是攻击者账户通过跨链协议Celer Network从以太坊账户中获取到的(时间为4月19日)。
进一步,以太坊上面的资金来源则是Tornado协议,时间为4月19日。
由于FTS价格低廉,攻击者实际仅仅使用9 ETH就兑换了超过400,000 FTS(实际是400,413 FTS),完成了整个攻击过程。
3. 投票执行。该投票在攻击交易中执行,时间为发起攻击的时间,即5月8日。
结论:综上所述,从交易的时间上来看,此次攻击事件时一件有预谋的安全事故。本次安全安全事件发生的根本原因有两个:
1. 价格预言机计算价格的数据来源Chain合约缺少签名地址的验证以及power的验证;
2. 治理合约中,受到FTS价格影响,提案投票的最低支持票数(FTS数量)的总价值低,使得提案可以在付出较小的代价下通过并执行。
针对本次事件中的安全漏洞,SharkTeam提出以下建议:
(1)对于治理合约,要谨慎设置最低投票数量,提高操纵的成本,降低提案被个人操纵的可能性。
(2)对于开发者,要思维逻辑严谨,并且要具备基本的安全性意识,在项目开发过程中, 保证代码逻辑缜密并与实际逻辑相符,尽量避免一下基本的逻辑和语言层面的安全问题。
(3)推荐项目方选择审计单位对项目进行审计后再上线,进一步提高项目的安全性,规避安全风险。