织梦CMS - 轻松建站从此开始!

我的网站

当前位置: 主页 > 区块链

智能合约安全审计入门篇 —— 重入漏洞_慢雾科技_火星财经

时间:2021-12-09 16:22来源:未知 作者:admin 点击:
智能合约安全审计入门篇 —— 重入漏洞 背景概述 看了一个关于学习 solidity 的站(https://solidity-by-example.org),里面讲了关于 solidity 智能合约的很多漏洞,考虑到现在针对智能合约的攻

  智能合约安全审计入门篇 —— 重入漏洞

  背景概述

  看了一个关于学习 solidity 的站(https://solidity-by-example.org),里面讲了关于 solidity 智能合约的很多漏洞,考虑到现在针对智能合约的攻击事件频频发生,不法分子盗取的加密资产越来越多,我就想写一些与智能合约安全审计相关的文章给想了解智能合约安全审计的入门者阅读,让一些对智能合约安全审计感兴趣的初学者可以学到如何识别一些常见的漏洞和如何利用这些漏洞去做什么事情。这次我们就一起先看一个很经典的漏洞 —— 重入漏洞。

  前置知识

  重入漏洞相信大家都有所耳闻了,那么什么是重入漏洞呢?

  以太坊智能合约的特点之一是合约之间可以进行相互间的外部调用。同时,以太坊的转账不仅仅局限于外部账户,合约账户同样可以拥有以太并进行转账等操作,且合约在接收以太的时候会触发 fallback 函数执行相应的逻辑,这是一种隐藏的外部调用。

  我们先给重入漏洞下个定义:可以认为合约中所有的外部调用都是不安全的,都有可能存在重入漏洞。例如:如果外部调用的目标是一个攻击者可以控制的恶意的合约,那么当被攻击的合约在调用恶意合约的时候攻击者可以执行恶意的逻辑然后再重新进入到被攻击合约的内部,通过这样的方式来发起一笔非预期的外部调用,从而影响被攻击合约正常的执行逻辑。

  漏洞示例

  好了,看完上面的前置知识我相信大家对重入漏洞都有了一个大致的了解,那么在真实的环境中开发者写出什么样的代码会出现重入漏洞呢,下面我们来看一个比较典型的有重入漏洞的代码:

  /SPDX-License-Identifier: MITpragma solidity ^0.8.3;contract ETHerStore { mapping(address => uint) public BALances;function deposit() public payable { balances[msg.sender] += msg.VALUE; }function withdraw() public { uint bal = balances[msg.sender]; require(bal > 0);(bool SENT, ) = msg.sender.call{value: bal}(); require(sent, Failed to send Ether);balances[msg.sender] = 0; }/Helper function to check the balance of this contract function getBalance() public view returns (uint) { return address(this).balance; }}

  漏洞分析

  看到这里大家可能会有疑惑了,上面的代码就是个普通的充提币的合约,凭什么说他有重入攻击呢?我们来看这个合约的 withdraw 函数,这个函数中的转账操作有一个外部调用(msg.sender.call{value: bal}),所以我们就可以认为这个合约是可能有重入漏洞的,但是具体能否产生危害还需要更深入的分析:

  1. 所有的外部调用都是不安全的且合约在接收以太的时候会触发 fallback 函数执行相应的逻辑,这是一种隐藏的外部调用,这种隐藏的外部调用是否会造成危害呢? (责任编辑:admin)

织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
推荐内容