主页 > imtoken限制中国用户该咋办 > 以太坊挖坑流程图 阅读报告

以太坊挖坑流程图 阅读报告

TEETHER:盯着以太坊自动使用智能合约

技术介绍

智能合约可以从字面上理解为以代码形式化的合约。 在以太坊中,智能合约以称为 Solidity 的高级 JavaScript 语言定义,并编译成适合以太坊虚拟机 (EVM) 使用的字节码表示形式。 各方可以通过以太坊交易与该合约进行交互。 共识协议保证了 EVM 中合约的正确执行。 然而,智能合约增加的复杂性是以增加风险为代价的——以太坊的图灵完备 Solidity 比比特币中指定的简单检查更容易出错。 更糟糕的是,一旦部署,智能合约就是不可变的,无法修补或更新。 这导致了软件漏洞和经济损失的空前结合。 事实上,自2015年以太坊诞生以来,已经发现了多个智能合约漏洞,造成数千万美元的损失。 随着以太坊变得越来越流行和有价值,智能合约漏洞的影响只会增加。

在 2018 年安全会议上,萨尔州大学的研究人员构建了 TEETHER 工具 [1]。 在对易受攻击的合约进行通用定义后,TEETHER 可以允许仅给定二进制字节码的智能合约的自动漏洞识别和漏洞利用能力。 他们对所有 38,757 个独特的以太坊合约进行了大规模分析,并在其中 815 个中发现了完全自动化的工作漏洞。

他们对合约脆弱性的定义是基于这样的观察,即价值从一个账户(合约)转移到另一个账户只能在少数明确定义的条件下发生。 特别是,他们确定了价值转移中必然涉及的四个关键低级 EVM 指令:一个用于创建常规交易(CALL),一个用于合约终止(SELFDESTRUCT)以太坊挖坑流程图,两个用于代码注入(CALLCODE,DELEGATECALL)。

研究人员提出了一种在合约中查找易受攻击的执行痕迹并使用符号执行自动创建漏洞利用的方法。 具体方法如下,在合约的控制流图中寻找某条关键路径。 具体来说,我们确定了通往关键指令的路径,其中指令的参数可以由攻击者控制。 找到路径后,我们利用符号执行将此路径转换为一组约束。 使用约束求解,我们可以推断出攻击者必须执行的交易才能触发漏洞。

本文的主要贡献是:

1. 提供基于低级 EVM 指令的易受攻击合约的通用定义。

2. 开发了一种工具 TEETHER,它仅从合约的字节码提供端到端的漏洞利用。为此,他们解决了几个 EVM 特定的挑战,例如以符号方式处理哈希的新方法

3. 对从以太坊区块链中提取的 38,757 个独特合约进行大规模漏洞分析。

TEETHER工具流程如下图所示

TEETHER工具流程图

(1) 重构CFG(控制流程图)

TEETHER 使用反向切片迭代重建 CFG。 选择一个未解析的 JUMP 或 JUMPI,并计算其跳跃目标的一组(路径敏感的)后向切片。 如果找到完整的后向切片,则执行计算跳转目标,将新找到的边添加到CFG中,并将相应的跳转指令标记为已解决。 由于新边的引入可能导致在新连接的子树中可能出现新的向后跳转切片,因此该子树中的所有 JUMP 和 JUMPI 指令再次标记为未解析。 重复这个过程,直到没有发现新的边并且所有的跳转指令都被标记为已解决。

这里写图片描述

(2) 按键说明

我们确定了四个关键的 EVM 指令,必须至少执行其中一个指令才能从合约中提取以太币。 这四个指令分为两类:两个指令导致直接传输,两个指令允许在合约上下文中执行任意以太网字节码。 前两个是 CALL 和 SELFDESTRUCT,后两个是 CALLCODE 和 DELEGATECALL 指令。

(3)路径生成

为找到关键路径,TEETHER 使用 A* 探索路径,其中路径成本定义为 CFG 中该路径遍历的分支数。 为了只关注关键路径,在每一步之后,我们检查是否仍然可以从当前路径到达至少一个关键片的所有剩余指令。如果不能完全到达关键片,则放弃对该路径的进一步探索

(4) 生成约束

约束生成模块与路径生成同步运行。 一旦找到路径,路径约束生成模块就尝试象征性地执行路径以收集一组路径约束。

(5) 路径拼接

将n条状态变化路径与关键路径的采集路径约束C结合,进行采集、存储、读取R、写入W,得到下一条变化路径。具体如下

这里写图片描述

(六)钻空子

如果找到具有可满足组合路径约束的路径序列,则该模块会输出导致智能合约利用的交易列表。

为了证明所提出方法的实用性,研究人员最终对从区块链中提取的 38,757 份独特合约进行了大规模分析。 TEETHER 发现了 815 个 (2.10%) 漏洞——完全自动化,无需人工干预或手动验证,也无需合约源代码。 由于代码共享,这使至少 1,731 个账户的资金面临风险。 此外,案例研究表明,许多潜在的漏洞是由 Solidity 的设计选择和对 EVM 执行模型的误解造成的。

技术亮点

本文提出了漏洞的一般定义,可以被更弱的攻击者利用,而不仅限于恶意矿工。 有些工具只能检测漏洞。 该工具不仅可以检测漏洞,还可以自动利用它们。

技术限制

TEETHER目前只专注于检查合约漏洞,但实际上合约可能会调用其他合约产生漏洞。

在搜索漏洞时,我们的评估将合约的存储初始化为空状态。 这使他们能够将分析与共享相同代码的合约结合起来,并将工具运行次数从 784,344 次减少到 38,757 次。 然而,这是以结果不精确为代价的。

本文漏洞研究仅在本地测试平台,部分漏洞在真实的以太坊区块链中不存在。

TEETHER 成功地使用这些合约生成了 1,564 个针对以太坊账户的有效漏洞利用,证明应该认真对待智能合约的安全性,特别是因为这些漏洞利用是完全匿名且无关紧要的——它们只需要一个以太坊账户。 TEETHER 在损失发生之前检测、了解并防止漏洞利用。 这将有效保护智能合约的安全。

技术展望

TEETHER 成功地使用这些合约生成了 1,564 个针对以太坊账户的有效漏洞利用,证明应该认真对待智能合约的安全性,特别是因为这些漏洞利用是完全匿名且无关紧要的——它们只需要一个以太坊账户。 TEETHER 在损失发生之前检测、了解并防止漏洞利用。 这将有效保护智能合约的安全。

参考

[1]Krupp J, Rossow C. teEther:蚕食以太坊以自动利用智能合约[C]//第 27 届 {USENIX} 安全研讨会({USENIX} 安全 18)。 USENIX} 协会},2018 年:1317-1333。

九头蛇内部:迈向有原则的错误赏金和防漏技术智能合约

技术介绍

错误赏金是帮助防止软件攻击的流行工具。 然而,他们缺乏设置赏金金额的严格原则,需要高额支出才能吸引经济上理性的黑客。 黑客经常出售或利用它们,而不是为严重的错误索取赏金。 因此,适度的赏金可能无法激励理性行为者披露信息。 由于缺乏提供原则性指导的研究,适当定价激励措施也可能很困难。付款通常根据错误类别任意安排,可能无法反映市场价值或错误影响

来自 Cornell Tech 和 Stanford 的研究人员提出了 Hydra 框架 [1],这是第一个通用的、有原则的方法来建模和管理激励漏洞披露的漏洞赏金。 他们的主要思想是利用差距(exploit gap),可以衡量运行时间和奖励严重错误。 Hydra 框架通过 N-of-N 版本编程来转换程序,这是运行多个独立程序实例的经典 N 版本编程的变体。 我们将 Hydra 框架应用于智能合约,即在区块链上执行的小程序。 研究人员展示了 Hydra 如何极大地放大奖励的力量以激励漏洞披露,并建立第一个对智能合约安全性进行严格经济评估的框架。 该模型考虑的对手足够强大,可以利用区块链中的竞争条件抢在诚实用户之前获得赏金。 因此,研究人员提出了潜艇承诺(Submarine Commitments),这是一种隐藏区块链交易的独立利益对策,可以防止诚实漏洞发现者的赏金和漏洞利用被攻击者篡夺。 Hydra 框架经测试兼容 2100 万笔交易中的 61%,或 35 万个独特智能合约中的 76%,并通过了其支持的合约的所有测试。

这里写图片描述

Hydra框架就如上图一样简单,研究人员在以太坊生态中使用三种不同的编程语言独立生成了三种通用的合约规范。 Hydra Framework 会自动检测这些合约“标头”,以便它们与常见的 Hydra 元合约进行交互。 元合约充当总代理,将传入的交易依次委托给每个领导者,并在领导者的输出 Y 发散时支付奖金。

这里写图片描述

研究人员提出了利用间隙的概念,其定义如上,f∗f∗是一个抽象的理想程序,它定义了合成的预期行为。 gapgap越大,漏洞的独立性越大,即只影响一个,而不影响f∗f∗的概率,就越难找到f∗f∗的漏洞。 当gaggap>1时,如果可以修改漏洞,可以降低f∗f∗的漏洞。 λHλH是诚实人员发现bug的速度,λMλM是攻击者发现bug的速度。 f∗f∗ bug 被发现的速度被修正为 λM∗(gap)−1λM∗(gap)−1,所以诚实的人员首先发现 bug 的概率是

这里写图片描述

设α=λHλMα=λHλM,则可得下式:

这里写图片描述

由此,得出漏洞赏金的计算公式。

此外,为了防止诚实方发现的漏洞被恶意者利用,本文还提出了潜艇策略,旨在使诚实方能够在恶意方之前申请发现漏洞。 关键是审核员对奖金地址进行了加密,只将密钥发送给诚实方,让恶意方无法获取地址。

技术亮点

通过合理分析计算应支付的漏洞赏金,在增加经济效益的同时,也降低了漏洞被恶意利用的可能性。

面对文中设定的强大的恶意对手,潜艇策略可以有效保护善意发现漏洞的一方的赏金。

技术限制

本文使用用 Haskell 编写的 Hydra head 指令集应用简单的操作码重写规则。 但是研究人员还没有为不太常见的 CREATE 和 SELFDESTRUCT 操作码实现回调。 本研究尚不支持修改标头代码的操作码(例如, DELEGATECALL )。 代码委托通常与多版本编程哲学不一致:如果所有委托人都调用相同的库契约,独立性就会丧失,并且库错误可能会产生漏洞利用。

技术展望

本文提出的Hydra框架可以兼容绝大部分智能合约并成功运行,因此在提升合约安全性方面具有巨大潜力。 而文中漏洞检测后的tail-call优化,可以很好的降低交易成本。

参考

[1]Breidenbach L、Cornell Tech IC、Daian P 等。 进入 Hydra:迈向有原则的漏洞赏金和防利用智能合约[C]//第 27 届 {USENIX} 安全研讨会({USENIX} 安全 18)。 USENIX } 协会,2018 年。

Arbitrum:可扩展的私人智能合约

技术介绍

数字货币与智能合约的结合是一个自然的过程。 加密货币允许各方直接转移数字货币,依靠分布式协议、加密和激励措施来执行基本规则。 智能合约允许各方创建虚拟的可信第三方,这些第三方将根据任意商定的规则行事,从而允许创建复杂的多方协议,且交易对手风险极低。 通过在加密货币之上运行智能合约,可以在合约中编码货币条件和惩罚,这将由底层共识机制强制执行。 以太坊是第一个支持图灵完备状态智能合约的加密货币,但它受到可扩展性和隐私性的限制。 以太坊要求每个矿工模仿每个合约执行的每个步骤,这是昂贵的并且严重限制了可扩展性。 它还要求每个合约的代码和数据都是公开的,缺乏某种类型的隐私覆盖。

普林斯顿大学的研究人员提出了一种名为 Arbitrum 的支持智能合约的加密货币系统,它不会受到以太坊等先前系统的可扩展性和隐私限制的影响 [1]。 与以太坊一样,Arbitrum 允许各方通过使用代码指定实现合约功能的虚拟机 (VM) 的行为来创建智能合约。 Arbitrum 使用机制设计来激励各方就 VM 将做什么进行链下协商,这样 Arbitrum 矿工只需验证数字签名即可确认各方已就 VM 将做什么达成一致。 如果双方无法达成协议,Arbitrum 仍然允许诚实的各方在链上推进 VM 状态。 如果一方试图欺骗虚拟机的行为,验证者(或矿工)将通过使用利用 Arbitrum 虚拟机架构功能的高效挑战协议来识别和惩罚不诚实的一方。 以这种方式将 VM 行为的验证移到链下可以显着提高可扩展性和隐私性。 该协议的架构旨在尽可能快速和简单地解决争议。 Arbitrum 显着降低了智能合约的成本。 如果参与者根据他们的动机行事,验证者将永远不必模拟或验证任何 VM 的行为。 在这种情况下,验证者的唯一职责是制作简单的记录来跟踪每个 VM 的货币持有量、消息收件箱的哈希值和单独的哈希状态值。

这里写图片描述

Arbitrum 通过双边协议处理有争议的断言,如上图所示的虚拟机状态。 当一位经理提出有争议的断言而另一位经理对该断言提出质疑时,两位经理都支付了保证金。 在二分协议的每一步,断言者将断言分成两个断言,每个断言涉及 VM 计算步骤的一半,挑战者选择挑战哪一半。 他们继续这种双方协议,直到关于单个步骤(即 VM 执行指令)的断言受到挑战,此时断言者必须提供验证者可以检查的一个步骤的证据。 如果提供了正确的证明,断言者获胜; 否则挑战者获胜。 赢家得到他们的押金,输家也得到一半的押金。 失败者押金的另一半交给验证者。 双方协议通过断言者和挑战者的一系列区块链交易来执行。 在协议的每一点,一方有一个有限的时间间隔来进行下一步行动,如果他们未能在截止日期前做出有效的行动,则该方输了。

这里写图片描述

上图是单步证明的例子。 如果验证者需要验证添加命令的结果是否正确,则需要从指令栈中获取预期的命令,并从数据栈中获取数据的哈希值(出于隐私原因,验证者只能获取哈希值数据值的值)来验证接收到的数据散列。

但是,VM 使用的频率取决于 VM 管理器和 VM 本身之间的通信。 在我们之前对 Arbitrum 协议的描述中,这种通信必须被链接起来,因此受到共识机制速度的限制。 为了提高其可扩展性,Arbitrum 与状态通道和侧链技术兼容,并且有多种结构允许管理员与 VM 通信并持续推进 VM 的链下状态。

技术亮点

本文的加密货币体系有效提高了可扩展性和隐私性,大大降低了智能合约的成本。 如果参与者遵循系统,验证者将永远不必模拟或验证任何 VM 的行为。 在这种情况下,验证者的唯一职责是制作简单的记录来跟踪每个 VM 的货币持有量、消息收件箱的哈希值和单独的哈希状态值。

与所有以太坊合约代码都是公开的以太坊不同,这对于模型来说是必需的,因为每个矿工都需要能够模拟所有代码。 所以对于以太坊式的智能合约,代码是不能修改的。 然而,在 Arbitrum 中,只要 VM 的所有诚实管理者都同意,就可以修改合同 VM。

Arbitrum 还使用定制设计的虚拟机架构来降低链上争议解决的成本。 主要是将虚拟机行为的执行转移到链下,降低链上解析的成本,让Arbitrum在可扩展性和隐私性方面具有优势。

由于二分协议采用递归处理,直到单步到达争议断言,大大提高了处理争议断言的效率。 经测量,在机器上运行的验证器节点每秒能够处理超过 5,000 个有争议的断言。 这使可能的网络吞吐量达到每秒超​​过 40 亿个事务,而以太网为 1600 个。

技术限制

恶意的、资金雄厚的管理者可以通过不断挑战关于其行为的所有断言来无限期地停止虚拟机。 攻击者将损失至少一半的押金以太坊挖坑流程图,而每一次这样的损失只会延迟 VM 的进度,时间仅为运行二分协议一次所需的时间。

技术展望

本文介绍了 Arbitrum,一个新的智能合约平台,比以前的解决方案具有更好的可扩展性和隐私性,并且可以通过任何现有机制实现区块链共识。 这种减少用户隐私泄露的高速处理方式,未来可以用来解决纠纷。

参考

[1]Kalodner H、Goldfeder S、Chen X 等。 Arbitrum:可扩展的私有智能合约[C]//第 27 届 {USENIX} 安全研讨会({USENIX} 安全 18)。 USENIX} 协会},2018 年:1353-1370。

Erays:以太坊不透明智能合约技术逆向工程简介

与以太坊智能合约交互可能会产生潜在的破坏性财务后果。 因此,智能合约引起了多个监管机构的注意,包括美国联邦贸易委员会和美国证券交易委员会。 这些监管机构有意审计这些合同,以防止意外的财务后果。 不幸的是,在没有现成源代码的情况下审计智能合约可能具有挑战性,而且目前很少有工具可用于此过程。 此类合同对审计师来说仍然是不透明的。 为了更好地理解不透明的智能合约,伊利诺伊大学的研究人员提出了 Erays,一种用于智能合约的逆向工程工具 [1]。 Erays 从以太坊区块链中获取智能合约并生成适合手动分析的高级伪代码,使用 Erays 将没有先前可用源代码的合约链接到公共源代码,从而降低生态系统中的整体不透明性。

在 34K 份独特合约中,研究人员能够成功匹配 7.7K (22.7%) 份合约,即 77.3% 的独特合约是不透明的。 ,如下图所示,与透明合约相比,不透明合约的交易量为12.7M,交易量为27.6M。 此外,不透明合约仅持有 31 亿美元,而透明合约持有 73 亿美元。 虽然生态系统中的透明度似乎无处不在,但事实仍然是审计人员和监管机构无法看到 1270 万笔交易和总计 3.1B 美元的合同。

这里写图片描述

Erays 将编译后的以太坊虚拟机 (EVM) 智能合约作为输入,不修改区块链,并返回适合手动分析的高级伪代码。 为了方便最终用户的输出可读性,研究人员将 EVM 从基于堆栈的语言转换为基于寄存器的机器,我们构建了一种“模糊哈希”机制,可以比较两个智能合约并确定函数是否具有相似性另一个合约中函数的句法结构。 使用这种技术,我们能够映射每个不透明合约的中位数 50% 的功能和 14.7% 的指令,从而立即部分了解生态系统中的不透明合约。

Erays主要分为以下几个阶段:

(1) 反汇编和基本块识别

研究人员将十六进制字符串反汇编成 EVM 指令,然后将这些指令划分为基本块。 基本块是具有单个入口点和单个出口点的线性代码序列。 改变控制流的指令(即退出或分支)标记块退出,而特殊指令 JUMPDEST 标记块入口。 举例如下:

这里写图片描述

(2) 控制流程图的还原

在此阶段,我们从基本块中恢复控制流图 (CFG)。 CFG 是一个有向图,其中每个节点代表一个基本块,每条边代表两个块之间的分支。 在有向边 b0->b1 上,我们称 b1 为 b0 的后继。 从核心的角度来看,从基本块恢复 CFG 需要识别每个基本块的后继者。 为了确定基本块 b 的后继,我们需要检查块中的最后一条指令。 如果指令没有改变,则继续流向下一个块; 如果指令是停止执行,它会被终止; 如果指令是分支指令,则根据目标地址跳转。

(3)升级

在此阶段,我们将基于 EVM 堆栈的指令提升为基于寄存器的指令。 基于寄存器的指令保留了 EVM 规范中定义的大部分操作。 此外,还引入了一些新操作,使表示更加简洁易懂: INTCALL、INTRET:这两条指令分别调用和返回内部函数。

(4)优化

在优化阶段,我们对我们的中间表示应用了几个编译器优化。 本文主要利用数据流优化,包括常量折叠、常量传播、复制传播和死代码消除。

(5) 聚合

聚合旨在进一步简化中间体的生产。 与指令不同,表达式可以任意嵌套,更像是一种高级语言。 举例如下:

这里写图片描述

(6) 控制流结构恢复

研究采用结构分析算法来恢复高级控制结构(控制流结构恢复)。 “while”和“if then else”等结构通过模式匹配和折叠 CFG 恢复。

(7) 验证

Erays 将合约转换为更具可读性的表达式。 为了利用表达式进行进一步分析,必须首先验证它们是否正确。 通过测试评估正确性。 给定一个特定的合约输入,执行并检查它是否产生正确的输出。 操作的语义在虚拟机中实现。 比如在做s3 = s3 = s2 + s3的时候,我们会加载s3,我们会加载s2和s3中的值,相加,对2256(字长)取模并将结果放入s3的值中,相加向上,模 2256(字长)并将结果放入 s3。 如果我们的机器在这些操作期间遇到异常,我们将其标记为失败。 我们利用区块链上的历史交易来构建一组测试。 我们的测试集中收集了大约 15,855 笔交易和相应的合约。 如果 Erays 未能首先生成表示,我们将其标记为“构建失败”。 如果我们的表示不正确,我们将其标记为“验证失败”。 研究人员一共失败了 510 个(3.22%)测试集,其中 196 个是“构造失败”,314 个是“验证失败”。

2. 技术亮点

与已知唯一从 EVM 字节码生成 Solidity 的反编译器 Porosit 相比,研究人员在 34K 独特合约上运行 Porosity,以评估其与 Erays 相比的性能。 Porosit 只为 1,818 (5.3%) 个独特合约生成了高级源代码而没有错误。 相比之下,Erays 为 33,542 (97.7%) 份合约正确生成了高级源代码。

3. 技术限制

Erays 不是生成可重新编译的 Solidity 代码的完整反编译器。 它的主要限制是输出的可读性。 当仅存在常见类型(uint 数组、地址)时,输出相对简单,但 Erays 无法简洁地捕获复杂类型的操作,例如映射(uint => string)。

四、技术展望

本文发现不透明性是意料之中的,有时对于这些合同的正常运作很重要。 有鉴于此,研究人员建议智能合约开发人员可能希望通过隐瞒其高级代码来实现“隐蔽性”和安全性。 此外,Erays 可以帮助审计人员降低需要审查的智能合约的不透明度,在保护加密货币社区的安全方面具有巨大潜力。

参考

[1]Zhou Y、Kumar D、Bakshi S 等。 Erays:逆向工程以太坊的不透明智能合约[C]//第 27 届 USENIX 安全研讨会论文集(USENIX Security'18)。 2018, 1.