SIF: A Framework for Solidity Contract Instrumentation and Analysis

SIF

论文题目: SIF:A Framework for Solidity Contract Instrumentation and Analysis —— Solidity合约检测和分析框架

论文引用:Peng C, Akca S, Rajan A. SIF: A framework for solidity contract instrumentation and analysis[C]//2019 26th Asia-Pacific Software Engineering Conference (APSEC). IEEE, 2019: 466-473.

代码开源:chao-peng/SIF

背景

传统的编程语言通常有综合框架支持,用于代码检测、监视、优化和代码生成的支持,例如C/C ++的LLVM / Clang [4])。Solidity这样的智能合约程序设计语言缺少此类的框架支持。

分析Solidity合同安全漏洞的现有工作和工具主要基于是智能合约的字节码,或将Solidity代码翻译为可执行安全性分析的其他语言或中间形式。比如,Oyente [5]分析来自Solidity编译器的字节码并成功报告漏洞的存在。但是,它缺乏跟踪和定位Solidity代码中的错误的能力。

Zeus [10]将智能合约转换为LLVM位代码,但不支持完整的Solidity语法,包括throw语句,自销毁(self-destructs),虚函数和汇编代码块。

这些技术虽然可以有效地检测安全漏洞,但它们并不是通用的代码检测和分析工具。

结果是,使用现有技术很难构建目的不同于检测安全漏洞的程序分析工具。在这些技术中,Solidity源代码的可追溯性也是一个常见问题。本文作者提出了一种通用分析框架,可以满足对Solidity合同的这种需求。

为了实现此目标,我们设计并实施具有以下功能的Solidity Instrumentation Framework(SIF)

  • 提供一个可供用户查询Solidity代码的抽象语法树(AST)的接口
  • 预定义的helper 函数支持代码检测、转换,同时可以修改AST。
  • 支持从AST生成Solidity代码

我们通过使用SIF框架实现7种不同的Solidity合同工具或实用程序来证明SIF框架在支持代码检测和分析方面的通用性。
其中四个工具查询Solidity抽象语法树(AST)以提供有关合同代码的信息,而其他三个工具则使用AST修改代码。下面提供了这些工具的简要说明

  • Function Listing:列出了所有函数定义,包括函数名称,返回列表,参数列表以及它们所属的协定。在总结和审查Solidity合同时很有用。
  • AST Diff:一种语法差异工具(syntactic diff tool),用于在AST级别比较智能合约。它忽略注释,空格和空白行。
  • Call Graph Generator:调用图生成器生成函数调用图,以描述Solidity合同中的函数之间的调用关系。节点代表功能,边代表调用关系。在理解和审查智能合约时很有用。
  • Control Flow Graph Generator:控制流图生成器生成Solidity合同中控制流的图形表示。
    控制流程图在静态分析和程序优化中非常有用。
  • SIF Rename :可以轻松地重命名现有标识符。所有对指定标识符的定义和引用将更改为提供的新名称
  • Fault Seeder:允许开发人员人为地在智能合约中植入错误。该工具目前支持3种常见的错误/漏洞类型。植入的错误可用于评估发现漏洞的测试或验证工具的有效性。
  • Assertion Analyser:断言分析器检查智能合约的所有AST节点,并确定该节点是否易受漏洞影响,例如被零除,上溢和下溢。断言将通过该工具插入易受这些漏洞影响的合同位置,在修改后的合同执行期间将检查断言。

一、主要内容

SIF为Solidity合同开发人员和测试人员提供支持,以建立用于分析,理解,诊断,优化和代码生成的源代码级技术。

通过在框架之上构建实用工具并在以太坊网络上部署的1838个真实智能合约上运行它们,作者展示了该框架的可行性和适用性。

通用框架SIF使用C ++实现,SIF支持整个Solidity语法,最高版本为0.5.3,该框架还提供了从AST生成Solidity代码的功能。

SIF的工作流程如图1所示。SIF从 Solidity 编译器生成的AST of Solidity代码开始。然后,它接受有关查询和/或所需修改的用户说明。然后,框架收集所需的查询信息或对AST进行修改,最后从AST生成Solidity代码。

image-20210102153903991

SIF Design

SIF的操作分为三个阶段:

  1. 第1阶段 着重于将AST节点表示为具有检索和修改节点信息的方法的C ++类。
  2. 第2阶段 与 用户定义的查询和/或工具功能进行交互,并遍历AST以执行所需的操作。
  3. 第3阶段从AST生成Solidity代码。我们将在本节的其余部分中详细讨论每个阶段。

我们使用清单1中显示的名为Request的示例结构定义示例,其中包含一个数据元素和一个方法,以说明不同的阶段。

1
2
3
4
struct Request {
bytes data;
function (bytes memory) external callback;
}

AST Representation

Solidity编译器从Solidity代码以两种格式生成AST:

  • 纯文本
  • JSON(JavaScript对象表示法,结构化数据格式)。

为了使我们的代码检测工具通用且易于使用,我们将C++类用作中间AST表示形式。

给定Solidity AST,SIF首先遍历AST,并为每个节点实例化具有所有相关信息的该节点类型的类。
图2显示了一个示例AST中出现的结构定义。

image-20210102154338155

这些类在其数据字段中包含有关AST节点的信息,并提供查询和修改数据的方法。
清单2 显示了AST中的结构定义节点的C ++类表示。 C ++类提供了获取结构名称,将其设置为其他名称,查询结构中字段数,获取特定字段,添加,删除和更新字段的方法。这些方法有助于查询和修改AST节点。

相关工作

过去几年中出现了几种用于智能合约的静态分析和漏洞检测工具。我们介绍并讨论有关漏洞检测,代码生成,查询和检测的Solidity合同的现有工作。

1、漏洞检测:许多现有技术都依靠字节码分析来检查潜在的漏洞[3],[5] – [7]。
字节码是智能合约的已编译十六进制格式。在字节码级别进行Solidity合同验证足以检测漏洞,但是,将问题追溯到Solidity源代码,开发人员可以解决该问题具有挑战性。一些技术将Solidity代码转换为F* 语言或以中间形式表示代码,例如LLVM IR(中间表示)或XML [8] – [10]。
然后对 中间表示 进行漏洞分析。

该技术不支持将中间形式转换回Solidity,这会导致源代码的可追溯性丧失。

2、Solidity code generation from AST/Intermediate form:当前,从中间形式或AST转换回Solidity的支持有限。我们只知道一种工具Soltar [12],它支持将Solidity AST转换回Solidity代码。
但是,Soltar 不提供SIF支持的功能来查询和修改AST。此外,Soltar不被维护,并且不支持Solidity版本0.4.3及更高版本。第三部分介绍的SIF能够处理最新的Solidity版本0.5.3和较旧的版本。

现有的工具Zeus [10]支持将Solidity代码转换为LLVM位代码,但不具备从位代码返回Solidity的功能。
另外,不支持完整的Solidity语法(throw语句,自销毁,虚拟函数和汇编代码块),并且没有提供代码检测的准备。Porosity[13]和以太坊智能合约反编译器JEB [14]可以将字节码转换回Solidity码。
但是,这些工具不支持Solidity代码查询,修改和检测。