0%

StudyRecord-以太坊合约静态分析工具Slither使用记录

Pre:

熟悉一下SLITHER该工具的使用,主要想用它的graph来帮助阅读sol源码

slither Usage

介绍:

Slither是一个用Python 3编写的智能合约静态分析框架,提供如下功能:

  • 自动化漏洞检测。提供多项的漏洞检查模型,模型列表详见:link

  • 自动优化检测。Slither可以检测编译器遗漏的代码优化项并给出优化建议。

  • 代码理解。Slither能够绘制合约的继承拓扑图,合约方法调用关系图等,帮助开发者理解代码。

  • 辅助代码审查。用户可以通过API与Slither进行交互。

安装与启动:

docker安装:

1
2
# 安裝 docker image:
docker pull trailofbits/eth-security-toolbox

docker共享目录volume:

1
2
3
4
5
# docker里创建目录:
# 源代码文件夹
sudo mkdir contracts
# 库文件夹
sudo mkdir @openzeppelin

我是使用图形化工具共享目录
EC7266A8-3812-4827-8BCD-2CBFAA44330B

1
2
3
4
5
6
7
8
9
# 共享源文件目录
/Users/chanjerry/Documents/GitHub/blockchain/openzeppelin-contracts/contracts

/home/contracts

# 共享库文件目录
/Users/chanjerry/Documents/GitHub/blockchain/cool-erc20/blacklist/node_modules/@openzeppelin

/home/@openzeppelin

SLITHER使用:

检查solc版本:

1
2
3
# 查看已安装的solc版本列表
solc-select versions
# 用use命令切换编译器版本

漏洞检测:

1
2
# 开始扫描
slither /home/contracts/token/ERC20/extensions/ERC20Snapshot.sol

报错,不支持相对导入 import "../ERC20.sol";修改import语句,成import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

1
2
# 指定 --solc-remaps 来告诉编译器 openzeppelin 的具体位置
slither /home/contracts/token/ERC20/extensions/scan/ERC20Snapshot_bak.sol --solc-remaps @openzeppelin/=/home/@openzeppelin/

扫描结果:
2859ABE2-0593-4DC4-9786-E6CDC6F945BF

输出合约继承关系图:

1
2
# 输出合约继承关系 --print inheritance-graph
slither /home/contracts/token/ERC20/extensions/scan/ERC20Snapshot_bak.sol --solc-remaps @openzeppelin/=/home/@openzeppelin/ --print inheritance-graph

执行结果:
881C71ED-C4E0-476D-81D8-879BE8B4D25A

生成的是.dot文件使用在线工具,转换一下.dot格式的文件,来输出图形

Graphviz在线使用

3ADC3166-CCB2-43A5-B9F8-52CE1EB66491

图示说明:

  • 如果合约具有多重继承,则在连接线将按声明顺序标记。

  • 以橙色突出显示的函数会覆盖父函数。(看override的情况)

  • 不直接相互覆盖(但由于多重继承而冲突)的函数将在受影响的合约节点底部以灰色字体突出显示。

  • 以红色突出显示的变量掩盖了父变量声明。

  • 类型变量contract以蓝色字体在括号中指定合约名称。

Useful!!!

输出合同的快速摘要:

1
2
# --print contract-summary
slither /home/contracts/token/ERC20/extensions/scan/ERC20Snapshot_bak.sol --solc-remaps @openzeppelin/=/home/@openzeppelin/ --print contract-summary

这跟继承关系差不多,呈现的方式有些不一样。

C37B62B5-7370-4BFA-A83C-9D0B56BDA109

更多打印功能,可看slither Printer documentation,这个工具还是蛮实用和有趣的,So cool ~

输出可读的合同摘要:

1
2
# --print human-summary
slither /home/contracts/token/ERC20/extensions/scan/ERC20Snapshot_bak.sol --solc-remaps @openzeppelin/=/home/@openzeppelin/ --print human-summary

150FDB31-BD8C-4A9D-83B2-A6A768631844

内容大概有:代码总行数、汇编代码总行数、漏洞检测汇总信息等。

Refs: