以太坊合约静态分析工具Slither简介与使用
上篇学习了Mythril[1],一种动态的以太坊智能合约安全分析工具。今天来看看以太坊官方推荐的另一款静态智能合约分析工具Slither。
本篇文章不做工具的对比与评测,仅从原理和使用角度阐述。
一、概述
Slither是一个用Python 3编写的智能合约静态分析框架,提供如下功能:
- 自动化漏洞检测。提供超30多项的漏洞检查模型,模型列表详见:https://github.com/crytic/slither#detectors[2]。
- 自动优化检测。Slither可以检测编译器遗漏的代码优化项并给出优化建议。
- 代码理解。Slither能够绘制合约的继承拓扑图,合约方法调用关系图等,帮助开发者理解代码。
- 辅助代码审查。用户可以通过API与Slither进行交互。
二、Slither运行流程
Slither的工作方式如下:
- 智能合约源码经过solc编译后得到Solidity抽象语法树(AST)作为Slither的输入。
- 经过information recovery(数据整合),Slither生成合约的继承图,控制流图(CFG)以及合约中函数列表。
- 经过SlithIR转换,Slither将合约代码转换为SlithIR[3],一种内部表示语言,目的是通过简单的API实现高精度分析,支持污点和值的跟踪,从而支持检测复杂的模型。
- 在代码分析阶段,Slither运行一组预定义的分析,包括合约中变量、函数的依赖关系;变量的读写和函数的权限控制。
- 经过Slither的核心处理之后,就可以提供漏洞检测、代码优化检测和代码理解输出等。
三、使用
3.1 安装
Slither支持pip、源码编译和docker三种安装方式。pip安装
pip3 install slither-analyzer
源码编译
$ git clone https://github.com/crytic/slither.git && cd slither
$ python3 setup.py install
docker安装
docker pull trailofbits/eth-security-toolbox
在安装时,会有大量的依赖安装,这里建议使用docker,不容易出错。
docker安装后运行使用命令:docker run -it -v /Users/aa/go/src/six-days/blockchain:/contract trailofbits/eth-security-toolbox
其中 -v是指将本地的磁盘目录映射到容器中。
3.2 合约漏洞检测
检测合约
pragma solidity ^0.5.0;
contract Suicidal{
function kill() public{
selfdestruct(msg.sender);
}
}
漏洞分析合约有一个public类型的kill方法,任何人都能够销毁合约,属于SWC-106[4]问题。
运行命令slither overflow_simple_add.sol --solc /usr/bin/solc-v0.5.0 --json res.json
其中:
- --solc 参考可以指定编译版本。如果不指定的话也可以使用
solc-select
命令设置默认的编译版本,solc-select -l
查看已有的编译版本;solc-select 0.5.0
配置编译版本为0.5.0。 - --json 可以指定输出结果为json
更多命令详见:https://github.com/crytic/slither/wiki/Usage
运行结果
从结果中可以看到,共从46个检测模型中检测出3个问题,其中红色的就是合约销毁问题。
3.3 合约继承关系
Slither有一个功能我很喜欢,对复杂合约的关系梳理特别有帮助,就是输出合约继承关系,使用命令如下。slither evidence/EvidenceVoteSaveHandler.sol --print inheritance-graph
运行结果是一个dot格式的关系描述,可以使用graphviz工具转成图片格式。下图是一个存证合约的继承关系图。
四、参考
Slither: A Static Analysis Framework For Smart Contracts[5]
Slither: The Leading Static Analyzer for Smart Contracts[6]
参考资料
[1]
Mythril: https://learnblockchain.cn/article/1283
[2]
https://github.com/crytic/slither#detectors: https://github.com/crytic/slither#detectors
[3]
SlithIR: https://github.com/crytic/slither/wiki/SlithIR
[4]
SWC-106: https://links.jianshu.com/go?to=https%3A%2F%2Fswcregistry.io%2Fdocs%2FSWC-106
[5]
Slither: A Static Analysis Framework For Smart Contracts: https://arxiv.org/abs/1908.09878
[6]
Slither: The Leading Static Analyzer for Smart Contracts: https://blog.trailofbits.com/2019/05/27/slither-the-leading-static-analyzer-for-smart-contracts/
本文作者:六天
作者主页:
https://learnblockchain.cn/people/436
- 性能优化总结(六):预加载、聚合SQL应用实例
- 性能优化总结(五):CSLA服务端如何使用多线程的解决方案
- 编辑-发布-开发分离:git作为NoSQL数据库
- 性能优化总结(四):预加载的设计
- 在Expression Blend中使用XAML建立3D应用程序
- 使用 Asp.net Future May 2007 开发Silverlight应用
- Rafy 领域实体框架设计 - 重构 ORM 中的 Sql 生成
- RePractise前端篇: 前端演进史
- 性能优化总结(三):聚合SQL在GIX4中的应用
- ASP.NET AJAX 控件开发基础
- 听我说说我的博客: 月访问量过万的个人IT博客的技术史
- TransactionScope和Enterprise Libray 3.0 Data Access Application Block
- 《Python Web开发 - 测试驱动方法》阅后感
- 微信小程序分享——会话服务器和业务服务器合并
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- [java][Servlet]Servlet 简介-Servlet 到 Spring MVC 的简化之路-Servlet/Tomcat/ Spring 之间的关系
- oracle19c安装脚本.
- GOLDENGATE EXTRACT在DATABASE SWITCHOVER后表现以及处理方案
- JAVA中的23种设计模式(GOF)
- 机器学习第3天:预测汽车的燃油效率
- Oracle GoldenGate 19 Microservices安装、配置以及简单数据同步
- 最小覆盖子串
- 通配符匹配
- LaTeX多行注释
- [886]mysql查询以某个字符开头
- 不同路径问题
- 信号量及其应用
- 岛屿问题
- 跳水板
- windows定时删除指定文件夹下面的文件