Figure 4: OpenZeppelin's Exploit Demo (Hook Function)
另一方面, ERC777 尺度特性会不行制止地启用 hook 机制,因此我们需要检测并防备所有生意业务成果发生可以重入的风险。譬喻,假如 supply() 和 withdraw() 同时运行时加个互斥锁,那么进攻者就无法在 supply() 函数内部执行 withdraw() 操纵。
大概一个新创新,在原平台一点问题都没有,但组合接入另一个产物后就大概存在业务逻辑缺陷,进而成为黑客进攻整个 DeFi 市场的进口。
之后进攻者就可以像传统 PC 上的 hook 函数一样,在 tokensToSend() 做任何工作。如下图所示,进攻者可以对同一笔生意业务举办多次生意业务。
PeckShield 安详团队认为这是自年头 bZx 遭进攻之后,又两起黑客操作 DeFi 系统性风控裂痕实施的进攻。一个不容忽视的问题是,DeFi 市场的风险大概不只仅范围于平台自己,单个平台的模式创新很大概在与其他平台业务接轨时发生裂痕风险。
Figure 3: OpenZeppelin's Exploit Demo (Hook Setup)
Uniswap 进攻阐明Uniswap 被率先发明操作 ERC777 的兼容性问题实施了进攻。就如此恶意生意业务在 Bloxy 中的截图所示 (hash:0x9cb1d93d6859883361e8c2f9941f13d6156a1e8daa0ebe801b5d0b5a612723c1),函数内部举办了一次 tokenToEthSwapInput() 挪用。这意味着进攻者可以先通过哄骗生意业务汇率,然后再用另一笔 imBTC 以较低价值兑换更多的 ETH。
需要留意的是,正常的业务逻辑应该是项目合约中的 Balance 会减去被进攻者提走的 290 个 imBTC,然而当 supply() 执行返回时,余额并未被重置,仍然为 290 imBTC (第 1,599 行)。进攻者就是通过节制修改 Lendf.Me 中进攻者的 imBTC 抵押金额,有了足够大的 imBTC 抵押,进攻就可以从各类活动生意业务对中借出所有可用的 10 多种资产(资产总值 25,236,849.44 美元)。
该尺度扩展的成果之一是提供了「hook」机制,可以使普通地点或合约通过注册一个 tokensToSend() hook 函数来节制或拒绝发送 Token。这原本是在 ERC20 基本上增强了对 Token 的风险节制接口,是一次有益的改造。不外由于 DeFi 项目标可组合特性,一个合约在差异产物之间彼此挪用时,其业务逻辑巨大度也会大大增加,这就给注入代码进攻提供了大概性。
Figure 7: Lendf.Me Hack Details
Figure 5: Uniswap Hack
原文标题:《Uniswap 和 Lendf.Me 遭进攻始末:DeFi 乐高组合下的「多米诺」式崩塌》 04 月 18 日上午 08:58 开始, 一 DeFi 平台 Uniswap 被黑客操作重入裂痕实施了进攻。PeckShield 安详团队迅速定位到问题,发明黑客操作了 Uniswap 和 ERC777 尺度的兼容性问题缺陷实施了重入进攻。 在这个生意业务例子中,进攻者第一次 supply() 时确实向 Lendf.Me 存放了 289.99999999 个 imBTC,而在第二个 supply() 中,进攻者只存放 0.00000001 个 imBTC,但由于进攻者注册了 tokensToSend(),所以在执行 doTransferIn() -> IMBTC :: transferFrom()(第 1,583 行)时,挪用了进攻者函数 tokensToSend(),进攻者函数通过挪用 Lendf.Me 的 withdraw() 函数把 290 个 imBTC 直接全部提走。 糟糕的是,仅仅在 24 小时后,于 04 月 19 日上午 08:45,又一知名 DeFi 平台 Lendf.Me 也被黑客以雷同的手段实施了进攻。 最后并不能被忽视的一点是,我们需要当真思考下 DeFi 业务组合大概存在的系统性风险问题,平台方不只要确保在产物上线前有过硬的代码审计和裂痕排查,还要在差异产物做业务组适时思量因各自差异业务逻辑而潜在的系统性风控问题。 如上图,进攻者在赢利之后,马大将各个 Token 转移至其关联账号 0xa9bf70 之中,之后进攻者数十次 通过 1inch.exchange, ParaSwap 等平台将个中较量抢手的 WETH, PAX, BUSD 等 Token 换成 ETH, DAI, BAT 代币,别的将个中的 TUSD, USDT 代币存入 Aave 借贷平台。至此为止,进攻者及其关联账号的余额如上所示。 PeckShield 安详团队在此发起开拓者,可以回收 「Checks-Effects-Interactions」要领来防备这类重入进攻。举个例子,Lendf.Me 的 supply() 里假如是先更新 token 余额,再挪用 doTransferIn() 。这将会让进攻在 withdraw() 之后没有重置余额的大概性。 我们首先先容下 ERC777 尺度,ERC777 呈现的目标是对 ERC20 尺度举办改造。其不单实现了成果扩展,尚有 ERC20 尺度一样精采的兼容性,愿景是成为 ERC20 尺度的有效担任者。 进攻者 0x538359 共计从 Lendf.Me 赢利 25,236,849.44 美元,,个中各个 Token 漫衍如下: 具体裂痕进攻细节,我们将在文章后头做具体先容。 黑客进攻的道理是:进攻者操作以太坊 ERC777 尺度的 transferFrom() 回调机制,在内部挪用 callTokensToSend() 回调函数时挟制生意业务 ,并在真正更新余额的 move() 函数之前举办恶意进攻。 PS:此次黑客对 Lendf.Me 的进攻对 DeFi 社区来说无疑是一场劫难,在此发起宽大 DeFi 开拓者务必留意业务存在的系统性风控风险,应尽大概和第三方安详公司相助排查一切潜在的安详风险。 Figure 2: ERC777-Compatible tokensToSend() Hijacking 个中最要害的部门是,进攻者可以通过注册 from 的 tokensToSend() 来实行回调。我们从下面的代码片断可以看到,ERC777 尺度中可以通过 getInterfaceImplementer()(1,054 行)得到进攻者的 tokensToSend() 接口,并在第 1,056 行挪用此函数。而此处正是黑客挟制生意业务实施进攻的进口。 黑客操作 ERC777 尺度的 transferFrom() 回调机制提倡进攻,PeckShield 发起开拓者回收 Checks-Effects-Interactions 要领举办防御。 Figure 6: Lendf.Me Hack 如 2019 年 4 月 OpenZeppelin 宣布的帖子以及 2019 年 7 月宣布的裂痕操作演示中所述,进攻者可以本身界说函数 tokensToSend(),并通过 setInterfaceImplementer() 来配置合约中的 hook 函数。 郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。