qidao123.com技术社区-IT企服评测·应用市场

 找回密码
 立即注册

【区块链安全 | 第三十四篇】合约审计之重入漏洞

[复制链接]
发表于 2025-5-21 23:38:07 | 显示全部楼层 |阅读模式

概念

以太坊的智能合约可以互相调用,也就是说,一个合约可以调用另一个合约的函数。除了外部账户,合约自己也可以持有以太币并举行转账。当合约接收到以太币时,通常会触发一个叫做 fallback 的函数来执行一些特定的操作。这就是所谓的“隐蔽的外部调用”。
重入漏洞的问题出现在合约的外部调用上,尤其是当目标是一个恶意的合约时。攻击者可能会使用这种外部调用,在被攻击的合约中执行一些恶意逻辑。举个例子,当合约调用恶意合约时,恶意合约可以通过某些方式重新进入被攻击的合约,重复执行一些操作,乃至发起非预期的生意业务,从而粉碎合约的正常逻辑。
换句话说,重入漏洞就是攻击者使用合约间外部调用的机制,在合约中反复进入,造成不盼望发生的举动,通常会导致合约的资金被盗取。
漏洞代码

以下为典型的存在重入漏洞的合约代码
  1. // SPDX-License-Identifier: MIT
  2. pragma solidity ^0.8.3;
  3. contract EtherStore {
  4.     mapping(address => uint) public balances;
  5.     // 存款函数
  6.     function deposit() public payable {
  7.         // 增加余额
  8.         balances[msg.sender] += msg.value;
  9.     }
  10.     // 提款函数
  11.     function withdraw() public {
  12.         // 提款前,余额需大于0
  13.         uint bal = balances[msg.sender];
  14.         require(bal > 0, "Insufficient balance");
  15.         // 先发送以太
  16.         (bool sent, ) = msg.sender.call{value: bal}("");
  17.         require(sent, "Failed to send Ether");
  18.                 // 再清除余额
  19.         balances[msg.sender] = 0;
  20.     }
  21.     // 查询合约余额
  22.     function getBalance() public view returns (uint) {
  23.         return address(this).balance;
  24.     }
  25. }
复制代码
不难看出,该 EtherStore 合约是一个充提合约。
代码审计

我们重点关注 withdraw() 函数:
  1.     // 提款函数
  2.     function withdraw() public {
  3.         // 提款前,余额需大于0
  4.         uint bal = balances[msg.sender];
  5.         require(bal > 0, "Insufficient balance");
  6.         // 先发送以太
  7.         (bool sent, ) = msg.sender.call{value: bal}("");
  8.         require(sent, "Failed to send Ether
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|qidao123.com技术社区-IT企服评测▪应用市场 ( 浙ICP备20004199|浙ICP备20004199号 )|网站地图

GMT+8, 2025-8-11 10:17 , Processed in 0.083802 second(s), 32 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表