对智能合约的拒绝服务攻击:如何修复和避免(专家指南)PlatoBlockchain 数据智能。垂直搜索。人工智能。

对智能合约的拒绝服务攻击:如何修复和避免(专家指南)

阅读时间: 6 分钟

曾经访问过一个加载时间很长却发现目前无法打开的网站? 这就是拒绝服务攻击的影响。 

拒绝服务 (DoS) 攻击是审计智能合约时主要关注的众多漏洞之一。 这个博客旨在解开 DoS 攻击的来龙去脉——它是什么、它的影响、类型以及更多要添加的内容。

让我们快速进入并探索所有这些。 

什么是 DoS 攻击?

DoS 攻击旨在破坏网络、服务器或应用程序的处理能力,抑制合法用户的请求。 在这种情况下,攻击者通过发送更多流量来耗尽服务器的内存和带宽,从而使网络不堪重负。 

由于区块链拥有巨大的潜力,它们是 DoS 攻击窃取财富的主要目标。 最著名的加密货币,例如比特币, 以太坊 等,也经历过DoS攻击。 

分布式拒绝服务(DDoS)

分布式拒绝服务(DDoS)是一种DoS攻击,攻击者控制多个设备对目标节点发起攻击。

攻击者观察目标节点并引导其控制的多个设备发送大量信息淹没目标节点。 这使得目标崩溃并且无法完成指定的任务。  

区块链生态系统中 DoS 攻击的目标

从过去的 DoS 攻击事件的记录来看,区块链生态系统的每个部分都容易受到 DoS 攻击。 仅举几例, 

加密货币钱包: 与任何钱包一样,加密货币钱包用于存储、发送或接收加密货币。 这些在线钱包使用智能合约,容易受到 DoS 攻击,从而阻碍其服务和与 Dapp 的交互。 

加密货币兑换服务: 交易加密货币并在用户之间进行交换的在线平台。 它们是黑客执行导致平台及其服务不可用的 DoS 攻击的主要目标。 

例如:比特币交易平台 Bifinex 曾多次遭受 DDoS 攻击。 

内存(事务)池: 区块链上的交易需要在添加到区块之前进行验证。 在那之前,交易请求被存储在内存池中,这就像一个等待矿工挑选的未确认交易的存储库。 

费用高的交易最有可能被矿工选中。 因此,在内存池中充斥着许多小额费用的交易,导致用户支付高额费用来处理他们的交易。 因此,DoS 攻击在提高处理费方面发挥了魔力。 

共识参与者: 他们是解决逻辑并决定要添加到区块链中的块的参与者。 对共识领导者施加 DoS 攻击会阻止整个系统。 

混合服务: 它采用协议让用户匿名执行交易。 他们通过各种方式遭受 DoS 攻击,例如对混合池的过度参与请求、混洗输入不一致等。 

智能合约: 智能合约是区块链上每笔交易背后的底层协议。 对智能合约的 DoS 攻击可能会使节点崩溃,从而停止其托管的 Dapps 的运行。

DoS 攻击以几种可能的方式对它们执行,将在下一节中详细说明。

分析智能合约 DoS 攻击的类型 

智能合约中的 DoS 漏洞导致无限的资源使用或合约操纵。 这会导致正常活动的执行中止或中断,并破坏合约的逻辑。 

下面是智能合约中各种DoS攻击的分类

意外还原 DoS

为了研究这种对智能合约的 DoS 攻击,我们以拍卖合约为例。 拍卖合同会根据收到的每个最高出价进行更新,并返回前一个出价者的出价金额,因为它低于当前出价。

contract Auction {
    address frontRunner;
    uint256 highestBid;

    function bid() public payable {
        require(msg.value > highestBid, "Need to be higher than highest bid");
        // Refund the old leader, if it fails then revert   
        require(payable(frontRunner).send(highestBid), "Failed to send Ether");
 
        frontRunner = msg.sender;
        highestBid = msg.value;
    }
}

攻击者合约在构造函数中使用拍卖合约进行初始化,从而获得对拍卖合约的访问权。 在这种情况下,通过调用“attack()”函数,攻击者锁定了金额,因此即使收到更高的出价,它也无法将出价金额返还给攻击者。 

import "./Auction.sol";   
contract Attacker{
    Auction auction;

    constructor(Auction _auctionaddr){
        auction = Auction(_auctionaddr);
    }

    function attack (){
        auction.bid{value: msg.value}();
    }

}

这是因为“攻击者”合约不包含任何“receive()”或退还以太币的回退函数,导致意外还原。 这使得攻击者合同始终是最高出价者。 

阻止气体限制 DoS 

该块具有消耗的最大气体限制,该限制与要完成的计算工作量成正比。 在超过gas限制的情况下,会导致两种类型的DoS攻击。

Gas Limit DoS – 无界合约操作

有一个设定的gas限制,如果交易达到的gas限制高于设定的限制,则会导致交易失败。 

当攻击者操纵所需的气体时,情况会变得更糟。 那就是攻击者添加一些地址以获得非常小的退款。 每次退款都会收取汽油费; 因此,gas 成本超过了阻止退款交易发生的限制。 

struct Payee {
    address addr;
    uint256 value;
}

Payee[] payees;
uint256 nextPayeeIndex;

function payOut() {
    uint256 i = nextPayeeIndex;
    while (i < payees.length && msg.gas > 200000) {
      payees[i].addr.send(payees[i].value);
      i++;
    }
    nextPayeeIndex = i;
}

因此,在数组上实现循环时必须考虑必要的步骤。 

块馅

攻击者发起此攻击,通过发送具有高 gas 价格的计算密集型交易来阻止交易添加到区块中。 以类似的方式发出几笔交易以消耗整个gas limit。 

通过支付高昂的汽油费,攻击者确保只有预期的交易被添加到区块中,而忽略了其余的交易。 

所有者操作

每个合约都有一个所有者地址,该地址有权打开或暂停交易。 整个操作取决于所有者的地址,因此如果丢失,用户根本无法发送代币,合约功能将崩溃。

DoS 攻击的影响

块填充是阻止合法交易被添加到块中的众多影响之一。 但是,DoS 攻击还有其他几个影响。 

臃肿的账本: 区块链分类账是永久记录交易的地方。 区块链节点存储交易副本以验证双花。 DoS 攻击可以通过垃圾邮件交易使分类帐膨胀。

网络流量: 我们知道基于点对点模式的区块链功能。 区块链中的每个节点都会收到交易的副本。 DoS 泛滥可能导致交易量大,消耗网络带宽。 

节点故障: 需要软件支持来处理大量数据的节点上的区块链功能。 在事务泛洪期间,节点可能会耗尽内存,从而停止操作。

软件崩溃: 正如我们所讨论的,内存池或块对分配给它们的内存有一定的限制。 该软件在设定的限制范围内接收、处理和存储交易。 当传入交易超过内置限制时,软件就会崩溃。  

限制智能合约免受 DoS 攻击 

从 DoS 攻击的分析来看,可以采用以下方法来缓解攻击。 

难题: 服务器可以生成诸如内存谜题、时间锁定谜题、CPU 绑定谜题等谜题。用户要获得对服务的访问权,必须解决谜题,从而对抗垃圾邮件攻击。

收费方式: 可以对区块链收取额外费用,例如矿池的挖矿费、交易费等。这使得 DoS 黑客攻击对攻击者来说代价高昂,从而降低了此类攻击。 

结论说明

智能合约审计在 羽毛笔审计 寻找编码中的潜在漏洞。 其中一些包括重入漏洞、存储冲突、随机性攻击、拒绝服务等。 

这显然意味着 聪明的合同 经过全面测试,没有拒绝服务攻击威胁。 这可确保您的项目免受 Web3 空间可能存在的漏洞的影响。

请留意我们的 Telegram 频道,以收集有关我们服务的最新见解: https://t.me/quillhash

13 观点

时间戳记:

更多来自 散列