一个以太坊合约的漏洞分析-重入攻击

这篇具有很好参考价值的文章主要介绍了一个以太坊合约的漏洞分析-重入攻击。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

请找出下列合约漏洞,并说明如何盗取ContractB 中的数字资产,并修复合约。中说明:ContractB 的contract_a接口为ContractA 地址

pragma solidity ^0.8.21;
interface ContractA {
    function get_price() external view returns (uint256);
}

interface ERC20 {

    function balanceOf(address) external view returns (uint256);

    function transfer(address, uint256) external returns (bool);
 }
 
 interface UniswapV2Pair {
     function transfer(address, uint) external returns (bool);
     function mint(address to) external returns (uint ) ;
     function burn(address to) external returns (uint , uint );
 }
 
 contract ContractB {
     ContractA contract_a;
     UniswapV2Pair _uniswapV2Pair;
     ERC20 token0;
     ERC20 token1;
     uint256 liquidity;
     address public _owner;
     mapping (address => uint256) private _balances;
     bool check=true;
     modifier noreentrancy(){
         require(check);
         check=false;
         _;
         check=true;
     }
     constructor(address owner){
         _owner=owner;
     }
    function setcontracta(address addr,address uniswapV2Pair,address _token0,address _token1) public  {
         require(msg.sender==_owner);
         contract_a = ContractA(addr);
         _uniswapV2Pair = UniswapV2Pair(uniswapV2Pair);
         token0=ERC20(_token0);
         token1=ERC20(_token1);
     }
 
     function depositFunds() public payable noreentrancy(){
         uint256 mintamount=msg.value*contract_a.get_price()/10e8;
         _balances[msg.sender]+=mintamount;
     }
 
     function withdrawFunds(uint256 burnamount) public payable noreentrancy(){
         _balances[msg.sender]-=burnamount;
         uint256 amount=burnamount*10e8/contract_a.get_price();
         msg.sender.call{value:amount}("");
     }
     function balanceof(address acount)public view returns (uint256){
         return _balances[acount];
     }
 
 }

 pragma solidity ^0.8.21;
 contract ContractA {
     uint256 private  _totalSupply;
     uint256 private _allstake;
     mapping (address => uint256) public _balances;
     bool check=true;

     modifier noreentrancy(){
         require(check);
         check=false;
         _;
         check=true;
     }
     constructor(){
     }
     function get_price() public view virtual returns (uint256) {
         if(_totalSupply==0||_allstake==0) return 10e8;
         return _totalSupply*10e8/_allstake;
     }

     function deposit() public payable noreentrancy(){
         uint256 mintamount=msg.value*get_price()/10e8;
         _allstake+=msg.value;
         _balances[msg.sender]+=mintamount;
         _totalSupply+=mintamount;
     }
 
     function withdraw(uint256 burnamount) public noreentrancy(){
         uint256 sendamount=burnamount*10e8/get_price();
         _allstake-=sendamount;
         payable(msg.sender).call{value:sendamount}("");
         _balances[msg.sender]-=burnamount;
         _totalSupply-=burnamount;
     }
 }

这段 Solidity 代码中存在一个关键的漏洞,允许攻击者在 ContractB 中盗取数字资产。攻击者可以利用 withdrawFunds 函数中的漏洞来实现攻击,让我们一步步分析和修复这个问题。

漏洞分析:

  1. withdrawFunds 函数中,合约从 _balances[msg.sender] 减去了 burnamount,然后使用 msg.sender.call{value:amount}(""); 从合约向调用者地址发送以太币。

  2. 这里的漏洞是没有重入保护机制的。攻击者可以通过多次调用 withdrawFunds 函数来进行重入攻击,每次都可以取回以太币并重复扣除 _balances[msg.sender]

攻击步骤:

  1. 攻击者在合约中调用 depositFunds 函数来存入以太币,生成相应数量的代币。

  2. 攻击者多次调用 withdrawFunds 函数,重入攻击使 _balances[msg.sender] 不断减少,而每次调用都会从合约中取回相同数量的以太币。

  3. 因此,攻击者可以重复取回代币,并获得更多的以太币。

修复漏洞:

为了修复这个漏洞,需要在 withdrawFunds 函数中添加重入保护。以下是修复后的代码:

bool private checkReentrancy = true;

modifier noreentrancy() {
    require(checkReentrancy, "Reentrant call detected");
    checkReentrancy = false;
    _;
    checkReentrancy = true;
}

function withdrawFunds(uint256 burnamount) public payable noreentrancy() {
    require(_balances[msg.sender] >= burnamount, "Insufficient balance");
    
    _balances[msg.sender] -= burnamount;
    uint256 amount = burnamount * 10e8 / contract_a.get_price();
    
    (bool success, ) = msg.sender.call{value: amount}("");
    require(success, "Transfer failed");
}

在修复的代码中,我们在 withdrawFunds 函数内添加了一个 checkReentrancy 布尔变量,用于保护函数免受重入攻击。在函数调用之前,我们要求 checkReentrancytrue,并在函数开始时将其设置为 false,以防止多次进入。

注意:文章来源地址https://www.toymoban.com/news/detail-674831.html

  • 重入攻击是一种常见的智能合约漏洞,请务必在编写合约时采取适当的重入保护措施。
  • 此处提供的修复只是一个示例,根据实际情况和需求可能需要进行进一步的安全性和逻辑审查。
  • 在部署和使用智能合约时,务必注意审查合约代码,测试合约的各种情况,以确保安全性和可靠性。

到了这里,关于一个以太坊合约的漏洞分析-重入攻击的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 智能合约 -- 常规漏洞分析 + 实例

    漏洞分析 攻击者利用合约漏洞,通过 fallback()或者receive() 函数进行 函数递归 进行持续取钱。 刚才试了一下可以递归10次,貌似就结束了(version: 0.8.20)。 直接看代码: 银行合约:有存钱、取钱、查看账户余额等函数。 攻击合约: 攻击、以及合约接受以太币就触发的receive()函数

    2024年02月13日
    浏览(45)
  • shiro漏洞复现及其攻击流量分析

    最近面试时经常被问到,每次说的都不太完美,现在再来复现一边。 Apache Shiro是一个开源安全框架,提供身份验证、授权、密码学和会话管理。 利用vulhub搭建的靶场。 在Apache Shiro = 1.2.4版本中存在反序列化漏洞。 该漏洞成因在于,Shiro的“记住我”功能是设置cookie中的reme

    2024年02月06日
    浏览(29)
  • PHP程序的常见漏洞攻击分析

    目录 一、前言 二、如何通过全局变量进行攻击? 三、如何通过远程文件进行攻击?

    2024年02月08日
    浏览(30)
  • 欢迎来到Web3.0的世界:Solidity智能合约安全漏洞分析

    智能合约是运行在区块链网络中的一段程序,经由多方机构自动执行预先设定的逻辑,程序执行后,网络上的最终状态将不可改变。智能合约本质上是传统合约的数字版本,由去中心化的计算机网络执行,而不是由政府或银行等中央集权机构执行。智能合约程序可以用Solidi

    2024年02月03日
    浏览(45)
  • OKLink2月安全月报| 2起典型漏洞攻击案例分析

    在本月初我们发布的2024年2月安全月报中提到,2月全网累计造成损失约1.03亿美元。其中钓鱼诈骗事件损失占比11.76%。 OKLink提醒大家,在参与Web3项目时,应当仔细调研项目的真实性、可靠性,提升对钓鱼网站和风险项目的甄别能力,降低投资的风险。 官方社媒遭受诈骗与钓鱼

    2024年03月14日
    浏览(65)
  • 智能合约安全之重入攻击浅析

    概述:     重入攻击是由于智能合约调用了外部不安全合约,或者对外发送以太币,使得合约的外部调用能够被劫持,导致合约内的方法被外部合约递归调用 形成重入攻击有如下条件:     1、调用了外部不安全合约     2、使用了不安全的转账方式,未进行gas限制。    

    2024年02月07日
    浏览(42)
  • 一个小笔记——spankchain重入攻击

    SpankChain支付通道合约(受害合约): https://etherscan.io/address/0xf91546835f756da0c10cfa0cda95b15577b84aa7#code 攻击者地址: https://etherscan.io/address/0xcf267ea3f1ebae3c29fea0a3253f94f3122c2199 攻击者恶意合约地址: https://etherscan.io/address/0xc5918a927c4fb83fe99e30d6f66707f4b396900e 攻击者恶意合约发起的攻击交易(

    2024年02月11日
    浏览(42)
  • 漏洞分析:MS12-020漏洞

    漏洞分析:MS12-020漏洞 实验工具 1、VMware虚拟机 2、Kali 2021 系统虚拟机 3、Windows 7系统虚拟机 1、第一步:在VMware中打开Kali 2021虚拟机和Windows 7虚拟机,并确保两台机器能够互相【Ping】通,网络连接正常。 2、确定能连通后,打开MSF攻击框架,Kali 2021【终端】中输入命令【msf

    2024年02月05日
    浏览(36)
  • 墨者——内部文件上传系统漏洞分析溯源 内部文件上传系统漏洞分析溯源

    1.选择合适的文件上传 2.可以看到为 *.asp 文件 3.可以推测出此站点为 IIS 4.上传 shell.asp 试试 5.上传报错,将其改名为 shell.asp.txt 上传,发现上传成功 6.有个问题就是服务器将我们所上传的文件进行了重命名,故我们应该想办法截断 7.经过测试发现不行,那么查看一下操作系统

    2024年02月06日
    浏览(43)
  • 漏洞分析和利用

    1 安全漏洞生命周期 在渗透测试流程中,核心内容是找出目标系统中存在的安全漏洞,并实施渗透攻击,从而进入到目标系统中。而这一过程最主要的底层基础是目标系统中存在的安全漏洞(Vulnerability)。安全漏洞指信息系统中存在的缺陷或不适当的配置,它们可使攻击者在未

    2024年02月09日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包