主页 > imtoken钱包app下载 > 币安被盗,说说以太坊空账户的DoS攻击
币安被盗,说说以太坊空账户的DoS攻击
事件回顾 近日,币安被盗事件再次引起大家对数字货币安全的关注。事实上,网络盗窃事件非常普遍,引发了技术
事件回顾 近日,币安被盗事件再次引起大家对数字货币安全的关注。 事实上,网络盗窃事件非常普遍,并引发了技术的不断升级。 作为区块链2.0的代表,以太坊从诞生之日起就饱受各种攻击。 为此,本文将基于对以太坊空账户的DoS攻击,谈谈以太坊如何保障技术安全。
以太坊在 2016 年 9 月和 10 月遭受了一系列 DoS 攻击,攻击者以极低的成本在以太坊网络内创建了 1900 万个空账户。 空账户会浪费硬盘空间,增加同步时间并减慢处理时间,这导致了 2016 年 10 月的“EIP-150 硬分叉”。而且,11 月的“Spurious Dragon”分叉进一步修复了这种攻击的影响。
什么是空账户? 空账户是一个余额为零、常数为零且代码为空的账户(以太坊中的每个账户都有一个常数,等于与该账户关联的交易数量)。 空账户在功能上等同于不存在的账户,唯一的实际区别是空账户需要存储在以太坊状态树中。 空账户很容易生成。 你只需要向一个不存在的账户发送 0 或任何以太坊,不存在的账户将成为一个空账户。 理论上,如果矿工接受零交易费空以太坊,他们甚至可以从空账户或不存在的账户发送交易。
以太坊树上有 1900 万个空账户有什么问题?
空账户存储在以太坊状态树中
· 他们浪费存储空间
· 它们会增加同步时间,尤其是快速同步和扭曲同步。
· 它们减慢了事务处理,因为在 RAM 中存储大部分或所有状态变得更加困难,因此需要更多的磁盘访问。
攻击方式:
攻击者创建了一个父合约,这个智能合约被调用了 4750 次。 父合约方法如下:
(1) 创建分包
0000 推 32 0x6004600c60003960046000f3600035ff0000000000000000000000000000000000
0021 PUSH1 0x00
0023 商城
0024 PUSH1 0x20
0026 PUSH1 0x00
0028 PUSH1 0x00
002a 创建
这会在新地址创建分包合同。
;; 儿童合同(完整)
PUSH1 0x00
呼叫数据加载
自我毁灭
分包合约的代码在PUSH32中,即:
0000 推 32 0x6004600c60003960046000f3600035ff0000000000000000000000000000000000
前12个字节是构造子合约的函数,接下来的4个字节是子合约的代码。
(2) 在存储中加载一个计数器
002b PUSH1 0x00
002d 负载
002e DUP1
这将跟踪正在创建的空账户,并允许后续调用父合同以继续从前一个停止的地方生成空账户。
(3)循环调用子合约的“自毁函数”40次
(以下代码会循环40次)
0030 PUSH1 0x01
0032 添加
0033 DUP1
0034 PUSH1 0x00
0036 商城
0037 PUSH1 0x00
0039 DUP1
003a PUSH1 0x20
003c DUP2
003d DUP1
003e DUP8
003f PUSH1 0x06
0041 呼叫
0042流行音乐
先给计数器加一个,复制一份,复制一份回内存,调用有计数器的子合约作为调用数据。 分包合约将它发送的数据(计数器)解释为一个地址,它在自毁时将其(零)值发送到该地址,从而创建一个空帐户。
selfdestruct(address) “自毁函数”会将合约的余额转移到指定地址address。 “自毁功能”功能拥有少量Gas。 这种设计是为了鼓励人们销毁不再使用的智能合约。 合同的状态从状态存储中消失。 当你不再使用某个合约时,调用“自毁函数”,比调用Transfer将合约中的钱转出更划算。
这里的关键点是,直到当前事务执行结束,分包合约才真正自毁,因此可以在单个事务中多次调用它。 当前事务终止时,子合同将被删除。 每次调用父合约时,都会重新创建子合约,然后可以从内部多次调用它的“自毁函数”,最后销毁。
(4) 检查剩余气体
如果有足够的gas,则返回并重新遍历所有40个调用,并继续增加地址计数器。
0328 气体
0329 PUSH2 0x6000
032c LT
032d PUSH3 0x00002f
第0331章
因此,每次调用父合约都能够创建数千个空账户,具体取决于最初提供的天然气量。
(5)存储计数器,为下次调用做准备
0332 PUSH1 0x00
第0334章
使用“自毁功能”以极低的成本创建帐户。
谁会执行此 DoS 攻击? 网络协议中存在攻击机会,非常普遍,现实世界中没有人会这样做,因为他们没有动机去利用这些攻击漏洞。 可悲的是,我们担心对以太坊的这种攻击。
最危险的群体是“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手续费的交易)