智能合约重入漏洞攻击与防御
2023-5-28 15:31:0 Author: xz.aliyun.com(查看原文) 阅读量:16 收藏

智能合约存在特殊的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.” https://docs.soliditylang.org/en/v0.8.19/contracts.html#fallback-function (accessed May 20, 2023).

[2] BscScan.com, “Surge (SURGE) Token Tracker | BscScan,” Binance (BNB) Blockchain Explorer. http://bscscan.com/token/0xe1e1aa58983f6b8ee8e4ecd206cea6578f036c21 (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://www.youtube.com/watch?v=8D5ZJyU-dX0


文章来源: https://xz.aliyun.com/t/12564
如有侵权请联系:admin#unsafe.sh