首页 手机兼职平台区块链正文

PeckShield:技能拆解 DeFi 协议 Akropolis 被盗 200 万美元进犯进程

网赚之家 区块链 2020-11-24 22:31:50 6424 0

DeFiAkropolis203DAIPeckShield

1950DeFiAkropolis

区块链安全公司 PeckShield (派盾)安全人员敏捷定位到问题在于,Akropolis 项目的 SavingsModule 合约在处理用户存储财物时存在某种缺点,黑客使用此缺点接连施行了 17 次重入进犯,导致其 YCurve 和 sUSD 资金池丢失了 203 万枚 DAI。

PeckShield:技能拆解 DeFi 协议 Akropolis 被盗 200 万美元进犯进程

技能概要

本次进犯的原因如下:

  1. 合约没有对用户存储的 Token 进行白名单校验
  2. 要害的 deposit 函数没有对重入进犯的维护

简略而言:黑客使用 Akropolis 项目存在的存储财物校验缺点,向合约建议接连屡次的重入进犯,致使 Akropolis 合约在没有新财物注入的状况下,随便增发了很多的 pooltokens,然后再使用这些 pooltokens 从 YCurve 和 sUSD 池子中提取 DAI,终究导致项目合约丢失了 203 万枚 DAI。

进犯进程详解

进犯流程复现:

咱们经过剖析黑客施行进犯的买卖哈希
(0xe1f375a47172b5612d96496a4599247049f07c9a7d518929fbe296b0c281e04d)
发现,进犯来自于一个歹意的 ERC20 合约地址
(0xe2307837524Db8961C4541f943598654240bd62f)

这个歹意合约完成了一个钩子函数,使得函数在 transferFrom() (function signature: 0x23b872dd) 被调用的时分会被履行。

进犯者先是调用 SavingsModule.sol 中的 deposit() 函数,并将自己编写的坐落 0xe230 最初的歹意合约作为要存储的代币地址传入。当其歹意代币的 transferFrom() 函数被调用时,其钩子函数会再次调用 deposit() 函数并存入实在的 DAI 财物。

由于 pooltokens 增发的量经过代币 deposit 前后余额的差值得出。所以第2次 deposit 的实在的 DAI 财物会被核算两次用于铸造 pooltokens。第一次是在歹意合约 0xe230 存储的时分,第2次是在 DAI 存储的时分。也便是说,假如第2次存储的时分存入了 25K DAI, 那么由于重入进犯,总的铸造的 pooltokens 将会是双倍,也便是 50K DAI 。

PeckShield:技能拆解 DeFi 协议 Akropolis 被盗 200 万美元进犯进程

以此类推,黑客一共建议 17 次重入进犯并取得了一共 2,030,841.0177 个 DAI 财物。

值得注意的是,在进犯的最开端,进犯者还使用了 dYdX 的 闪贷功用。

中心缝隙详解

接下来,咱们剖析下存在缝隙的代币存储逻辑。Akropolis 的用户能够将代币存储入 Delphi Savings Pools,而资金池会铸造相应的 pooltokens 给用户。中心逻辑在 SavingsModule::deposit()(1,944 行)。

PeckShield:技能拆解 DeFi 协议 Akropolis 被盗 200 万美元进犯进程

第一步:进犯者调用 deposit() 函数并供给 _tokens 参数。这个函数在进一步调用 depositToProtocol(_protocol,_tokens,_dnAmounts) 前后会核算代币的余额,并经过代币余额的改变来决议即将铸造的 poolTokens 数目 (第 1,970 行)。而 depositToProtocol() 函数会调用方针代币的 safeTransferFrom() 函数来进行代币的转账 (第 2,004 行)。但是 deposit() 函数没有对重入进犯进行检测,也没有查看存入的代币是否为歹意代币;

第二步:在歹意代币的 transferFrom() 函数被调用的时分,触发钩子函数,然后再次调用 deposit() 函数;

第三步:由于第2次调用 deposit() 函数的时分进犯者存入了真实的 DAI 代币使得池子的代币余额发生改变,所以进犯者能够取得资金池铸造的 poolTokens;

第四步:当第2次 deposit() 函数调用完毕的时分,代码履行流程将回来第一次存储代币调用 depositToProtocol() 函数的上下文。这个时分,代币余额改变将被再次核算。此刻代币余额的改变和第2次调用 deposit() 函数代币余额改变相同。因而进犯者能够再次取得相应数目的 poolTokens。

被盗财物状况

0x9f26PeckShieldCoinHolmes便

mp.weixin.qq.com

版权声明

本文仅代表作者观点,不代表网赚之家本站立场。
本文系作者授权发表,未经许可,不得转载。

评论