操纵预言机+提案攻击—Fortress Loans被黑事件分析
2022-5-12 11:2:55 Author: www.aqniu.com(查看原文) 阅读量:36 收藏

操纵预言机+提案攻击—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)推荐项目方选择审计单位对项目进行审计后再上线,进一步提高项目的安全性,规避安全风险。


文章来源: https://www.aqniu.com/vendor/83406.html
如有侵权请联系:admin#unsafe.sh