SharkTeam在之前的“十大智能合约安全威胁”系列课程中,根据历史发生的智能合约安全事件,总结分析了在智能合约领域中出现较多、危害最大的前10大漏洞。这些漏洞之前通常出现在Solidity智能合约中,那么对于Move智能合约来说,会不会存在相同的危害呢?
SharkTeam【Move语言安全性分析及合约审计要点】系列课程将带您逐步深入,内容包括权限漏洞、重入漏洞、逻辑校验漏洞、函数恶意初始化、回退攻击、提案攻击、操纵预言机、合约升级漏洞、三明治攻击、重放攻击。本章内容【提案攻击】。
提案攻击针对的是去中心化自治组织 (DAO)。在DAO中,参与者会提出关于未来协议升级、资金管理等一系列的提案。为了让提案生效,需要持有治理代币的账户对其进行投票。DAO的治理代币代表了投票的票数,持有治理代币就有DAO的治理权限,可以参与提案的发起、投票与执行等一系列活动。持有的治理代币越多,其权限也就大,甚至会影响到去中心化程度。
虽然提案治理有利于建设去中心化的未来,但是也存在一些缺陷。治理代币持有比例较小的用户对提案的决策影响很小, DAO的治理消极怠慢且参与度低,治理代币持有比例较高的用户则会积极参与到治理中,对提案决策影响较大,甚至会主动收购消极者持有的治理代币,这进一步导致 DAO 当中投票权的中心化,转而服务于少数人利益。持有较多治理代币的用户,拥有过多的投票权。
当某个用户的投票权超过投票阈值的时候,提案的提交和执行完全可以由单个用户决定,完全违背了DAO的意图。当提案可以由单个用户决定的时候,这就构成了提案攻击的前提条件,同时该用户可以成为发起提案攻击的攻击者。
在DAO中,攻击者长久或临时持有绝对的投票权,然后发起并执行非法提案,损害他人利益而使自己获利,这种行为称为提案攻击。比如,Solidity生态中的Beanstalk Farms和Fortress Loans这两个项目都曾遭受过提案攻击。
2022年4月17日,以太坊上面的算法稳定币项目Beanstalk Farms遭黑客攻击,损失超过8000万美元,包括 24830 ETH 和 3600 万 BEAN。该事件完整的攻击过程及其交易如下:
攻击者通过攻击合约发起对提案的投票和执行的关键过程如下:
(1) 通过闪电贷、添加流动性以及代币兑换,攻击者获得了大量的治理代币,共计58,924,887 BEAN3CRV-f
(2) 使用上面得到的所有BEAN3CRV-f对提案进行投票,使提案通过并执行。
提案执行后,攻击者获得了36,084,584 BEAN,0.5407 UNI-V2,874,663,982 NEAN3CRV-f以及60,562,844 BEANLUSD-f
(3) 移除流动性获得交易对中代币,然后归还闪电贷的金额以及手续费,并向Ukraine Crypto Donation捐赠了250k USDC 。
(4) 将剩余的Token兑换成WETH,将所得的24,830 WETH提取出来,并转账到攻击者地址,完成攻击。
此次提案攻击中,攻击者通过闪电贷获得了大量的治理代币,窃取了DAO中的绝对控制权,即不再需要其他人投票就可以通过和执行提案。这使得其提交的非法提案InitBip18的通过和执行可以由攻击者自己投票决定。最终,非法提案InitBip18成功执行,让攻击者获取了大量非法收益。
2022年5月9日,币安智能链的Fortress Loans遭到黑客攻击。此次攻击事件使得项目方损失了1048.1 ETH以及40万DAI。该事件攻击过程及其交易如下:
其中关键攻击过程如下:
txHash: 0x13d19809b19ac512da6d110764caee75e2157ea62cb70937c8d9471afcb061bf
(1)攻击者合约调用Fortress治理合约执行了Id=11的提案。其中,Id=11的提案的内容为设置fToken的抵押因子为700000000000000000。
(3)修改完抵押因子后,攻击合约调用了Chain合约的submit函数,修改了其中的状态变量,进一步影响到了价格预言机的价格计算。
submit函数如下:
这里之所以能够成功修改状态变量fcds,是因为submit函数中缺少了对signer本身的校验以及power的校验。读取价格的函数如下:
由于调用submit函数修改了状态变量fcds,最终修改了价格预言机中的价格。
(4)完成以上修改后,攻击者从借贷合约中借取了大量的其他Token,然后全部兑换成了USDT。
攻击中,Id=11的提案的创建、投票以及执行过程如下:
(1)5月3日,创建提案;
(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日)。由于FTS价格低廉,攻击者实际仅仅使用9 ETH就兑换了超过400,000 FTS(实际是400,413 FTS),完成了整个攻击过程。
(3)5月8日,投票执行提案,实现提案攻击。
此次提案攻击中,DAO的治理代币价格极低,攻击者仅仅使用9 ETH就兑换到了超过DAO投票阈值(400000)的治理代币。这使得攻击者发起的提案仅需要攻击者自己进行投票就可以通过然后执行。
提案攻击发生在DAO中,应用了DAO的所有项目都有可能发生提案攻击,跟开发语言无关。因此,在Move生态中,使用了DAO的项目同样需要提防提案攻击。
通过Solidity生态中的两个事件,我们发现,发起提案攻击的一个必要的前提条件就是要获得大量的投票权。攻击者可以通过借贷、闪电贷、代币兑换等获得超过投票阈值的治理代币,或者通过贿赂其他持有较多数量治理代币的用户来获得投票等。
容易遭遇到提案攻击的项目,其治理代币更容易出现中心化的情况:
(1)通过闪电贷获得超过投票阈值的治理代币;
(2)治理代币价格低廉,攻击者付出少量价值就可以获得超过投票阈值的治理代币;
(3)治理代币集中在少数用户,只需要极少数的用户(比如2个用户)参与就可以获得超过投票阈值的票数,攻击者可以贿赂其他用户来获得超过投票阈值的票数。
应用了DAO的项目应尽可能地避免出现以上情况,要保证只有多数参与者投票才能通过提案,这样可以规避提案攻击。
Token的去中心化治理,即DAO是区块链必不可少的一部分,同时也是区块链项目以及代币管理的发展趋势。比如Starcoin,其标准库中内置了DAO模块的实现,可以通过该模块对各种链上参数进行投票治理。其他各类项目,如去中心化交易所等,如果使用了DAO来实现代币的治理,则需要考虑如何规避提案攻击。