http://www.7klian.com

慢雾:DeFi平台Lendf.Me被黑细节阐明及防止发起

进攻细节

1、在函数的开头,合约首先获取了 storage 的 market 及 supplyBalance 变量。

HUSD: 432162.90569,
来历链接:weixin.qq.com

WBTC: 9.01152,
原文来历:慢雾科技

附:OpenZeppelin ReentrancyGuard: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/ReentrancyGuard.sol
按照上图,可以看到,在 supply() 函数的末端,会对 market 和用户的余额举办更新,在这之前,用户的余额会在函数的开头预先获取好并生存在 localResults.userSupplyCurrent,如下:
这里有两个要害的处所:
2、在 withdraw() 函数的末端,存在同样的逻辑对 market 用户的余额信息 (supplyBalance) 举办了更新,更新值为扣除用户的提现金额后的余额。

通过在 Etherscan 上查察进攻者的个中一笔生意业务:https://etherscan.io/tx/0xae7d664bdfcc54220df4f18d339005c6faf6e62c9ca79c56387bc0389274363b

律动 BlockBeats 小编按:4 月 20 日破晓  dForce Network 宣布官方通告称,此次黑客进攻主要是操作 imBTC 资产 ERC777 尺度的裂痕举办了重入进攻。回调机制答允黑客重复将伪造的 imBTC 作为抵押物借出金钱,导致市值约两千五百万美金的资产从合约里被取出。详见《dForce 杨民道:正与生意业务平台、公安相助,并与黑客相同,追索被盗金钱》。

imBTC: 291.3471



据慢雾区情报, DeFi 平台 Lendf.Me 蒙受重入裂痕进攻。慢雾安详团队在收到情报后随即对此次进攻事件展开阐明,并快速定位了问题地址。
通过把该笔生意业务放到 bloxy.info 上查察,,我们能知道完整的生意业务流程
紧接着,在第二次 supply() 函数的挪用进程中,进攻者在他本身的合约中对
Lendf.Me 的 withdraw() 函数提倡挪用,最终提现
防止发起

之后进攻者不绝通过 1inch.exchange、ParaSwap、Tokenlon 等 DEX 平台将偷取的币兑换成 ETH 及其他代币。
据慢雾科技反洗钱 (AML) 系统劈头统计
阐明,Lendf.Me 被进攻累计的损失约 24,696,616 美元,详细偷取的币种及数额为:
我们发明,进攻者首先是存入了 0.00021593 枚 imBTC,可是却从 Lendf.Me 中乐成提现了 0.00043188 枚 imBTC,提现的数量险些是存入数量的翻倍。那么进攻者是如何从短短的一笔生意业务中拿到翻倍的余额的呢?这需要我们深入阐明生意业务中的每一个行动,看看毕竟产生了什么。
WETH: 55159.02134,
HBTC: 320.27714,
TUSD: 459794.38763,
BUSD: 480787.88767,
USDC: 698916.40348,
按正常的提现逻辑而言,在 withdraw() 单独执行的时候,用户的余额会被扣除并正常更新,可是由于进攻者将 withdraw() 嵌入在 supply() 中,在 withdraw() 函数更新了用户余额 (supplyBalance) 后,接下来在 supply() 函数要执行的代码,也就是 1590 行之后,用户的余额会再被更新一次,而用于更新的值会是先前 supply() 函数开头的生存在 localResults 中的用户原先的存款加上进攻者第一次挪用 supply() 函数存款的值。
USDT: 7180525.08156,
我们深入阐明下 supply() 函数
多个合约举办对接的时候也需要对多方合约举办代码安详和业务安详的把关,全面思量各类业务场景相团结下的安详问题

针对本次进攻事件慢雾安详团队发起:

4. 合约尽大概的配置暂停开关,在呈现「黑天鹅」事件的时候可以或许实时发明并止损

CHAI: 77930.93433,

区块律动 BlockBeats 提醒,按照银保监会等五部分于 2018 年 8 月宣布《关于防御以「」「」名义举办犯科集资的风险提示》的文件,请宽大公家理性对待区块链,不要盲目相信口不择言的理睬,树立正确的钱币见识和投资理念,切实提高风险意识;对发明的违法犯法线索,可努力向有关部分举报反应。    


本次对 Lendf.Me 实施进攻的进攻者地点为 0xa9bf70a420d364e923c74448d9d817d3f2a77822,进攻者通过陈设合约 0x538359785a8d5ab1a741a0ba94f26a800759d91d 对 Lendf.Me 举办进攻。
通过赋值给 localResults 变量的方法,用户的转入信息会先临时生存在这个变量内,然后此时进攻者执行 withdraw() 函数,我们看下 withdraw() 函数的代码:
媒介

以下是具体阐明进程。

在这样的操纵下,用户的余额固然在提现后固然已经扣除了,可是接下来的 supply() 函数的逻辑会再次将用户未扣除提现金额时的值包围归去,导致进攻者固然执行了提现操纵,可是余额不单没有扣除,反而导致余额增加了。通过这样的方法,进攻者能以指数级此外数量提现,直至把 Lendf.Me 提空。

Lendf.Me 慢雾科技 DeFi 安详

5. 安详是动态的,各个项目方也需要实时捕捉大概与自身项目相关的威胁情报,实时排查潜在的安详风险

原文标题:《慢雾:DeFi 平台 Lendf.Me 被黑细节阐明及防止发起》
PAX: 587014.60367,

Lendf.Me 的 supply() 函数在举办了一系列的处理惩罚后,会挪用一个 doTransferIn 函数,用于把用户提供的币存进合约,然后接下来会对 market 变量的一些信息举办赋值。回首适才说的进攻流程,进攻者是在第二次 supply() 函数中通过重入的方法挪用了 withdraw() 函数提现,也就是说在第二次的 supply() 函数中,1590 行后的操纵在 withdraw() 之前并不会执行,在 withdraw() 执行完之后,1590 行后的代码才会继承执行。这里的操纵导致了进攻者可提现余额变多。

USDx: 510868.16067,
代码阐明

在这里,我们不难阐明出,进攻者的 withdraw() 挪用是产生在 transferFrom 函数中,也就是在 Lendf.Me 通过 transferFrom 挪用用户的 tokensToSend() 钩子函数的时候挪用的。很明明,进攻者通过 supply() 函数重入了 Lendf.Me 合约,造成了重入进攻,那么详细的进攻细节是奈何的呢?我们接下来跟进 Lendf.Me 的合约代码。
1. 在要害的业务操纵要领中插手锁机制,如:OpenZeppelin 的 ReentrancyGuard

通过阐明生意业务流程,我们不难发明进攻者对 Lendf.Me 举办了两次 supply() 函数的挪用,可是这两次挪用都是独立的,并不是在前一笔 supply() 函数中再次挪用 supply() 函数。

2. 开拓合约的时候回收先变动本合约的变量,再举办外部挪用的编写气势气魄

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

相关文章阅读