智能合约攻击和漏洞百科全书 Attacks----Block stuffing

        在某些情况下,即使你不循环一个未指定长度的数组,你的合约也可能受到区块gas限制的攻击。攻击者可以通过使用足够高的gas价格来填充交易之前的几个区块。

        这种攻击是通过以非常高的 gas 价格发出几笔交易来完成的。 如果 gas 价格足够高并且交易消耗了足够的 gas,它们可以填满整个区块并阻止其他交易被处理。

        以太坊交易要求发送者支付 gas 以阻止垃圾邮件攻击,但在某些情况下,可能有足够的激励来完成此类攻击。

        例如,在赌博 Dapp Fomo3D 上使用了块填充攻击。 该应用程序有一个倒计时计时器,用户可以通过成为最后一个购买钥匙来赢得大奖——除了每次用户购买钥匙时,计时器都会延长。 攻击者买了一把钥匙,然后连续填充接下来的 13 个块,这样他们就可以赢得大奖。

下面对Fomo3D 和块填充攻击做出较为详细的解释:

        Fomo3D 是一个赌博游戏,其中参与者可以购买钥匙来参与竞拍,并有机会赢得大奖。游戏规则是,每当有人购买钥匙时,倒计时计时器会重置,并且游戏结束时间会相应延长。最后购买钥匙的人将赢得累积的奖金。

        在这个情况下,攻击者采取了一种被称为块填充攻击的策略。攻击者首先购买了一个钥匙,然后连续填充接下来的 13 个区块,即在这些区块中创建大量无意义的交易或者执行计算密集型操作,消耗大量的 gas。由于以太坊区块链中每个区块都有一个 gas limit,攻击者填充了这些区块,使得后续的正常交易无法打包进这些区块。

        这样一来,攻击者控制了接下来的 13 个区块,导致倒计时计时器一直保持在较低的值,并且其他参与者无法购买钥匙来延长计时器。最终,当计时器结束时,攻击者成为最后购买钥匙的人,赢得了累积的奖金。

        这个案例说明了一种利用以太坊交易机制和区块 gas 限制的漏洞进行攻击的情况。攻击者通过填充区块来阻止其他参与者进行交易,从而掌控了游戏的结果,并以不公平的方式获得奖金。

        为防止发生此类攻击,请务必仔细考虑将基于时间的操作合并到您的应用程序中是否安全。

        基于时间的操作通常依赖于区块链中的区块产生时间和交易确认时间。在以太坊或其他区块链上,区块产生的时间是不确定的,并且交易的确认时间也可能会受到各种因素的影响。因此,在应用程序中使用基于时间的操作可能会存在风险,容易受到攻击者的操纵或利用。

        具体到上述的案例中,Fomo3D 游戏的倒计时计时器是基于时间的操作。攻击者通过填充区块,人为地控制了区块产生的时间,从而操纵了倒计时计时器,使其一直保持在较低的值。这种情况下,基于时间的操作就不再安全,因为攻击者可以通过控制区块的产生时间来获得不公平的优势。

        为了防止这种攻击,开发者需要仔细考虑并采取相应的安全措施。这可能包括使用区块链上的可验证随机数(Verifiable Randomness)来引入随机性,或者设计更复杂的游戏规则来减少对时间的依赖。同时,开发者还应该考虑其他安全性方面,例如合约审计、限制交易的 gas 使用等,以确保应用程序的安全性和公平性。

        使用随机数是一种常见的方法来增加基于时间的操作的不确定性,从而防止块填充攻击。下面是一个详细说明使用随机数的解决方案方法:

  1. 引入可验证的随机数生成机制:在智能合约中引入一个可验证的随机数生成机制,以确保随机数的生成过程是公平且不可预测的。这可以通过使用密码学安全的随机数生成算法和区块链上的可验证随机数协议来实现。

  2. 提前生成随机数:在基于时间的操作开始之前,提前生成一个随机数,并将其存储在智能合约中。这个随机数可以作为操作的种子值,用于后续计算或决策过程。

  3. 引入随机数验证机制:在进行基于时间的操作时,验证预先生成的随机数的有效性。这可以通过在智能合约中实现一个验证函数,用于验证当前区块的随机数与预先生成的随机数是否匹配。如果匹配成功,说明随机数是合法的,并且操作可以继续进行。

  4. 考虑重置机制:如果验证发现随机数不匹配或者存在异常情况,可以考虑引入一种重置机制来处理。例如,当发现随机数异常时,可以中止当前操作并触发重新生成随机数的流程,确保操作的公平性和安全性。

        通过使用可验证的随机数生成机制,预先生成随机数,并在操作过程中验证随机数的有效性,可以增加块填充攻击的复杂性,使攻击者无法准确预测或操纵操作的结果。这种方法增加了不确定性,使攻击者无法简单地通过控制区块时间来获得优势,从而提高了应用程序的安全性。

总的来说,当涉及基于时间的操作时,可以考虑以下解决方案来防止块填充攻击:

        使用随机数:引入可验证的随机数生成机制,以确保计时器或其他基于时间的操作不仅仅依赖于区块的产生时间。这样可以增加不确定性,使攻击者无法准确控制操作的结果。

        使用区块高度:代替直接使用区块产生时间,可以考虑基于区块高度来触发或执行操作。区块高度是一个递增的数值,不受攻击者控制,因此可以提供更可靠的时间标记。

        限制交易的 gas 使用:在智能合约中设定适当的 gas 限制,以防止恶意用户填充区块以达到阻塞其他交易的目的。通过限制单个交易的 gas 使用量,可以确保区块中还有足够的剩余 gas 来容纳其他正常的交易。

        设计复杂的游戏规则:减少对时间的依赖,通过设计更复杂的游戏规则来使攻击者无法简单地通过控制区块时间来获得优势。可以引入其他因素,例如其他用户的参与或条件限制,来增加游戏的公平性和难度。

        审计合约代码:对于涉及资金或重要逻辑的智能合约,进行安全审计是至关重要的。通过由专业的合约审计人员对代码进行审查,可以发现潜在的安全漏洞和攻击风险,并提供修复建议。

原文详见:The Encyclopedia of Smart Contract Attacks and Vulnerabilities | by Kaden Zipfel | Better Programming

猜你喜欢

转载自blog.csdn.net/ljh1528207303/article/details/130880471