智能合约中的蜜罐(Honeypot)攻击实用指南

  • BuildBear
  • 发布于 2024-02-16 15:31
  • 阅读 49

这篇文章详细介绍了如何通过诱捕合约(Honeypot)防御智能合约中的重入攻击,提供了不同的攻击技术和防御措施的清晰结构。通过示例代码和逐步说明,读者能理解如何部署合约并测试安全性,从而提升对智能合约安全的认识和实战能力。

关于智能合约中的蜜罐攻击的实用指南

蜜罐是一个用于探测黑客的陷阱。重入攻击是影响去中心化系统的一种严重漏洞。为了应对这些威胁,开发者采用诸如蜜罐这样的技术。它通过吸引潜在攻击者暴露他们的战术,从而让开发者获取改进安全措施的有价值的见解。

蜜罐中常用的技术

  • 重入攻击: 使合约陷入不断调用恶意外部合约的状态。可以通过这篇文章了解更多关于此攻击的信息。
  • 误导逻辑: 使用复杂的逻辑结构来混淆视听,并以间接的方式添加恶意代码,以实现异常行为。
  • 隐藏控制结构: 使用隐藏的控制结构来操纵资金流导致意外行为。

如何防止智能合约被利用?

  • 代码审查: 在部署任何合约之前,持续的代码审查和安全审计是必不可少的。
  • 监控交易: 分析合约交互,并注意是否有不规则、重复的交易以及意外的行为。
  • 验证外部合约: 如果使用外部合约,务必检查其有效性及是否存在漏洞。
  • 调研: 在与任何合约交互之前,进行调研、代码审查和社区反馈。
  • 使用可靠的资源: 使用像 Open zeppelin 这样的库,这些库经过时间的验证,能够减少代码和逻辑错误,并提供经过验证的最佳实践。
  • 审计合约: 进行基本的安全审计有助于识别潜在的蜜罐。

示例智能合约以演示攻击

通过结合两种漏洞:重入和隐藏恶意代码,我们可以构建一个合约来捕捉攻击者。此处我们将部署三个合约:一个银行合约、一个日志合约和一个蜜罐合约。该银行合约包含一个存取以太币的功能。日志合约作为事件记录器,记录有关事件的信息。

完整的智能合约代码:

攻击者注意到这些合约,除了蜜罐合约,因为蜜罐合约存储在一个单独的文件中,代码对外不可见。攻击者注意到银行合约的提款功能由于缺乏重入保护而易受流动性耗尽的攻击,并部署攻击合约,触发向银行合约的提款功能的递归调用。

让我们在 Scaffold-Eth 2 x Buildbear 上构建,它可以让你创建自己的私人沙盒,针对各种 EVM 和兼容 EVM 的区块链网络进行分叉,配备自己的代币水龙头和区块链浏览器。完整项目请见:这里。请按照下面的说明进行操作:

  • 克隆仓库并安装依赖项:
git clone https://github.com/BuildBearLabs/honeypots.git
cd honeypots
yarn install
  • 创建你的私人沙盒
yarn fork-bb
  • 将上面提供的智能合约复制到 Hardhat 内的合约文件夹中。同时,修改部署脚本。现在使用以下命令部署智能合约:
yarn deploy

这将部署所有合约,你将获得与下面相似的输出:

  • 在另一个终端,启动你的 NextJS 应用:
yarn start

访问你的应用:http://localhost:3000。你可以在 Debug Contracts 页面与智能合约进行交互。你将看到这样的屏幕:

选择银行合约,并通过调用存款函数存入一些代币。成功交易后,它将显示如下:

现在从攻击合约调用攻击函数,看看它是否能利用漏洞。

太棒了!攻击者试图利用漏洞的尝试失败,所有存款依然锁定在银行合约中。蜜罐中和了攻击,变成了对黑客的陷阱。

与Alice和伊芙一步步总结过程:

  • 初始存款: Alice向银行合约存入10个以太币。
  • 攻击启动: 攻击者伊芙调用 Attack.attack() 函数,意图利用银行合约中的重入漏洞。
  • 存款与提款:attack() 函数内部,伊芙首先向银行合约存入1个以太币,然后立刻调用银行的 withdraw() 函数提取刚存入的1个以太币。
  • 重入利用: 当银行合约将1个以太币返还给攻击合约,但没有实现接收函数时,会触发攻击合约中的回退函数。该回退函数递归调用银行合约的 withdraw() 函数,直到Alice的10个以太币全部转入攻击合约。
  • 日志对象操作: 当Alice部署银行合约时,构造函数中的 _logger 参数被设置为蜜罐合约的地址,而不是实际的日志合约。尽管日志合约和蜜罐合约的接口是相同的,但银行合约与蜜罐合约互动。
  • 日志函数执行: 银行合约执行 logger.log(msg.sender, _amount, "Withdraw");,这实际上调用了蜜罐合约的 log() 函数。
  • 陷阱激活: 蜜罐的 log() 函数检测到了从银行合约传递过来的字符串 "Withdraw",并执行 revert("It's a trap");,有效地回滚了所有交易。
  • 交易回滚: 由于回滚,银行的 withdraw() 函数调用内的所有交易都被回滚。这意味着Alice存入的以太币和伊芙存入的以太币均无法访问。
  • 结果: 伊芙试图利用重入漏洞的尝试失败,Alice和伊芙的以太币都锁定在银行合约中,有效地中和了攻击,并将其变成了对攻击者的陷阱。

关于 BuildBear:

BuildBear 是一个专门为 DApp 开发和测试设计的平台。开发者可以自由地构建个性化的私人测试网络沙盒,覆盖各种区块链网络。BuildBear 上无限制铸造本地和 ERC20 代币,以及不到3秒的快速交易时间,极大提升了 DApp 开发的生命周期。该平台配备了用于实时测试和调试的工具,确保开发者能够以无与伦比的便利性跟踪复杂的区块链交易。

与我们联系 Twitter | LinkedIn | Telegram | GitHub

作者: Sana

  • 原文链接: medium.com/buildbear/a-p...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
BuildBear
BuildBear
https://medium.com/buildbear