teEther: Gnawing at Ethereum to Automatically Exploit Smart Contracts

TEETHER

论文题目:(2018-USENIX) teEther: Gnawing at Ethereum to Automatically Exploit Smart Contracts

论文引用:Krupp J, Rossow C. teether: Gnawing at ethereum to automatically exploit smart contracts[C]//27th {USENIX} Security Symposium ({USENIX} Security 18). 2018: 1317-1333.

一、主要内容

作者在通用定义易受攻击合同的定义之后,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执行模型的误解造成的。

三、总结评价

优点:

  1. TEETHER成功地对使用这些合同的以太坊账户产生了1,564个工作漏洞
  2. 本文提出了一个通用漏洞定义,可以被一个弱的多的攻击者利用,不局限于恶意矿工。有的工具只能检测漏洞,该工具不仅能检测漏洞,还能自动的利用漏洞。

缺点:

  1. TEETHER目前只侧重于在检查合约内的漏洞,但事实上,合约可能会调用其他合约产生漏洞。
  2. 搜索漏洞时,文中的评估会将合同的存储初始化为空状态。这使他们能够结合共享相同代码的合约进行分析,并将工具运行次数从784,344减少到38,757次。但是,这是以不精确的结果为代价的。
  3. 文中的漏洞研究只是在本地测试平台中,有些漏洞在真实的以太坊区块链中不存在。