北京时间2019年05月07日,区块链安全公司Zeppelin对以太坊上的DeFi明星项目MakerDAO发出安全预警,宣称其治理合约存在安全漏洞,希望已锁仓参与投票的用户尽快解锁MKR提并出。MakerDAO的开发者Maker公司亦确认了漏洞存在,并上线了新的治理合约,并宣称漏洞已修复。
该安全威胁曝出后,PeckShield全程追踪了MKR代币的转移情况,并多次向社区发出预警,呼吁MKR代币持有者立即转移旧合约的MKR代币。截止目前,绝大多数的MKR代币已经完成了转移,旧治理合约中尚有2,463个MKR代币待转移。
05月07日当天,经PeckShield独立研究发现,确认了该漏洞的存在,具体而言:由于该治理合约实现的投票机制存在某种缺陷,允许投票给尚不存在的slate。等用户投票后,攻击者可以恶意调用free()退出,达到减掉有效提案的合法票数,并同时锁死投票人的MKR代币。
声音 | 肖磊:DC/EP应着眼长远 不应限制数字货币本身的国际属性:资深金融分析师肖磊今日发表公众号文章称,如果没有国际市场作为支持,没有区块链最具战略性应用的数字货币的支撑,中国在区块链领域建立全球性影响力恐怕难度较大。所以,官方数字货币,虽然基于国内市场,但一定得需要着眼于长远,不能因为存在某些金融方面的性担忧,就限制数字货币本身的国际属性。希望中国的数字货币早日推出,因为这不亚于纸币的诞生或中央银行的发明。[2019/11/22]
次日05月08日,PeckShield紧急和Maker公司同步了漏洞细节,05月10日凌晨,MakerDAO公开了新版合约。Zeppelin和PeckShield也各自独立完成了对其新合约的审计,确定新版本修复了该漏洞。
声音 | 肖磊:区块链能够建立比“公司”更加普世和高效的商业运行体系:11月13日,肖磊发文称,区块链技术有两个预期性潜力,第一个是它能够建立一种比“公司”更加普世和高效的商业运行体系,区块链会颠覆现有的,包括“公司”制这种已经非常普世、高效化的单“中心”组织形态,从而走上超越现有法律契约等信任保证的,多中心化时代。第二个是,区块链能够让相信不同力量的人,都能找到自己发挥和值得追随的市场模式,从而削除更多隔阂,有助于世界新的整合。[2019/11/14]
在此我们公布漏洞细节与攻击手法,也希望有引用此第三方库合约的其它DApp能尽快修复。
细节
在MakerDAO的设计里,用户是可以通过投票来参与其治理机制,详情可参照DAO的FAQ。
声音 | 肖磊:投资者的避险意愿开始升温,黄金和比特币价格开启了跳涨行情:今日,财经作家肖磊发文表示,关于人民币汇率破7的问题,市场出现了一定的恐慌情绪,投资者的避险意愿开始升温,黄金和比特币价格开启了跳涨行情。市场应该清楚,人民币汇率的破7,是中国主动做出的回应,是无奈的选择,也是被美国所三番五次刺激的结果。[2019/8/5]
以下是关于itchyDAO的细节,用户可以通过lock/free来将手上的MKR锁定并投票或是取消投票:
在lock锁定MKR之后,可以对一个或多个提案(address数组)进行投票:
注意到这里有两个vote函数,两者的传参不一样,而vote(addressyays)最终亦会调用vote(bytes32slate),其大致逻辑如下图所示:
声音 | 肖磊:只要允许市场自己运行 中国在加密货币领域就可以获得更大的权利和利益:财经专栏作家肖磊今日在公众号上发文表示,比特币价格目前再次回到12000美元上方,年内涨幅高达300%,其并没有成为二十一世纪的郁金香泡沫,反而更加刺激了金融科技的发展。美国互联网巨头Facebook基于全球对比特币的需求,以及对区块链技术的金融应用需求,正在推出一种新的世界货币基础设施。肖磊还表示,中国只要允许市场自己运行就足够了,不需要出台什么鼓励和刺激政策,只要不禁止,中国在这一领域就能获得更大的权利和利益。Facebook发行的libra目前受到全球关注,以其采用的区块链技术和去中心化运作模式,给未来建立新的世界货币体系带来了一线曙光,但目前看,libra除了技术和渠道上的优势,其实最终的承载工具,就是一个资产证券化的交易标的。对于中国市场来说,技术层面的演变,或者说政策层面被触动之后的思考,暂时也很难预测,但有一点是可以肯定的,如果开放交易,libra最大的持有方,有可能依然会逐步落到中国人手里。[2019/6/27]
简单来说,两个vote殊途同归,最后调用addWeight将锁住的票投入对应提案:
可惜的是,由于合约设计上失误,让攻击者有机会透过一系列动作,来恶意操控投票结果,甚致让锁定的MKR无法取出。
这里我们假设有一个从未投过票的黑客打算开始攻击:
1、调用lock()锁仓MKR,此时deposits会存入锁住的额度。
2、此时黑客可以线下预先算好要攻击的提案并预先计算好哈希值,拿来做为步骤3的传参,因为slate其实只是address数组的sha3。
这里要注意挑选的攻击目标组合必须还不存在于slates中(否则攻击便会失败),黑客亦可以自己提出一个新提案来加入组合计算,
如此便可以确定这个组合必定不存在。
3、调用vote(bytes32slate),因为slate其实只是address数组的sha3,黑客可以线下预先算好要攻击的提案后传入。
这时因为votes还未赋值,所以subWeight()会直接返回。接下来黑客传入的sha3(slate)会存入votes,之后调用addWeight()。从上方的代码我们可以看到,addWeight()是透过slates取得提案数组,此时slates获取到的一样是未赋值的初始数组,所以for循环不会执行
4、调用etch()将目标提案数组传入。注意etch()与两个vote()函数都是public,所以外部可以随意调用。这时slates就会存入对应的提案数组。
5、调用free()解除锁仓。这时会分成以下两步:
deposits=sub(deposits,wad),解锁黑客在1.的锁仓
subWeight(wad,votes)
从对应提案中扣掉黑客的票数,然而从头到尾其实攻击者都没有真正为它们投过票。
从上面的分析我们了解,黑客能透过这种攻击造成以下可能影响:
一、恶意操控投票结果
二、因为黑客预先扣掉部份票数,导致真正的投票者有可能无法解除锁仓
时间轴
时间
事件
2019.05.07
PeckShield复查并确认了漏洞存在
2019.05.08
PeckShield与Maker基金会讨论并确认了漏洞细节
2019.05.09
Maker基金会公布新版DSChief合约源码,PeckShield披露了漏洞相关细则
*文章为作者独立观点,不代表BSCEC立场
转载此文章须经作者同意,并请附上出处及本页链接。原文链接https://mp.weixin.qq.com/s?__biz=MzU3MTU2NTU1MA==
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。