上篇学习了Mythril[1],一种动态的以太坊智能合约安全分析工具。今天来看看以太坊官方推荐的另一款静态智能合约分析工具Slither。
本篇文章不做工具的对比与评测,仅从原理和使用角度阐述。
Slither是一个用Python 3编写的智能合约静态分析框架,提供如下功能:
Slither的工作方式如下:
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是指将本地的磁盘目录映射到容器中。
检测合约
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-select
命令设置默认的编译版本,solc-select -l
查看已有的编译版本;solc-select 0.5.0
配置编译版本为0.5.0。更多命令详见:https://github.com/crytic/slither/wiki/Usage
运行结果
从结果中可以看到,共从46个检测模型中检测出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