这篇文章详细介绍了如何通过诱捕合约(Honeypot)防御智能合约中的重入攻击,提供了不同的攻击技术和防御措施的清晰结构。通过示例代码和逐步说明,读者能理解如何部署合约并测试安全性,从而提升对智能合约安全的认识和实战能力。
蜜罐是一个用于探测黑客的陷阱。重入攻击是影响去中心化系统的一种严重漏洞。为了应对这些威胁,开发者采用诸如蜜罐这样的技术。它通过吸引潜在攻击者暴露他们的战术,从而让开发者获取改进安全措施的有价值的见解。
通过结合两种漏洞:重入和隐藏恶意代码,我们可以构建一个合约来捕捉攻击者。此处我们将部署三个合约:一个银行合约、一个日志合约和一个蜜罐合约。该银行合约包含一个存取以太币的功能。日志合约作为事件记录器,记录有关事件的信息。
完整的智能合约代码:
攻击者注意到这些合约,除了蜜罐合约,因为蜜罐合约存储在一个单独的文件中,代码对外不可见。攻击者注意到银行合约的提款功能由于缺乏重入保护而易受流动性耗尽的攻击,并部署攻击合约,触发向银行合约的提款功能的递归调用。
让我们在 Scaffold-Eth 2 x Buildbear 上构建,它可以让你创建自己的私人沙盒,针对各种 EVM 和兼容 EVM 的区块链网络进行分叉,配备自己的代币水龙头和区块链浏览器。完整项目请见:这里。请按照下面的说明进行操作:
git clone https://github.com/BuildBearLabs/honeypots.git
cd honeypots
yarn install
yarn fork-bb
yarn deploy
这将部署所有合约,你将获得与下面相似的输出:
yarn start
访问你的应用:http://localhost:3000
。你可以在 Debug Contracts
页面与智能合约进行交互。你将看到这样的屏幕:
选择银行合约,并通过调用存款函数存入一些代币。成功交易后,它将显示如下:
现在从攻击合约调用攻击函数,看看它是否能利用漏洞。
太棒了!攻击者试图利用漏洞的尝试失败,所有存款依然锁定在银行合约中。蜜罐中和了攻击,变成了对黑客的陷阱。
Attack.attack()
函数,意图利用银行合约中的重入漏洞。attack()
函数内部,伊芙首先向银行合约存入1个以太币,然后立刻调用银行的 withdraw()
函数提取刚存入的1个以太币。withdraw()
函数,直到Alice的10个以太币全部转入攻击合约。_logger
参数被设置为蜜罐合约的地址,而不是实际的日志合约。尽管日志合约和蜜罐合约的接口是相同的,但银行合约与蜜罐合约互动。logger.log(msg.sender, _amount, "Withdraw");
,这实际上调用了蜜罐合约的 log()
函数。log()
函数检测到了从银行合约传递过来的字符串 "Withdraw",并执行 revert("It's a trap");
,有效地回滚了所有交易。withdraw()
函数调用内的所有交易都被回滚。这意味着Alice存入的以太币和伊芙存入的以太币均无法访问。BuildBear 是一个专门为 DApp 开发和测试设计的平台。开发者可以自由地构建个性化的私人测试网络沙盒,覆盖各种区块链网络。BuildBear 上无限制铸造本地和 ERC20 代币,以及不到3秒的快速交易时间,极大提升了 DApp 开发的生命周期。该平台配备了用于实时测试和调试的工具,确保开发者能够以无与伦比的便利性跟踪复杂的区块链交易。
与我们联系 Twitter | LinkedIn | Telegram | GitHub
作者: Sana
- 原文链接: medium.com/buildbear/a-p...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!