智能合约重入漏洞攻击与防御 | 宜武汇-ag真人国际厅网站

智能合约存在特殊的fallback函数,fallback函数可以处理一些函数调用转账时的异常情况(函数签名不匹配、没有提供数据、没有声明转账函数等)[1]。当一个合约使用call方法转账且代码逻辑顺序是先转账后改变账户状态时,攻击者可以构造恶意的fallback函数展开重入攻击。

重入漏洞的类型有:单函数重入、跨函数重入、跨合约重入。单函数和跨函数重入都发生在同一合约中,区别在于fallback函数重入的对象是原函数还是新的函数。在实际的场景中,开发者通常会使用起到互斥锁作用的函数修饰器防御重入攻击;函数修饰器对单函数重入的防御效果很好。但也正因如此,开发者忽略了跨函数重入这种攻击路径。

​ 图一:单函数、跨函数重入攻击的攻击路径

2021年8月17日,在币安链上代币合约surge[2]因跨函数重入漏洞遭受闪电贷攻击损失五百万美元。攻击原理如图一所示,由于函数修饰器的存在攻击者没法实现sell函数的单函数重入;但是攻击者可以跨函数重入receive函数。

​ 图二:跨函数重入

跨合约重入攻击(也有研究人员称为只读重入[3])如图二所示:是指fallback函数重入的对象不是原合约,但目标合约与原合约共享参数。由于重入期间,关键参数还没有更新,攻击者可以利用旧的参数状态额外获利。

无论是单函数、跨函数还是跨合约重入攻击,虽然fallback函数重入的对象不同,但受攻击的本质原因都是账户状态的更新发生在转账操作之后。因此可以先更新账户状态后转账,或者采用pull-payment这种支付模式,它通过中间托管发送资金从而避免直接接触攻击者合约(例如openzepplin的pullpayment)。

参考文献

[1] “contracts — solidity 0.8.19 documentation.” (accessed may 20, 2023).

[2] bscscan.com, “surge (surge) token tracker | bscscan,” binance (bnb) blockchain explorer. (accessed may 20, 2023).

[3] read-only reentrancy – a novel vulnerability class responsible for 100m funds at risk, (oct. 13, 2022). accessed: may 20, 2023. [online video]. available:

原文链接:https://xz.aliyun.com/t/12564

网络摘文,本文作者:15h,如若转载,请注明出处:https://www.15cov.cn/2023/08/27/智能合约重入漏洞攻击与防御/

发表评论

邮箱地址不会被公开。 必填项已用*标注

网站地图