阅读报告

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

  1. 技术简介
        智能合约在字面上可以看作是在代码中形式化的合同。在以太坊中,智能合约是由一种名为Solidity的高级JavaScript语言中定义,并编译成适合以太坊虚拟机(EVM)消费的字节码表示。缔约方可以通过以太坊的交易与本合同互动。共识协议保证了EVM中正确的合同执行。然而,智能合约所增加的复杂性是以增加风险为代价的 ——以太坊的Turing-complete Solidity比比特币中指定的简单检查更容易出错。 更糟糕的是,一旦部署,智能合约就是不可变的,无法修补或更新。 这导致了无与伦比的软件漏洞和财务损失的耦合。 事实上,自2015年以太坊诞生以来,已经发现了几起智能合约漏洞,导致数千万美元的损失。 随着以太坊变得越来越受欢迎和有价值,智能合约漏洞的影响只会增加。
        在security 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合并,得到下一变化路径。具体如下
    这里写图片描述
    (6) 利用漏洞
        如果找到具有可满足的组合路径约束的路径序列,则该模块将输出导致智能合约利用的事务列表。
        为了证明文中的方法的实用性,研究人员最终对从区块链中提取的38,757个独特合同进行了大规模分析。 TEETHER发现815(2.10%)的漏洞 - 完全自动化,无需人工干预或手动验证,也不需要合同源代码。 由于代码共享,这使得至少1,731个账户的资金面临风险。 此外,一个案例研究表明,许多潜在的漏洞是由Solidity的设计选择和对EVM执行模型的误解造成的。

  2. 技术亮点
         本文提出了一个通用漏洞定义,可以被一个弱的多的攻击者利用,不局限于恶意矿工。有的工具只能检测漏洞,该工具不仅能检测漏洞,还能自动的利用漏洞。

  3. 技术局限性
        TEETHER目前只侧重于在检查合约内的漏洞,但事实上,合约可能会调用其他合约产生漏洞。
        搜索漏洞时,文中的评估会将合同的存储初始化为空状态。这使他们能够结合共享相同代码的合约进行分析,并将工具运行次数从784,344减少到38,757次。但是,这是以不精确的结果为代价的。
        文中的漏洞研究只是在本地测试平台中,有些漏洞在真实的以太坊区块链中不存在。
        TEETHER成功地对使用这些合同的以太坊账户产生了1,564个工作漏洞,这证明了应该认真对待智能合约的安全性,特别是因为这些漏洞完全是匿名的而且无关紧要 - 他们只需要一个以太坊账户。TEETHER可以在遭受损失之前发现,理解和预防漏洞利用。这将有效的保护智能合约的安全性。

  4. 技术展望
        TEETHER成功地对使用这些合同的以太坊账户产生了1,564个工作漏洞,这证明了应该认真对待智能合约的安全性,特别是因为这些漏洞完全是匿名的而且无关紧要 - 他们只需要一个以太坊账户。TEETHER可以在遭受损失之前发现,理解和预防漏洞利用。这将有效的保护智能合约的安全性。


参考文献
[1]Krupp J, Rossow C. teEther: Gnawing at Ethereum to Automatically Exploit Smart Contracts[C]//27th {USENIX} Security Symposium ({USENIX} Security 18). USENIX} Association}, 2018: 1317-1333.

 
 
 
 
 
 
 
 
 
 

走进九头蛇:走向原则性的Bug赏金和防漏技术智能合约

  1. 技术简介
        Bug赏金是帮助防止软件攻击的流行工具。然而,他们缺乏严格的原则来设定赏金金额并要求高额支付以吸引经济上理性的黑客。黑客经常出售或利用它们,而不是要求获得严重错误的赏金。因此,适度的赏金可能无法成功激励理性行为者的披露。由于缺乏提供原则性指导的研究,适当的定价奖励也可能很难。付款通常是根据错误类别任意安排的,可能无法反映错误的市场价值或影响
        来自Cornell Tech和Stanford的研究人员提出了Hydra框架[1],这是第一个通用的,有原则的方法来建模和管理激励漏洞披露的bug赏金。他们的主要想法是利用差距(exploit gap),它可以对运行时间进行检测,并对关键错误进行奖励。Hydra框架通过N-of-N版本编程来转换程序,这是一种运行多个独立程序实例的经典N版本编程的变体。我们将Hydra框架应用于智能合约,即在区块链上执行的小型程序。研究人员展示了Hydra如何大大放大奖励的力量来激励漏洞披露,并建立了智能合约安全的严格经济评估的第一个框架。该模型考虑的对手是强力的,可以利用区块链中的竞争条件在诚实用户之前获得赏金。因此研究者又提出了潜艇 承诺(Submarine Commitments),这是一种隐藏区块链交易的独立利益对策,可以避免诚信漏洞发现者的赏金和发现的漏洞被攻击方篡夺。经过测试,Hydra框架与21M交易中的61%,或350K独特智能合约的76%与兼容,并且通过了它支持的合同的所有测试。
    这里写图片描述
        Hydra框架简单如上,研究人员使用以太坊生态系统中的三种不同编程语言独立生成三种常见合同规范。 Hydra Framework自动检测这些合同“头部”,以便它们与常见的Hydra元合同相互作用。 元合同充当通用代理,依次将传入的交易委托给每个负责人,并在负责人输出的Y产生分歧时支付奖金。
    这里写图片描述
        研究人员提出了利用差距这个概念,其定义如上, f f ∗ 为一个抽象的理想程序,定义综合 的预期行为。 gap g a p 越大,说明漏洞的独立性越大,即仅影响一个 的概率,而不是影响 f f ∗ f f ∗ 的漏洞也越难发现。 gap g a p >1时,若能修改 的漏洞,就能减少 f f ∗ 的漏洞。 λH λ H 为诚信人员发现bug的速度, λM λ M 为攻击人员发现bug的速度,其发现 f f ∗ 的bug的速度修正为 λM(gap)1 λ M ∗ ( g a p ) − 1 ,所以诚信人员先发现的概率为
    这里写图片描述
        令 α=λHλM α = λ H λ M ,则可以得到如下式子:
    这里写图片描述
        由此得到了bug赏金的计算公式。
        除此之外,为了防止诚信方发现的漏洞被恶意人员利用,本文还提出了潜艇策略,旨在使诚信方能够在恶意方之前申请发现bug。其关键是审核方将奖金的地址进行加密,并仅将密钥发送给诚信方,使恶意方无法得到地址。

  2. 技术亮点
        通过合理的分析计算应该支付的bug赏金,使经济效益增长的同时也降低了bug被用来恶意利用的可能性。
        在文中设定的强劲恶意对手面前,能通过潜艇策略,有效的保护诚信发现漏洞方的赏金。

  3. 技术局限性
        本文用Haskell编写的Hydra head指令器应用简单的操作码重写规则。但研究人员还没有为不常见的CREATE和SELFDESTRUCT操作码实现回调。本研究还不支持修改头部代码的操作码(例如,DELEGATECALL)。代码委托通常与多版本编程理念不一致:如果所有负责人都调用相同的库合同,会丧失独立性,则库错误可能会产生漏洞利用。

  4. 技术展望
        文中提出的Hydra框架能与大部分智能合约兼容并成功运行,所以在提升合约的安全性方面有很大的潜力。并且文章中漏洞检测后的在发现漏洞后的尾调 优化(Tail-call optimization)能够很好的降低交易费用。


参考文献
[1]Breidenbach L, Cornell Tech I C, Daian P, et al. Enter the Hydra: Towards Principled Bug Bounties and Exploit-Resistant Smart Contracts[C]//27th {USENIX} Security Symposium ({USENIX} Security 18). USENIX} Association, 2018.

 
 
 
 
 
 
 
 
 

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

  1. 技术简介
        数字货币和智能合约的结合是一种自然的过程。加密货币允许各方直接转移数字货币,依靠分布式协议,加密和激励来强制执行基本规则。智能合约允许各方创建虚拟可信第三方,这些第三方将根据任意商定的规则行事,从而允许创建具有极低交易对手风险的复杂多路协议。通过在加密货币之上运行智能合约,可以对合约中的货币条件和罚款进行编码,这些将由潜在的共识机制强制执行。以太坊是第一个支持图灵完备状态智能合约的加密货币,但它受到可扩展性和隐私的限制。以太坊要求每个矿工模仿每个合同的每一步执行,这是昂贵的,严重限制了可扩展性。它还要求每个合同的代码和数据都是公开的,缺少某种类型的隐私覆盖功能。
         来自普林斯顿的研究人员提出了一种名叫Arbitrum的支持智能合约的加密货币系统,它不受先前系统(如以太坊)的可扩展性和隐私限制[1]。与以太坊一样,Arbitrum允许各方通过使用代码来指定实现合同功能的虚拟机(VM)的行为来创建智能合约。 Arbitrum使用机制设计来激励各方就VM会做什么进行脱链协商,以便Arbitrum矿工只需要验证数字签名以确认各方已就VM的行为达成一致。如果双方无法达成一致的协议,Arbitrum仍然允许诚实的各方在链上推进VM状态。如果一方试图欺骗虚拟机的行为,验证者(或矿工)将通过使用利用Arbitrum虚拟机架构功能的高效挑战协议来识别和惩罚不诚实的一方。以这种方式将VM的行为验证转移到链外,可以显着提高可扩展性和隐私性。协议的体系结构旨在使尽可能快速简单地解决争议的任务。 Arbitrum大大降低了智能合约的成本。如果参与者根据他们的激励行为,则验证者将永远不必模拟或验证任何VM的行为。在这种情况下,验证者唯一的责任是进行简单的记录来跟踪货币持有量,消息收件箱的散列以及每个VM的单个散列状态值。
    这里写图片描述
        如上图对虚拟机的状态所示,Arbitrum通过二分协议来处理有争议的断言。当一位管理者做出有争议的断言而另一位管理者对该断言提出质疑时,两位管理者都会放下一笔存款。在二分协议的每一步,断言器将断言二等分为两个断言,每个断言涉及VM的一半计算步骤,并且挑战者选择想要挑战的一半。它们继续这种二分协议,直到关于单个步骤的断言(即,VM执行一个指令)受到质疑,此时断言器必须提供验证者可以检查的一步证据。如果提供正确的证明,则断言者获胜;否则挑战者胜出。获胜者将获得存款,并且还可以获得一半的输家存款。失败者存款的另一半交给了验证者。二分协议通过断言者和挑战者进行的一系列区块链交易来执行。在协议中的每个点,一方有一个有限的时间间隔来进行下一次移动,并且如果他们未能在截止日期之前做出有效的移动,该方就会失败。
    这里写图片描述
         上图为单步证明的举例。如果验证者需要验证add指令的结果是否正确,它需要从指令堆栈中取得预计的指令,并从数据堆栈中取得数据的哈希值后(出于隐私考虑,验证者只能得到数据的哈希值),与已经收到的数据哈希值进行验证。
        但是,VM的使用频率取决于VM管理器与VM本身之间的通信。在我们之前对Arbitrum协议的描述中,这种通信必须是链接的,因此受到共识机制的速度的限制。 为了增加他的扩展性,Arbitrum与状态通道和侧链技术兼容,并且有几种结构允许管理员与VM通信并一致地推进VM的状态脱链。

  2. 技术亮点
        本文中的加密货币系统有效的提高了可扩展性和隐私性,并极大的降低了智能合约的成本。如果参与者依照系统,则验证者将永远不必模拟或验证任何VM的行为。在这种情况下,验证者唯一的责任是进行简单的记录来跟踪货币持有量,消息收件箱的散列以及每个VM的单个散列状态值。
        与以太坊相比,所有以太坊合约代码都是公开的,这是模型的必需品,因为每个矿工都需要能够模拟所有代码。所以对于以太坊式的智能合约来说代码不能修改。然而在Arbitrum中,可以对合同VM进行修改,只要所有VM的诚实管理者都同意这一点。
        Arbitrum还使用了一种定制设计的虚拟机架构,以降低链上争议解决的成本。将虚拟机行为的执行主要转移到链外,并降低链上解析的成本,从而使Arbitrum在可扩展性和隐私方面具有优势。
        由于二分协议采用递归式的处理,直到到单个步骤争议断言为止,大大提高了处理有争议断言的效率。经测量在机器上运行的验证者节点每秒能够处理超过5000个有争议的断言。这使得可能的网络吞吐量达到每秒超过40亿次,而以太网为1600次。

  3. 技术局限性
        一个有充足资金的恶意管理器可以通过不断挑战有关其行为的所有断言来无限制地停止VM。攻击者将丢失至少一半的存款,并且每次这样的丢失将仅在运行二分协议一次所需的时间内延迟VM的进度。

  4. 技术展望
        本文提供了Arbitrum,这是一个新的智能合约平台,具有比以前的解决方案更好的可扩展性和隐私性,并且可以通过任何现有的机制来实现区块链的共识。这种高速度的减少用户隐私泄露的处理方式可以在未来用在解决争议上。


参考文献
[1]Kalodner H, Goldfeder S, Chen X, et al. Arbitrum: Scalable, private smart contracts[C]//27th {USENIX} Security Symposium ({USENIX} Security 18). USENIX} Association}, 2018: 1353-1370.

 
 
 
 
 
 
 
 
 
 

Erays:逆向工程以太坊的不透明智能合约

  1. 技术简介
        与以太坊智能合约交互可能会产生潜在的破坏性财务后果。因此,智能合约引起了包括美国联邦贸易委员会和美国证券交易委员会在内的多个监管机构的关注。这些监管机构有意审计这些合同以防止意外的财务后果。遗憾的是,审核没有现成源代码的智能合约可能具有挑战性,目前很少有工具可用于此过程。此类合同对审计师来说仍然不透明。为了更好地理解不透明的智能合约,来自伊利诺伊大学的研究人员提出了Erays,一种用于智能合约的逆向工程工具[1]。 Erays从以太坊区块链中获取智能合约,并生成适合手动分析的高级伪代码,利用Erays将没有以前可用源代码的合同链接到公共源代码,从而降低生态系统中的整体不透明度。
    在34K独特合约中,研究人员能够成功匹配7.7K(22.7%)的合约,即有77.3% 的独特合约不透明。,如下图所示,与透明合约相比,不透明合约的交易量为12.7M,交易量为27.6M。此外,不透明合约仅持有31亿美元,而透明合约持有73亿美元。虽然看起来生态系统的透明度普遍存在,但事实仍然是合同中有12.7M的交易额和总共31亿美元的合同,审计师和监管机构对这些合同没有任何了解。

这里写图片描述
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= s 3 = s2 + s3 s 3 时 , 我 们 将 加 载 s2和 s32256 s 3 中 的 值 , 将 它 们 加 起 来 , 模 数 为 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不能简洁地捕获复杂类型上的操作,例如mapping(uint => string)。
4. 技术展望
    本文发现不透明性是预期的,有时对这些合同的正确功能很重要。有鉴于此,研究人员认为智能合约开发商可能期望通过扣留他们的高级代码来实现“默默无闻”,保证安全。除此之外,Erays可以帮助审计方降低需要审查的智能合约的不透明度,在保护加密货币社区的安全方面有巨大的潜力。


参考文献
[1]Zhou Y, Kumar D, Bakshi S, et al. Erays: Reverse engineering ethereum’s opaque smart contracts[C]//Proceedings of the 27th USENIX Security Symposium (USENIX Security’18). 2018, 1.

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值