修复建议 看到这里我相信大家对自毁函数的功能及其危害都有一定的了解了。下面我们还是用开发者和审计者这两个角色来分析如何发现和预防通过自毁函数的攻击: (1)作为开发者 这里我们就拿上面的漏洞合约 ETHerGAME 来说,这个合约可以被攻击者攻击是因为依赖了 address(this).balance 来获取合约中的余额且这个值可以影响业务逻辑,所以我们这里可以设置一个变量 balance,只有玩家通过 EtherGame.deposit 成功向合约打入以太后 balance 才会增加。这样只要不是通过正常途径进来的以太都不会影响我们的 balance 了,避免强制转账导致的记账错误。下面是修复代码: // SPDX-License-Identifier: MITpragma solidity ^0.8.10; contract EtherGame { uint public targetAmount = 3 ether; uint public balance; address public winner; function deposit() public payable { require(msg.VALUE == 1 ether, You CAN only send 1 Ether); balance += msg.value; require(balance <= targetAmount, Game is over); if (balance == targetAmount) { winner = msg.sender; } } function claimReward() public { require(msg.sender == winner, Not winner); (bool SENT, ) = msg.sender.call{value: balance}(); require(sent, Failed to send Ether); }} (2)作为审计者 作为审计者我们需要结合真实的业务逻辑来查看 address(this).balance 的使用是否会影响合约的正常逻辑,如果会影响那我们就可以初步认为这个合约存在被攻击者强制打入非预期的资金从而影响正常业务逻辑的可能(比如被 selfdestruct 攻击)。在审计过程中还需要结合实际的代码逻辑来进行分析。 本文来源:慢雾科技 原文标题:智能合约安全审计入门篇 —— 自毁函数 声明:本文为入驻“火星号”作者作品,不代表火星财经官方立场。 提示:投资有风险,入市须谨慎,本资讯不作为投资理财建议。 免责声明:作为区块链信息平台,本站所提供的资讯信息不代表任何投资暗示,本站所发布文章仅代表个人观点,与火星财经官方立场无关。虚拟货币不具有法定货币等同的法律地位,参与虚拟货币投资交易存在法律风险。火星财经反对各类代币炒作,请投资者理性看待市场风险。 关键字:solidity智能合约安全审计以太坊攻击 (责任编辑:admin) |