您的位置:首页 > 互联网 >

MakerDAO治理合约存在漏洞 投票机制允许投票给不存在的slate

2019-05-11 11:48:26 来源: PeckShield

北京时间 2019年05月07日,区块链安全公司 Zeppelin 对以太坊上的 DeFi 明星项目 MakerDAO 发出安全预警,宣称其治理合约存在安全漏洞,希望已

北京时间 2019年05月07日,区块链安全公司 Zeppelin 对以太坊上的 DeFi 明星项目 MakerDAO 发出安全预警,宣称其治理合约存在安全漏洞,希望已锁仓参与投票的用户尽快解锁 MKR 提并出。MakerDAO 的开发者 Maker 公司亦确认了漏洞存在,并上线了新的治理合约,并宣称漏洞已修复。

该安全威胁曝出后,PeckShield 全程追踪了 MKR 代币的转移情况,并多次向社区发出预警,呼吁 MKR 代币持有者立即转移旧合约的 MKR 代币。截止目前,绝大多数的 MKR 代币已经完成了转移,旧治理合约中尚有 2,463 个 MKR 代币(价值约 128万美元)待转移。

05月07日当天,经 PeckShield 独立研究发现,确认了该漏洞的存在(我们命名为 itchy DAO),具体而言:由于该治理合约实现的投票机制(vote(bytes32))存在某种缺陷,允许投票给尚不存在的 slate(但包含有正在投票的提案)。 等用户投票后,攻击者可以恶意调用 free()退出,达到减掉有效提案的合法票数,并同时锁死投票人的 MKR 代币。

次日05月08日,PeckShield 紧急和 Maker 公司同步了漏洞细节,05月10日凌晨,MakerDAO 公开了新版合约。Zeppelin 和 PeckShield 也各自独立完成了对其新合约的审计,确定新版本修复了该漏洞。

在此我们公布漏洞细节与攻击手法,也希望有引用此第三方库合约的其它 DApp 能尽快修复。

细节

在 MakerDAO 的设计里,用户是可以通过投票来参与其治理机制,详情可参照 DAO 的 FAQ。

以下是关于 itchy DAO 的细节,用户可以通过 lock / free 来将手上的 MKR 锁定并投票或是取消投票:

在 lock 锁定 MKR 之后,可以对一个或多个提案 (address 数组) 进行投票:

注意到这里有两个 vote 函数,两者的传参不一样 (address 数组与 byte32),

而 vote(address[] yays) 最终亦会调用 vote(bytes32 slate),其大致逻辑如下图所示:

简单来说,两个 vote 殊途同归,最后调用 addWeight 将锁住的票投入对应提案:

可惜的是,由于合约设计上失误,让攻击者有机会透过一系列动作,来恶意操控投票结果,甚致让锁定的 MKR 无法取出。

这里我们假设有一个从未投过票的黑客打算开始攻击:

1. 调用 lock() 锁仓 MKR,此时 deposits[msg.sender] 会存入锁住的额度。

2. 此时黑客可以线下预先算好要攻击的提案并预先计算好哈希值,拿来做为步骤 3 的传参,因为 slate 其实只是 address 数组的 sha3。

这里要注意挑选的攻击目标组合必须还不存在于 slates[] 中 (否则攻击便会失败),黑客亦可以自己提出一个新提案来加入组合计算,如此便可以确定这个组合必定不存在。

3. 调用 vote(bytes32 slate),因为 slate 其实只是 address 数组的 sha3,黑客可以线下预先算好要攻击的提案后传入。

这时因为 votes[msg.sender] 还未赋值,所以 subWeight() 会直接返回。接下来黑客传入的 sha3(slate) 会存入 votes[msg.sender],之后调用 addWeight()。从上方的代码我们可以看到,addWeight() 是透过 slates[slate] 取得提案数组,此时 slates[slate] 获取到的一样是未赋值的初始数组,所以 for 循环不会执行(由于 yays.length = 0)

4. 调用 etch() 将目标提案数组传入。注意 etch() 与两个 vote() 函数都是 public,所以外部可以随意调用。这时 slates[hash] 就会存入对应的提案数组。

5. 调用 free() 解除锁仓。这时会分成以下两步:

· deposits[msg.sender] = sub(deposits[msg.sender], wad)

解锁黑客在 1. 的锁仓

· subWeight(wad, votes[msg.sender])

从对应提案中扣掉黑客的票数,然而从头到尾其实攻击者都没有真正为它们投过票

从上面的分析我们了解,黑客能透过这种攻击造成以下可能影响:

一、恶意操控投票结果

二、因为黑客预先扣掉部份票数,导致真正的投票者有可能无法解除锁仓

时间轴

关键词: MakerDAO 治理合约 投票机制

精选 导读

募资55亿港元万物云启动招股 预计9月29日登陆港交所主板

万科9月19日早间公告,万物云当日启动招股,预计发行价介乎每股47 1港元至52 7港元,预计9月29日登陆港交所主板。按发行1 167亿股计算,万

发布时间: 2022-09-20 10:39
管理   2022-09-20

公募基金二季度持股情况曝光 隐形重仓股多为高端制造业

随着半年报披露收官,公募基金二季度持股情况曝光。截至今年二季度末,公募基金全市场基金总数为9794只,资产净值为269454 75亿元,同比上

发布时间: 2022-09-02 10:45
资讯   2022-09-02

又有上市公司宣布变卖房产 上市公司粉饰财报动作不断

再有上市公司宣布变卖房产。四川长虹25日称,拟以1 66亿元的转让底价挂牌出售31套房产。今年以来,A股公司出售房产不断。根据记者不完全统

发布时间: 2022-08-26 09:44
资讯   2022-08-26

16天12连板大港股份回复深交所关注函 股份继续冲高

回复交易所关注函后,大港股份继续冲高。8月11日大港股份高开,随后震荡走高,接近收盘时触及涨停,报20 2元 股。值得一提的是,在7月21日

发布时间: 2022-08-12 09:56
资讯   2022-08-12

万家基金再添第二大股东 中泰证券拟受让11%基金股权

7月13日,中泰证券发布公告,拟受让齐河众鑫投资有限公司(以下简称齐河众鑫)所持有的万家基金11%的股权,交易双方共同确定本次交易的标的资

发布时间: 2022-07-14 09:39
管理   2022-07-14

央行连续7日每天30亿元逆回购 对债市影响如何?

央行12日再次开展了30亿元逆回购操作,中标利率2 10%。这已是央行连续7日每天仅进行30亿元的逆回购缩量投放,创下去年1月以来的最低操作规

发布时间: 2022-07-13 09:38
资讯   2022-07-13

美元指数创近20年新高 黄金期货创出逾9个月新低

由于对美联储激进加息的担忧,美元指数11日大涨近1%创出近20年新高。受此影响,欧美股市、大宗商品均走弱,而黄金期货创出逾9个月新低。美

发布时间: 2022-07-13 09:36
资讯   2022-07-13

美股三大股指全线下跌 纳斯达克跌幅创下记录以来最大跌幅

今年上半年,美股持续回落。数据显示,道琼斯指数上半年下跌15 3%,纳斯达克综合指数下跌29 5%,标普500指数下跌20 6%。其中,纳斯达克连续

发布时间: 2022-07-04 09:51
推荐   2022-07-04

融资客热情回升 两市融资余额月内增加超344亿元

近期A股走强,沪指6月以来上涨4%,融资客热情明显回升。数据显示,截至6月16日,两市融资余额1 479万亿元,月内增加344 67亿元,最近一个半

发布时间: 2022-06-20 09:41
资讯   2022-06-20

4个交易日净买入超百亿元 北向资金持续流入A股市场

北向资金净流入态势延续。继6月15日净买入133 59亿元后,北向资金6月16日净买入44 52亿元。自5月27日至今,除6月13日以外,北向资金累计净

发布时间: 2022-06-17 09:37
推荐   2022-06-17