主页 > imtoken钱包app下载 > 币安被盗,说说以太坊空账户的DoS攻击

币安被盗,说说以太坊空账户的DoS攻击

imtoken钱包app下载 2023-02-01 06:00:21

事件回顾 近日,币安被盗事件再次引起大家对数字货币安全的关注。事实上,网络盗窃事件非常普遍,引发了技术

事件回顾 近日,币安被盗事件再次引起大家对数字货币安全的关注。 事实上,网络盗窃事件非常普遍,并引发了技术的不断升级。 作为区块链2.0的代表,以太坊从诞生之日起就饱受各种攻击。 为此,本文将基于对以太坊空账户的DoS攻击,谈谈以太坊如何保障技术安全。

以太坊在 2016 年 9 月和 10 月遭受了一系列 DoS 攻击,攻击者以极低的成本在以太坊网络内创建了 1900 万个空账户。 空账户会浪费硬盘空间,增加同步时间并减慢处理时间,这导致了 2016 年 10 月的“EIP-150 硬分叉”。而且,11 月的“Spurious Dragon”分叉进一步修复了这种攻击的影响。

以太坊经典和以太坊_空以太坊_sitejianshu.com 以太坊以太经典

什么是空账户? 空账户是一个余额为零、常数为零且代码为空的账户(以太坊中的每个账户都有一个常数,等于与该账户关联的交易数量)。 空账户在功能上等同于不存在的账户,唯一的实际区别是空账户需要存储在以太坊状态树中。 空账户很容易生成。 你只需要向一个不存在的账户发送 0 或任何以太坊,不存在的账户将成为一个空账户。 理论上,如果矿工接受零交易费空以太坊,他们甚至可以从空账户或不存在的账户发送交易。

sitejianshu.com 以太坊以太经典_以太坊经典和以太坊_空以太坊

以太坊树上有 1900 万个空账户有什么问题?

空账户存储在以太坊状态树中

· 他们浪费存储空间

· 它们会增加同步时间,尤其是快速同步和扭曲同步。

· 它们减慢了事务处理,因为在 RAM 中存储大部分或所有状态变得更加困难,因此需要更多的磁盘访问。

攻击方式:

攻击者创建了一个父合约,这个智能合约被调用了 4750 次。 父合约方法如下:

(1) 创建分包

0000 推 32 0x6004600c60003960046000f3600035ff0000000000000000000000000000000000

以太坊经典和以太坊_空以太坊_sitejianshu.com 以太坊以太经典

0021 PUSH1 0x00

0023 商城

0024 PUSH1 0x20

0026 PUSH1 0x00

0028 PUSH1 0x00

002a 创建

这会在新地址创建分包合同。

;; 儿童合同(完整)

PUSH1 0x00

呼叫数据加载

自我毁灭

分包合约的代码在PUSH32中,即:

0000 推 32 0x6004600c60003960046000f3600035ff0000000000000000000000000000000000

空以太坊_以太坊经典和以太坊_sitejianshu.com 以太坊以太经典

前12个字节是构造子合约的函数,接下来的4个字节是子合约的代码。

(2) 在存储中加载一个计数器

002b PUSH1 0x00

002d 负载

002e DUP1

这将跟踪正在创建的空账户,并允许后续调用父合同以继续从前一个停止的地方生成空账户。

(3)循环调用子合约的“自毁函数”40次

(以下代码会循环40次)

0030 PUSH1 0x01

0032 添加

0033 DUP1

0034 PUSH1 0x00

0036 商城

空以太坊_以太坊经典和以太坊_sitejianshu.com 以太坊以太经典

0037 PUSH1 0x00

0039 DUP1

003a PUSH1 0x20

003c DUP2

003d DUP1

003e DUP8

003f PUSH1 0x06

0041 呼叫

0042流行音乐

先给计数器加一个,复制一份,复制一份回内存,调用有计数器的子合约作为调用数据。 分包合约将它发送的数据(计数器)解释为一个地址,它在自毁时将其(零)值发送到该地址,从而创建一个空帐户。

selfdestruct(address) “自毁函数”会将合约的余额转移到指定地址address。 “自毁功能”功能拥有少量Gas。 这种设计是为了鼓励人们销毁不再使用的智能合约。 合同的状态从状态存储中消失。 当你不再使用某个合约时,调用“自毁函数”,比调用Transfer将合约中的钱转出更划算。

sitejianshu.com 以太坊以太经典_空以太坊_以太坊经典和以太坊

这里的关键点是,直到当前事务执行结束,分包合约才真正自毁,因此可以在单个事务中多次调用它。 当前事务终止时,子合同将被删除。 每次调用父合约时,都会重新创建子合约,然后可以从内部多次调用它的“自毁函数”,最后销毁。

空以太坊_sitejianshu.com 以太坊以太经典_以太坊经典和以太坊

(4) 检查剩余气体

如果有足够的gas,则返回并重新遍历所有40个调用,并继续增加地址计数器。

0328 气体

0329 PUSH2 0x6000

032c LT

032d PUSH3 0x00002f

第0331章

因此,每次调用父合约都能够创建数千个空账户,具体取决于最初提供的天然气量。

(5)存储计数器,为下次调用做准备

0332 PUSH1 0x00

第0334章

使用“自毁功能”以极低的成本创建帐户。

谁会执行此 DoS 攻击? 网络协议中存在攻击机会,非常普遍,现实世界中没有人会这样做,因为他们没有动机去利用这些攻击漏洞。 可悲的是,我们担心对以太坊的这种攻击。

以太坊经典和以太坊_sitejianshu.com 以太坊以太经典_空以太坊

sitejianshu.com 以太坊以太经典_空以太坊_以太坊经典和以太坊

最危险的群体是“griefers”,他们可能会发起 DoS 攻击来做空 ETH,从而使 ETH 的价格在短期内下跌。 同样,将加密货币视为零和游戏的极端分子也可能参与破坏。 当然,那些想要攻击以太坊矿工的人也可能参与其中。 因为目前这样的攻击是没有成本的,这些团伙很可能会发起攻击。 以太坊的防御措施调整了使用的 Gas 量,使“自毁功能”的成本更高。 以太坊经历了“EIP-150 Hard Fork”硬分叉。 2016年10月18日23:19:31 区块号2463000。除了其他gas量调整外,“自毁功能”调整为5000 Gas(原为0 Gas)。 随后,以太坊做了一个名为“Spurious Dragon”的分叉。 2016年11月23日01:15:44区块2675000,本次分叉的相关变化是EIP 161状态清理,以清理之前建立的空账户。 清空账户的实际操作实际上是在分叉之后进行的,清空账户在被交易“触及”时会自动删除。 以太坊基金会将系统地开始“CALL”这些因攻击而产生的空账户,逐步完成清理工作。

总结:当一笔交易“触及”一个“空账户”时,“空账户”被删除。

·“空账户”:如果一个账户没有代码且常量为0且余额为0,则该账户被认为是空的。 (以太坊中每个账户都有一个常数,等于这个账户相关的交易数)

“touched”:当涉及到“state change”操作时,账户被认为是“touched”。 这包括但不限于转移到 0 以太坊。

· 账户“状态变化”:

o 当它是“自杀”操作或退款地址的目标时。 (“SUICIDE”后来是“selfdestruct”,因为自杀是个沉重的话题,所以才改成self-destruct)

o 当它是“CALL”操作或消息调用的目标或来源时。

o 当它是“CREATE”操作或合约创建操作的目标或来源时。

o 作为矿工,当您是区块奖励或交易费用的接收者时。

· 交易在生成交易收据之前立即执行自杀列表。 所以如果出现空号被触及的情况,空号就会自杀身亡。

事实上,当前的实现只需要跟踪四种情况:

· 一个通过 CALL 传递给它的零价值交易的空账户;

· 一个空账户空以太坊,其中的交易通过 SUICIDE 转移到零价值;

· 一个通过消息调用交易传递给它的值为零的空账户;

· 一个空账户通过零汽油价格费用转移向它转移零价值。 (一般情况下,矿工不会挖Gas Price设置为0的交易,但矿工可以挖到自己发送的0手续费的交易)