http://www.7klian.com

PeckShield 深度还原,锁死 MakerDAO 中 MKR 代币的裂痕是啥?

2019.05.09   Maker 基金会发布新版 DSChief 合约源码,PeckShield 披露了裂痕相关细则  

时间轴时间事件

deposits[msg.sender] = sub(deposits[msg.sender], wad),解锁黑客在 1. 的锁仓

05 月 07 日当天,经 PeckShield 独立研究发明,确认了该裂痕的存在(我们定名为 itchy DAO),详细而言:由于该管理合约实现的投票机制(vote(bytes32))存在某种缺陷,答允投票给尚不存在的 slate (但包括有正在投票的提案)。等用户投票后,进攻者可以恶意挪用 free() 退出,到达减掉有效提案的正当票数,并同时锁死投票人的 MKR 币。

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

05 月 10 日破晓,MakerDAO 果真了新版合约。Zeppelin 和 PeckShield 也各自独立完成了对其新合约的审计,确定新版本修复了该裂痕。本文 Peckshield 将发布该裂痕的细节与具体进攻手法。

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

subWeight(wad, votes[msg.sender])

5、挪用 free() 清除锁仓。这时会分成以下两步 :

如此便可以确定这个组合肯定不存在。

细节

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

这里我们假设有一个从未投过票的黑客规划开始进攻:

留意到这里有两个 vote 函数,两者的传参纷歧样(address 数组与 byte32),而 vote(address[ ] yays) 最终亦会挪用 vote(bytes32 slate),其大抵逻辑如下图所示:

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

2019.05.08   PeckShield 与 Maker 基金会接头并确认了裂痕细节  

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

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

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

从上面的阐明我们相识,黑客能透过这种进攻造成以下大概影响:

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

这里要留意挑选的进攻方针组合必需还不存在于 slates[ ] 中 (不然进攻便会失败),黑客亦可以本身提出一个新提案来插手组合计较,

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

在此我们发布裂痕细节与进攻手法,也但愿有引用此第三方库合约的其它 DApp 能尽快修复。

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

来历链接:mp.weixin.qq.com

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

惋惜的是,由于合约设计上失误,让进攻者有时机透过一系列行动,来恶意操控投票功效,甚致让锁定的 MKR 无法取出。

越日 05 月 08 日,PeckShield 紧张和 Maker 公司同步了裂痕细节,05 月 10 日破晓,MakerDAO 果真了新版合约。Zeppelin 和 PeckShield 也各自独立完成了对其新合约的审计,确定新版本修复了该裂痕。

原文标题:《MakerDAO 管理合约进级背后的安详风浪》

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

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

说点什么吧
  • 全部评论(0
    还没有评论,快来抢沙发吧!

相关文章阅读