【阿菜读论文】ContractFuzzer:fuzzing方法挖掘智能合约漏洞
论文简介
论文标题: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
函数却没有检查返回值是否成功(默认成功),则可能发生意外的错误。
检测方法:
- 调用了
send()
函数 send()
函数在运行过程中抛出了ErrOutOfGas
错误
异常回传丢失
漏洞定义:
若调用链中的每个调用都是对合约功能的直接调用,当发生异常时,所有交易都将被回滚(包括以太币转账)。 但是,对于至少一个通过低级调用方法(address.call()
、address.delegatecall()
、address.send()
)对地址进行调用的嵌套调用链,事务的回滚将 只停在调用函数处并返回false。
检测方法:
- 若其嵌套调用中至少有一个抛出了异常,但根调用没有抛出异常。
重入漏洞
漏洞定义:
当“转账函数”先进行转账,在清空账户余额的时候,重入漏洞就会发生。攻击者在fallback
函数中再次调用“转账函数”,进行重复多次的取款。
检测方法:
- 递归调用检测
- 在以调用
A
函数为开始的调用链中,A
函数是否被多次调用。
- 在以调用
- 转账检测
- 调用函数
call()
的转账数目大于0 - 有足够的
gas
让被调用函数执行复杂的代码 call()
函数所调用的合约是ContractFuzzer提供的攻击合约,而不是被测试合约所指定的合约。
- 调用函数
时间戳依赖
漏洞定义:
如果智能合约采用区块产生的时间来进行一个随机数的构建,则可能遭到攻击。因为区块产生的时间值可以由矿工在一定的时间范围内自行定义。
检测方法:
- 函数执行期间是否调用了
TIMESTAMP
操作码 - 是否通过
send()
函数或call()
函数发送以太
区块号依赖
漏洞定义:
区块号依赖的弱点和时间戳依赖的原因相似,如果智能合约采用区块产生的编号来进行一个随机数的构建,则可能遭到攻击。因为区块产生的编号可以由矿工进行操控。
检测方法:
- 函数执行期间是否调用了
NUMBER
操作码 - 是否通过
send()
函数或call()
函数发送以太
delegatecall使用
漏洞定义:
采用delegatecall调用目标函数,目标函数将会在发起调用的合约环境中执行,从而可能导致发起调用的合约参数被修改。
检测方法:
- 函数执行期间是否调用了
delegatecall()
函数 - 被
delegatecall()
所调用的函数是从原始的输入(msg.data)
中获得的
余额冻结
漏洞定义:
当一个合约的转账功能完全依赖于调用外部合约的函数或外部Library时,一旦外部合约或Library自毁,则该合约的全部余额将无法取出。
检测方法:
- 该合约能够接收以太
- 本身没有
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方法挖掘智能合约漏洞的更多相关文章
- (读论文)推荐系统之ctr预估-NFM模型解析
本系列的第六篇,一起读论文~ 本人才疏学浅,不足之处欢迎大家指出和交流. 今天要分享的是另一个Deep模型NFM(串行结构).NFM也是用FM+DNN来对问题建模的,相比于之前提到的Wide& ...
- 读论文系列:Deep transfer learning person re-identification
读论文系列:Deep transfer learning person re-identification arxiv 2016 by Mengyue Geng, Yaowei Wang, Tao X ...
- nodejs部署智能合约的方法-web3 0.20版本
参考:https://www.jianshu.com/p/7e541cd67be2 部署智能合约的方法有很多,比如使用truffle框架,使用remix-ide等,在这里的部署方法是使用nodejs一 ...
- 【阿菜用工具】利用 Web3.js 在 ganache 上部署以及调用智能合约
合约部署 要部署的合约 pragma solidity ^0.4.23; contract test { uint256 value; function setValue(uint256 _value ...
- 读论文Machine Learning for Improved Diagnosis and Prognosis in Healthcare
Deep Learning的基本思想 假设我们有一个系统S,它有n层(S1,…Sn),它的输入是I,输出是O,形象地表示为: I =>S1=>S2=>…..=>Sn => ...
- C++ 使用ifstream读取数据,多读最后一行问题解决方法
C++文件读取时有一个bug,就是使用eof()判断文件结尾并不准确,最后一行会重复读取一次,可采用以下方法避免重复读取: while (!inFile.eof()) { inFile >> ...
- Deep Learning 24:读论文“Batch-normalized Maxout Network in Network”——mnist错误率为0.24%
读本篇论文“Batch-normalized Maxout Network in Network”的原因在它的mnist错误率为0.24%,世界排名第4.并且代码是用matlab写的,本人还没装caf ...
- Deep Learning 18:DBM的学习及练习_读论文“Deep Boltzmann Machines”的笔记
前言 论文“Deep Boltzmann Machines”是Geoffrey Hinton和他的大牛学生Ruslan Salakhutdinov在论文“Reducing the Dimensiona ...
- Deep Learning 16:用自编码器对数据进行降维_读论文“Reducing the Dimensionality of Data with Neural Networks”的笔记
前言 论文“Reducing the Dimensionality of Data with Neural Networks”是深度学习鼻祖hinton于2006年发表于<SCIENCE > ...
随机推荐
- Oracle简单分析
1.Oracle 数据库是甲骨文公司开发的一种关系型数据库管理系统,也就是RDBMS(relational database management system). 2.Oracle 从头到尾都是一个 ...
- 每日三道面试题,通往自由的道路4——JVM篇
茫茫人海千千万万,感谢这一秒你看到这里.希望我的面试题系列能对你的有所帮助!共勉! 愿你在未来的日子,保持热爱,奔赴山海! 每日三道面试题,成就更好自我 昨天既然你有讲到字符串常量池是吧,那这样吧 1 ...
- 基于SpringBoot 、AOP与自定义注解转义字典值
一直以来,前端展示字典一般以中文展示为主,若在表中存字典值中文,当字典表更改字典值对应的中文,会造成数据不一致,为此设置冗余字段并非最优方案,若由前端自己写死转义,不够灵活,若在业务代码转义,臃肿也不 ...
- 数据备份[APIO/CTSC 2007]题解
题目描述 你在一家IT公司为大型写字楼或办公楼的计算机数据做备份. 然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的乐趣. 已知办公楼 ...
- 使用 python 把一个文件生成 C 语言中的数组并保存到头文件中
(一)要做什么 之前有这么一个需求,是要把一个二进制文件里面的数据,转换成 C 代码里面的数组,可以看之前的一篇文章: NUC980 运行 RT-Thread 驱动 SPI 接口 OLED 播放 ba ...
- 不藏了,这些Java反射用法总结都告诉你们
摘要:Java反射是一种非常强大的机制,它可以在同一个系统中去检测内部的类的字段.方法和构造函数.它非常多的Java框架中,都大量应用了反射技术,如Hibernate和Spring.可以说,反射机制的 ...
- 怎么用git将自己的源代码提交到git服务器上
在git服务器上新建仓库 在本地初始化本地仓库 初始化 git init 添加远程仓库地址 git remote add origin XXX.git 同步 git pull origin maste ...
- CentOS-关闭防火墙和禁用安全策略
关闭防火墙 默认使用的是firewall作为防火墙 查看防火墙状态 $ firewall-cmd --state 停止firewall $ systemctl stop firewalld.servi ...
- Nginx:Nginx动静分离
1.什么是动静分离 将动态请求和静态请求区分访问 2.为什么要做动静分离 tomcat本身处理静态效率不高,还会带来资源开销.所以使用动静分离,将静态由Nginx处理, 动态由PHP处理或Tomcat ...
- tomcat shutdown后,进程还存在linux系统中的解决办法
基本原理为启动tomcat时记录启动tomcat的进程id(pid),关闭时强制杀死该进程 第一步 :vim修改tomcat下bin/catalina.sh文件,添加点东西,主要是记录tomcat的p ...