2021年8月12日,据慢雾消息,加密孵化机构DAO Maker疑似遭受骇客攻击,导致大量USDC合约被转出。慢雾安全团队第一时间介入分析,并将经过流程与结果分析分享如下。
攻击对象:
在本次攻击中,攻击者部署了一个攻击合约(0x1c)用于快速从DAO Maker批量受害合约(0x41)中窃取资金。
攻击者地址1:0xd8428836ed2a36bd67cd5b157b50813b30208f50
攻击者地址2:0xef9427bf15783fb8e6885f9b5f5da1fba66ef931
攻击合约:0x1c93290202424902a5e708b95f4ba23a3f2f3cee
DAO Maker受害合约:0x41B856701BB8c24CEcE2Af10651BfAfEbb57cf49
DAO Maker受害合约deployer:0x054e71D5f096a0761dba7dBe5cEC5E2Bf898971c
DAO Maker受害合约admin:0x0eba461d9829c4e464a68d4857350476cfb6f559
攻击细节
本次攻击有别于往常攻击的是:DAO Maker受害合约(0x41)未开源,而攻击合约(0x1c)却开源了。
从上图开源的攻击合约以及链上记录我们可以看出:
1.骇客调用攻击合约(0x1c)中的h函数,h函数会循环调用f函数,f函数则通过DAO Maker受害合约的0x4b4f892a函数获取受害用户在合约(0x41)中的USDC存款数量。
2.函数h接着调用DAO Maker受害合约(0x41)中的withdraw From User(0x50b158e4)函数,传入用户存款的用户地址、USDC地址与需要提款的数量。
3.随后DAO Maker受害合约(0x41)将合约中的USDC转移至攻击合约中(0x1c)。
通过以上行为分析我们可以发现:攻击合约(0x1c)调用了受害合约(0x41)中的withdraw From User函数,受害合约(0x41)就将合约管理的资金直接转给攻击合约(0x1c)。我们直接反编译受害合约(0x41)查看withdraw From User函数进行简单分析:
通过反编译的程式码我们可以发现,此函数是有进行权限检查的,只有DAOcontracts才能调用此函数转移用户的资金。但攻击合约(0x1c)明显不是DAO合约,因此其DAO合约必然是被攻击者替换过的。
通过链上分析我们可以清楚的看到:
1.受害合约部署者(0x05)在部署受害合约(0x41)后于UTC4月12日08:33:45将0x0eba461d9829c4e464a68d4857350476cfb6f559地址设置为管理员:
TxHash:0xa1b4fceb671bb70ce154a69c2f4bd6928c11d98cbcfbbff6e5cdab9961bf0e6d
2.随后受害合约部署者(0x05)通过调用revoke Role函数放弃了受害合约(0x41)管理权限:
TxHash:0x773613398f08ddce2cc9dcb6501adf4f5f159b4de4e9e2774a559bb1c588c1b8
3.而管理员则在UTC8月12日01:27:39将DAO合约设置为了攻击合约(0x1c):
TxHash:0x2fba930502d27f9c9a2f2b9337a0149534dda7527029645752b2a6507ca6b0d6
因此攻击者才得以借助此攻击合约(0x1c)将受害合约(0x41)中用户的资金盗走。目前被盗资金被兑换成ETH转移至攻击者地址2(0xef)。
总结
本次攻击可能源于DAO Maker受害合约的管理员私钥泄漏。攻击者窃取私钥后将受害合约的DAO合约替换为攻击合约,攻击者通过替换后的合约转走了合约中的用户资金。而由于合约部署者在设置完合约管理员后就放弃合约管理权限,因此目前项目方可能还无法有效的取回合约控制权。