论文简介

论文标题:ContractFuzzer: Fuzzing Smart Contracts for Vulnerability Detection

论文链接:ContractFuzzer: Fuzzing Smart Contracts for Vulnerability Detection

开源地址:gongbell/ContractFuzzer: The Ethereum Smart Contract Fuzzer for Security Vulnerability Detection (ASE 2018)

本篇论文提出了一个采用fuzzing技术对智能合约漏洞进行分类挖掘的工具,取名为ContractFuzzer。这篇论文是这该领域的开山之作。

可检测的漏洞分类与对应的检测方法

send函数gas不足

漏洞定义:

在调用send函数的时候gas默认为2300,这只足够调用空的fallback函数。若目标合约的fallback函数不为空(还有其他操作),则会导致gas不足进行回滚。若调用了send函数却没有检查返回值是否成功(默认成功),则可能发生意外的错误。

检测方法:

  1. 调用了send()函数
  2. send()函数在运行过程中抛出了ErrOutOfGas错误

异常回传丢失

漏洞定义:

若调用链中的每个调用都是对合约功能的直接调用,当发生异常时,所有交易都将被回滚(包括以太币转账)。 但是,对于至少一个通过低级调用方法(address.call()address.delegatecall()address.send())对地址进行调用的嵌套调用链,事务的回滚将 只停在调用函数处并返回false。

检测方法:

  1. 若其嵌套调用中至少有一个抛出了异常,但根调用没有抛出异常。

重入漏洞

漏洞定义:

当“转账函数”先进行转账,在清空账户余额的时候,重入漏洞就会发生。攻击者在fallback函数中再次调用“转账函数”,进行重复多次的取款。

检测方法:

  1. 递归调用检测

    1. 在以调用A函数为开始的调用链中,A函数是否被多次调用。
  2. 转账检测
    1. 调用函数call()的转账数目大于0
    2. 有足够的gas让被调用函数执行复杂的代码
    3. call()函数所调用的合约是ContractFuzzer提供的攻击合约,而不是被测试合约所指定的合约。

时间戳依赖

漏洞定义:

如果智能合约采用区块产生的时间来进行一个随机数的构建,则可能遭到攻击。因为区块产生的时间值可以由矿工在一定的时间范围内自行定义。

检测方法:

  1. 函数执行期间是否调用了TIMESTAMP操作码
  2. 是否通过send()函数或call()函数发送以太

区块号依赖

漏洞定义:

区块号依赖的弱点和时间戳依赖的原因相似,如果智能合约采用区块产生的编号来进行一个随机数的构建,则可能遭到攻击。因为区块产生的编号可以由矿工进行操控。

检测方法:

  1. 函数执行期间是否调用了NUMBER操作码
  2. 是否通过send()函数或call()函数发送以太

delegatecall使用

漏洞定义:

采用delegatecall调用目标函数,目标函数将会在发起调用的合约环境中执行,从而可能导致发起调用的合约参数被修改。

检测方法:

  1. 函数执行期间是否调用了delegatecall()函数
  2. delegatecall()所调用的函数是从原始的输入(msg.data)中获得的

余额冻结

漏洞定义:

当一个合约的转账功能完全依赖于调用外部合约的函数或外部Library时,一旦外部合约或Library自毁,则该合约的全部余额将无法取出。

检测方法:

  1. 该合约能够接收以太
  2. 本身没有transfer/send/call/suicide等功能,而是通过delegatecall()函数调用外部函数进行转账

ContractFuzzer流程图



0-在本地部署离线的私有链

1-分析合约的ABI接口和字节码,提取处参数类型以及函数签名

2-对合约池中的所有合约进行函数签名分析,并建立{合约,函数}的索引

3- 生成符合ABI规范的fuzzing输入以及变异输入

4-该工具将启动fuzzing过程,将生成输入数据输入的相应的ABI接口中

5-根据执行日志检测安全漏洞

智能合约静态分析

首先基于每个智能合约导出的JSON格式ABI,提取ABI中声明的所有函数签名、参数描述和数据类型。目的是建立{函数选择器,所有合约地址}的映射。

流程如下:

后记

这篇文章还有很多实验的过程以及细节没有整理进来,感兴趣的读者可以去翻翻论文看一下。总的来说这篇文章讲了一个大概的框架,没有提到具体的技术实现,不过ContractFuzzer是开源的(在本文的开头)。

接下来打算看一下fuzzing具体是一个什么样的过程,输入生成函数是怎么样的,插桩又是什么东东。倒是想看一下ContractFuzzer是怎么实现的,但是他是用go写的,要看的话我还得先go一下。

好,这次的论文就读到这里,下期见~

【阿菜读论文】ContractFuzzer:fuzzing方法挖掘智能合约漏洞的更多相关文章

  1. (读论文)推荐系统之ctr预估-NFM模型解析

    本系列的第六篇,一起读论文~ 本人才疏学浅,不足之处欢迎大家指出和交流. 今天要分享的是另一个Deep模型NFM(串行结构).NFM也是用FM+DNN来对问题建模的,相比于之前提到的Wide& ...

  2. 读论文系列:Deep transfer learning person re-identification

    读论文系列:Deep transfer learning person re-identification arxiv 2016 by Mengyue Geng, Yaowei Wang, Tao X ...

  3. nodejs部署智能合约的方法-web3 0.20版本

    参考:https://www.jianshu.com/p/7e541cd67be2 部署智能合约的方法有很多,比如使用truffle框架,使用remix-ide等,在这里的部署方法是使用nodejs一 ...

  4. 【阿菜用工具】利用 Web3.js 在 ganache 上部署以及调用智能合约

    合约部署 要部署的合约 pragma solidity ^0.4.23; contract test { uint256 value; function setValue(uint256 _value ...

  5. 读论文Machine Learning for Improved Diagnosis and Prognosis in Healthcare

    Deep Learning的基本思想 假设我们有一个系统S,它有n层(S1,…Sn),它的输入是I,输出是O,形象地表示为: I =>S1=>S2=>…..=>Sn => ...

  6. C++ 使用ifstream读取数据,多读最后一行问题解决方法

    C++文件读取时有一个bug,就是使用eof()判断文件结尾并不准确,最后一行会重复读取一次,可采用以下方法避免重复读取: while (!inFile.eof()) { inFile >> ...

  7. Deep Learning 24:读论文“Batch-normalized Maxout Network in Network”——mnist错误率为0.24%

    读本篇论文“Batch-normalized Maxout Network in Network”的原因在它的mnist错误率为0.24%,世界排名第4.并且代码是用matlab写的,本人还没装caf ...

  8. Deep Learning 18:DBM的学习及练习_读论文“Deep Boltzmann Machines”的笔记

    前言 论文“Deep Boltzmann Machines”是Geoffrey Hinton和他的大牛学生Ruslan Salakhutdinov在论文“Reducing the Dimensiona ...

  9. Deep Learning 16:用自编码器对数据进行降维_读论文“Reducing the Dimensionality of Data with Neural Networks”的笔记

    前言 论文“Reducing the Dimensionality of Data with Neural Networks”是深度学习鼻祖hinton于2006年发表于<SCIENCE > ...

随机推荐

  1. SpringBoot2配置文件application.yaml

    源码基于SpringBoot 2.4.4 1.认识配置文件 1.1 配置文件的加载 创建SpringBoot项目的时候,会自动创建一个application.properties文件,该文件是Spri ...

  2. v-for和v-if不能同时使用

    如果使用v-for遍历数据时,想筛选出URL不为空的项并进行渲染 <ul> <li v-for="(item,index) in list" v-if=" ...

  3. Pytorch CNN网络MNIST数字识别 [超详细记录] 学习笔记(三)

    目录 1. 准备数据集 1.1 MNIST数据集获取: 1.2 程序部分 2. 设计网络结构 2.1 网络设计 2.2 程序部分 3. 迭代训练 4. 测试集预测部分 5. 全部代码 1. 准备数据集 ...

  4. 【dp】10-8题解 vacation

    vacations 原题codeforeces round 363 (Div2) c 题目描述 暑假到了, Pb 正在计划他的假期. Pb 准备假期去体育馆锻炼或看电影.但体育馆和电影院都有可能当天不 ...

  5. NOIP模拟测试17「入阵曲&#183;将军令&#183;星空」

    入阵曲 题解 应用了一种美妙移项思想, 我们先考虑在一维上的做法 维护前缀和$(sum[r]-sum[l-1])\%k==0$可以转化为 $sum[r]\% k==sum[l-1]\%k$开个桶维护一 ...

  6. Mysql优化(出自官方文档) - 第十篇(优化InnoDB表篇)

    Mysql优化(出自官方文档) - 第十篇(优化InnoDB表篇) 目录 Mysql优化(出自官方文档) - 第十篇(优化InnoDB表篇) 1 Optimizing Storage Layout f ...

  7. NAT网络地址转换技术

    NAT网络地址转换技术 目录 一.NAT概述 1.1.概述 1.2.NAT 的应用场景 二.NAT的类型及配置命令 2.1.静态NAT 2.2.动态NAT 2.3.Easy IP 2.4.NATP 2 ...

  8. 关于使用Draw.io画数据库E-R图的说明

    背景简介 E-R图也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型.属性和联系的方法,用来描述现实世界的概念模型. diagrams.net是用于构建图表 ...

  9. POJ 3087 Shuffle'm Up 模拟,看着不像搜索啊

    题意:给定s1,s1两副扑克,顺序从下到上.依次将s2,s1的扑克一张一张混合.例如s1,ABC; s2,DEF. 则第一次混合后为DAEBFC. 然后令前半段为s1, 后半段为s2. 如果可以变换成 ...

  10. Java核心基础第1篇-走进Java世界

    一.Java简介 1.1 Java概述 Java从一开始就以友好的语法.面向对象.内存管理和最棒的跨平台可移植性来吸引程序员. 写一次就可以在所有地方执行( write-once/run-anywhe ...