SharkTeam:十大智能合约安全威胁之提案攻击
作者: 日期:2022年11月09日 阅:1,817

问:我们常提到的智能合约漏洞真的是实际中威胁最大、发生最频繁的安全漏洞吗?

答:完全不是那样。例如“溢出”、“外部调用”等常提到的智能合约安全漏洞并不是最常发生,威胁最大的。

到底哪些安全威胁从发生频率和危害性上能称为Top10的呢?SharkTeam合约安全系列课程之【十大智能合约安全威胁】和您一起讨论和深入。第九课【详解提案攻击】。

一、什么是提案攻击

在去中心化自治组织 (DAO)中,参与者会提出关于未来协议升级、资金管理等一些提案。为了让提案生效,需要对其进行投票。在DAO中,参与者要想参与提案投票,需要持有对应的治理代币。拥有治理代币的持有者,可以进行发起提案、投票、执行提案一系列活动。

虽然提案治理有利于建设去中心化的未来,但是也存在一些缺陷。治理代币持有比例较小的用户对参与治理采取理性冷漠态度,这进一步导致 DAO 当中投票权的中心化,转而服务于少数人利益。持有较多治理代币的用户,拥有过多的投票权。

正如上面提及的一些缺陷,提案常常存在以下风险:

  • 决策影响:通过贿赂有偏见的提案影响持币者的决策;
  • 垃圾提案:参与者可以通过支付低价代币提出任意提案;
  • 参与度低:持币者有时候不能理解过强的技术性提案,因此做出不了正确的理解和参与治理的决定;
  • 高投票权:持币者拥有超多通过提案所需的代币数量,即拥有话语权,随意决定提案是否通过。

因此,攻击者能够通过获得足够的投票权来重塑规则,或者影响足够的代币持有者,对提案进行有偏见的投票。这样的行为,我们称之为提案攻击。

二、攻击事件分析

2.1 Beanstalk Farms

2022年4月17日,算法稳定币项目Beanstalk Farms遭黑客攻击,损失超过8000万美元,包括 24830 ETH 和 3600 万 BEAN。

提案攻击过程如下:

  • Aave平台借入350M DAI,500M USDC以及150M USDT,从Uniswap平台借贷32.1M BEAN,从SushiSwap平台借入11.6M LUSD;
  • DAI、USDC以及USDT全部投入到Curve DAI/USDC/USDT流动性矿池中,铸造出979,691,328个流动性代币3Crv;
  • 15M 3Crv兑换成15,251,318 LUSD,将964,691,328 3Crv添加流动性获得795,425,740 BEAN3CRV-f,将32,100,950 BEAN以及26,894,383 LUSD添加流动性,获取58,924,887 BEAN3CRV-f;
  • BEAN3CRV-f提案进行投票,使提案通过并执行。然后获得了36,084,584 BEAN,0.5407 UNI-V2,874,663,982 NEAN3CRV-f以及60,562,844 BEANLUSD-f;
  • 1,007,734,729 3Crv以及28,149,504 LUSD;
  • SushiSwap闪电贷的11,678,100 LUSD以及32,197,543 BEAN,其中包含了手续费;
  • 16,471,404 LUSD兑换成16,184,690 3Crv,移除流动性3Crv,得到522,487,380 USDC,365,758,059 DAI以及156,732,232 USDT;
  • Aave平台分别存入350,315,000 DAI,500,450,000 USDC以及150,135,000 USDT用于偿还闪电贷以及手续费;
  • 0.5407 UNI-V2的流动性,获得10,883 WETH以及32,511,085 BEAN并归还闪电贷的金额以及手续费;
  • Ukraine Crypto Donation捐赠了250k USDC,将剩余的Token兑换成WETH;
  • 24,830 WETH提取出来,并转账到攻击者地址,完成攻击。

我们经过分析发现,投票合约中的票数是由账户中的BEAN3CRV-f代币持有量计算得到的。

攻击者利用了该漏洞,通过闪电贷获得大量代币,将这些代币投入到矿池中,临时获得大量的BEAN3CRV-f代币,从而获得了绝对的票数优势,使得自己的提案可以由自己决定,而不需要其他人的投票。最终盗取了大量的Token

2.2 Fortress Loans

2022年5月9日消息,Fortress Loans遭到黑客攻击。此次攻击事件损失了1048.1 ETH以及40万DAI。

提案攻击过程如下:

  • 的提案的创建,时间为5月3日;
  • 5月6日;

该提案在加入到执行队列之前,接收到2次投票,然后将提案添加到队列中。

将提案添加到队列中,调用queue函数。

我们知道支持的票数只需要不低于400,000 FTS,投票就可以添加到执行队列中等待执行。两次投票支持的总票数为296,193 + 119,774 = 415,917 FTS > 400,000 FTS,并且eta一直为0,因此提案的状态应该为Suceeed,可以被加入到执行队列中。

  • Fortress治理合约执行了Id=11的提案,并且Id=11的提案的内容为设置fToken的抵押因子为700000000000000000;
  • Chain合约的submit函数,由于submit函数中缺少了对signer本身的校验以及power的校验,因此能够修改状态变量fcds,进一步影响到了价格预言机的价格计算;
  • Token。

本次提案攻击发生的根本原因有两个:

(1)价格预言机计算价格的数据来源Chain合约缺少签名地址的验证以及power的验证;

(2)治理合约中,受到FTS价格影响,提案投票的最低支持票数(FTS数量)的总价值低,使得提案可以在付出较小的代价下通过并执行。

三、预防措施

在DAO中,治理代币分配的市场机制无法区分想要为项目做出宝贵贡献的用户和高度重视破坏或以其他方式控制项目的攻击者,这两个群体都是愿意高价格购买大量的治理代币。我们有三个明确的选择:降低攻击的价值,增加获得投票权的成本,以及增加执行攻击的成本。

  • 降低攻击的价值
  • 项目越大越成功,它的价值越高,越容易成为黑客的攻击目标。为了在不破坏自身项目情况下,降低攻击的价值,相关设计人员可以限制提案治理范围来限制攻击的价值,比如限制提案中的更改协议参数的权限。
  • 增加获得投票权的成本
  • 间接降低治理代币的流动性,项目可以提供激励措施。比如通过质押或赋予代币较高的独立价值。独立价值的好处,当前持币者将不太愿意出售,这应该会增加市场价格。
  • 增加执行攻击的成本
  • 设计人员需要某种用户身份验证才能参与投票,例如KYC检查或声誉信用分数阈值。

最后,推荐项目方选择第三方审计机构对项目进行审计后再上线,进一步提高项目的安全性,规避安全风险。

申明:本文系厂商投稿收录,所涉观点不代表安全牛立场!


相关文章