这里有两个要害的处所 :
WETH: 55159.02134, WBTC: 9.01152, CHAI: 77930.93433, HBTC: 320.27714, HUSD: 432162.90569, BUSD: 480787.88767, PAX: 587014.60367, TUSD: 459794.38763, USDC: 698916.40348, USDT: 7180525.08156, USDx: 510868.16067, imBTC: 291.3471
在这样的操纵下,用户的余额固然在提现后固然已经扣除了,可是接下来的 supply() 函数的逻辑会再次将用户未扣除提现金额时的值包围归去,导致进攻者固然执行了提现操纵,可是余额不单没有扣除,反而导致余额增加了。通过这样的方法,进攻者能以指数级此外数量提现,直至把 Lendf.Me 提空。
按照上图,可以看到,在 supply() 函数的末端,,会对 market 和用户的余额举办更新,在这之前,用户的余额会在函数的开头预先获取好并生存在 localResults.userSupplyCurrent,如下:
进攻细节本次对 Lendf.Me 实施进攻的进攻者地点为 0xa9bf70a420d364e923c74448d9d817d3f2a77822,进攻者通过陈设合约 0x538359785a8d5ab1a741a0ba94f26a800759d91d 对 Lendf.Me 举办进攻。
代码阐明Lendf.Me 的 supply() 函数在举办了一系列的处理惩罚后,会挪用一个 doTransferIn 函数,用于把用户提供的币存进合约,然后接下来会对 market 变量的一些信息举办赋值。回首适才说的进攻流程,进攻者是在第二次 supply() 函数中通过重入的方法挪用了 withdraw() 函数提现,也就是说在第二次的 supply() 函数中,1590 行后的操纵在 withdraw() 之前并不会执行,在 withdraw() 执行完之后,1590 行后的代码才会继承执行。这里的操纵导致了进攻者可提现余额变多。
据慢雾科技反洗钱 (AML) 系统劈头统计阐明,Lendf.Me 被进攻累计的损失约 24,696,616 美元,详细偷取的币种及数额为:
附:
OpenZeppelin ReentrancyGuard: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/ReentrancyGuard.sol
开拓合约的时候回收先变动本合约的变量,再举办外部挪用的编写气势气魄
1、在函数的开头,合约首先获取了 storage 的 market 及 supplyBalance 变量。
我们发明,进攻者首先是存入了 0.00021593 枚 imBTC,可是却从 Lendf.Me 中乐成提现了 0.00043188 枚 imBTC,提现的数量险些是存入数量的翻倍。那么进攻者是如何从短短的一笔生意业务中拿到翻倍的余额的呢?这需要我们深入阐明生意业务中的每一个行动,看看毕竟产生了什么。
防止发起针对本次进攻事件慢雾安详团队发起:
通过阐明生意业务流程,我们不难发明进攻者对 Lendf.Me 举办了两次 supply() 函数的挪用,可是这两次挪用都是独立的,并不是在前一笔 supply() 函数中再次挪用 supply() 函数。
项目上线前请优秀的第三方安详团队举办全面的安详审计,尽大概的发明潜在的安详问题
以下是具体阐明进程。
紧接着,在第二次 supply() 函数的挪用进程中,进攻者在他本身的合约中对 Lendf.Me 的 withdraw() 函数提倡挪用,最终提现
通过把该笔生意业务放到 bloxy.info 上查察,我们能知道完整的生意业务流程
在要害的业务操纵要领中插手锁机制,如:OpenZeppelin 的 ReentrancyGuard
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。