Slither是一款以太坊智能合约静态安全检测工具
# 一、概述
Slither是一个用Python 3编写的智能合约静态分析框架,提供如下功能:
– 自动化漏洞检测。提供超30多项的漏洞检查模型,模型列表详见:[https://github.com/crytic/slither#detectors](https://github.com/crytic/slither#detectors)
。
– 自动优化检测。Slither可以检测编译器遗漏的代码优化项并给出优化建议。
– 代码理解。Slither能够绘制合约的继承拓扑图,合约方法调用关系图等,帮助开发者理解代码。
– 辅助代码审查。用户可以通过API与Slither进行交互。
# 二、Slither运行流程
Slither的工作方式如下:
1. 智能合约源码经过solc编译后得到Solidity抽象语法树(AST)作为Slither的输入。
2. 经过information recovery(数据整合),Slither生成合约的继承图,控制流图(CFG)以及合约中函数列表。
3. 经过SlithIR转换,Slither将合约代码转换为[SlithIR](https://github.com/crytic/slither/wiki/SlithIR),一种内部表示语言,目的是通过简单的API实现高精度分析,支持污点和值的跟踪,从而支持检测复杂的模型。
4. 在代码分析阶段,Slither运行一组预定义的分析,包括合约中变量、函数的依赖关系;变量的读写和函数的权限控制。
5. 经过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](https://links.jianshu.com/go?to=https%3A%2F%2Fswcregistry.io%2Fdocs%2FSWC-106)问题。
**运行命令**
`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](https://arxiv.org/abs/1908.09878)
[Slither: The Leading Static Analyzer for Smart Contracts](https://blog.trailofbits.com/2019/05/27/slither-the-leading-static-analyzer-for-smart-contracts/)
上篇学习了Mythril,一种动态的以太坊智能合约安全分析工具。今天来看看以太坊官方推荐的另一款静态智能合约分析工具Slither。
本篇文章不做工具的对比与评测,仅从原理和使用角度阐述。
一、概述
Slither是一个用Python 3编写的智能合约静态分析框架,提供如下功能:
- 自动化漏洞检测。提供超30多项的漏洞检查模型,模型列表详见:https://github.com/crytic/slither#detectors 。
- 自动优化检测。Slither可以检测编译器遗漏的代码优化项并给出优化建议。
- 代码理解。Slither能够绘制合约的继承拓扑图,合约方法调用关系图等,帮助开发者理解代码。
- 辅助代码审查。用户可以通过API与Slither进行交互。
二、Slither运行流程
Slither的工作方式如下:
- 智能合约源码经过solc编译后得到Solidity抽象语法树(AST)作为Slither的输入。
- 经过information recovery(数据整合),Slither生成合约的继承图,控制流图(CFG)以及合约中函数列表。
- 经过SlithIR转换,Slither将合约代码转换为SlithIR,一种内部表示语言,目的是通过简单的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问题。
运行命令 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 Slither: The Leading Static Analyzer for Smart Contracts
本文参与区块链开发网写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。
- 发表于 2020-07-23 21:16
- 阅读 ( 3000 )
- 学分 ( 116 )
- 分类:智能合约