Rari Capital 和 Fei protocol 攻击事件的 分析和复现

一. 漏洞源头: Compound起的坏头

老牌Defi借贷项目Compound在代码实现上存在兼容性问题, 没有遵循check-effect-interaction原则, 简单用人话翻译就是, 针对借贷场景,没有做到先记账, 再转账

代码链接

在大部分情况下, 这个逻辑没问题, 但是如果用户借贷的资产为带类似钩子函数的Token,就会引发重入的风险, 攻击者可以在记账之前进行预期之外的恶意操作, 对项目造成大量损失.

当然在Compound开发之初, 可能还没有check-effect-interaction这个说法, 所以我们不能责备他们太多, 而且他们自己非常清楚代码的缺陷, 所以在运营上一直避免引入不兼容的加密资产.

然而仿盘们心里并没有这个哔数.

以去年的Cream为例:

其实去年在分析Cream的时候, 我以为只会是孤例, 因为漏洞诞生于2个项目的错误拼接, 触发条件苛刻, 而且Cream上亿美金的损失会给开发者一个长足的教训.

然而现实远非我的预料, 3月的Hundred Finance, VOLTAGE FINANCE. 不到一年时间, 仿盘们以各种姿势, 前赴后继踏入同一条河流.

二. 新的漏洞触发姿势

Rari虽然吸取了前人的教训,没有引入不兼容的Token, 但是自己作死, 在CEther合约中使用了call.value来进行ETH的转账. 首次在不借助合作伙伴的情况下, 自主独立创造了漏洞环境.

三. 更优雅的攻击方式

以往仿盘们的攻击者, 虽然通过重入借贷了2次,但只能选择把原始质押资产留在池子里. 所以单次攻击最大获利为 70% + 70% - 100% = 40% 而这次攻击者虽然只有一次借贷, 但是自己原始的质押资产全身而退, 约等于白嫖了属于是.

四. 仿盘的自我修养

近一年的时间里, 仿盘们或浑然不知, 或修修补补, 有的项目方给几乎所有核心函数增加nonReentrant防重入锁, 以为这样万事大吉.

但是依然没有遵循check-effect-interaction原则, 治标不治本, 其实改一下代码顺序就可以....

例如记吃记打的Cream在后续更新版本中, 就更改了转账和记账的顺序

代码链接

git clone https://github.com/W2Ning/Rari_Fei_Vul_Poc.git && cd Rari_Fei_Vul_Poc

forge test -vvv --fork-url $eth --fork-block-number 14684813

转载文章,文章作者:区块链安全圈: W2Ning 大佬, github 链接:https://github.com/W2Ning

全部评论(0)