慢雾:Cream Finance 被黑简要分析

又是不兼容问题?

![71620713d3fd4042478ef02bc9e8daae.png](https://img.learnblockchain.cn/attachments/2021/12/AM0hI8mj61b804379b4e7.png) 2021 年 08 月 30 日,据慢雾区消息,DeFi 抵押借贷平台 Cream Finance 遭受闪电贷攻击,损失约 1800 万美元。慢雾安全团队第一时间介入分析,并将简要分析结果分享如下: ## 攻击流程 1. 攻击者从 Uniswap 闪电贷借出 500 ETH; 2. 将 500 ETH 抵押到 crETH 合约中,获得 crETH 凭证; 3. 从 crAMP 合约借出 19,480,000 AMP; -> 借贷时,cToken 合约会先通过 doTransferOut 函数将 AMP 代币转移给攻击者,再记录攻击者的借贷数量到 accountBorrows 中; -> 但 AMP 代币的 transfer 函数会通过钩子 (_callPostTransferHooks) 函数回调攻击者合约的 tokensReceived 函数; -> 攻击者合约在 tokensReceived 函数中再次调用了 crETH 合约,借出 355 个 ETH; -> 由于第一次借贷的合约是 crAMP 合约,第二次重入调用借贷的是 crETH 合约,所以 borrow 函数的防重入修饰器 (nonReentrant) 不起作用; -> 并且 borrow 函数是在给用户转账后再修改的借贷记录 (accountBorrows),导致攻击者可以进行超额借贷; 4. 随后攻击者使用另外一个合约 (0x0ec3) 对已经爆仓的合约 (0x38c4) 进行清算,使得不会因为超额借贷而导致交易失败; 5. 之后攻击合约 (0x38c4) 将 crETH 凭证转给 0x0ec3 合约,0x0ec3 合约使用这些凭证赎回了约 187.58 个 ETH; 6. 最后在这笔交易中攻击者获得了约 542.58(187.58 + 355) 个 ETH 与 9,740,000 个 AMP 代币; 7. 最后攻击者归还闪电贷,获利走人。其他攻击交易类似。 ## 总结 本次攻击是由于 Cream 借贷模型与 AMP 代币不兼容导致的。由于 AMP 代币转账时会使用钩子函数回调目标地址,且 Cream cToken 合约是在借贷转账后才记录借贷数量,最终造成了超额借贷的问题。 *参考攻击交易:https://etherscan.io/tx/0xa9a1b8ea288eb9ad315088f17f7c7386b9989c95b4d13c81b69d5ddad7ffe61e* 本文首发于:https://mp.weixin.qq.com/s/a9s61_u30f4X8310A952_Q

慢雾:Cream Finance 被黑简要分析插图 2021 年 08 月 30 日,据慢雾区消息,DeFi 抵押借贷平台 Cream Finance 遭受闪电贷攻击,损失约 1800 万美元。慢雾安全团队第一时间介入分析,并将简要分析结果分享如下:

攻击流程

  1. 攻击者从 Uniswap 闪电贷借出 500 ETH;
  2. 将 500 ETH 抵押到 crETH 合约中,获得 crETH 凭证;
  3. 从 crAMP 合约借出 19,480,000 AMP; -> 借贷时,cToken 合约会先通过 doTransferOut 函数将 AMP 代币转移给攻击者,再记录攻击者的借贷数量到 accountBorrows 中; -> 但 AMP 代币的 transfer 函数会通过钩子 (_callPostTransferHooks) 函数回调攻击者合约的 tokensReceived 函数; -> 攻击者合约在 tokensReceived 函数中再次调用了 crETH 合约,借出 355 个 ETH; -> 由于第一次借贷的合约是 crAMP 合约,第二次重入调用借贷的是 crETH 合约,所以 borrow 函数的防重入修饰器 (nonReentrant) 不起作用; -> 并且 borrow 函数是在给用户转账后再修改的借贷记录 (accountBorrows),导致攻击者可以进行超额借贷;
  4. 随后攻击者使用另外一个合约 (0x0ec3) 对已经爆仓的合约 (0x38c4) 进行清算,使得不会因为超额借贷而导致交易失败;
  5. 之后攻击合约 (0x38c4) 将 crETH 凭证转给 0x0ec3 合约,0x0ec3 合约使用这些凭证赎回了约 187.58 个 ETH;
  6. 最后在这笔交易中攻击者获得了约 542.58(187.58 + 355) 个 ETH 与 9,740,000 个 AMP 代币;
  7. 最后攻击者归还闪电贷,获利走人。其他攻击交易类似。

总结

本次攻击是由于 Cream 借贷模型与 AMP 代币不兼容导致的。由于 AMP 代币转账时会使用钩子函数回调目标地址,且 Cream cToken 合约是在借贷转账后才记录借贷数量,最终造成了超额借贷的问题。

参考攻击交易:https://etherscan.io/tx/0xa9a1b8ea288eb9ad315088f17f7c7386b9989c95b4d13c81b69d5ddad7ffe61e

本文首发于:https://mp.weixin.qq.com/s/a9s61_u30f4X8310A952_Q

  • 发表于 2021-12-14 10:45
  • 阅读 ( 144 )
  • 学分 ( 0 )
  • 分类:资讯

评论