区块链作为对等网络中的一种分布式账本技术,集成了密码学、共识机制、智能合约等多种技术,提供一种新型信任体系构建方法。智能合约具有公开透明、实时更新、准确执行等显著特点,在区块链中为信息存储、交易执行和资产管理等功能的实现提供了更安全、高效、可信的方式。但是,智能合约本身仍然存在安全问题,影响了区块链技术的进一步推广使用。
本章节介绍几种安全分析工具, 帮忙开发者在开发 solidity 合约时, 及时发现并检测其中的漏洞
Mythril 是一个以太坊官方推荐的智能合约安全分析工具,使用符合执行来检测智能合约中的各种安全漏洞,在 Remix、Truffle 等 IDE 里都有集成。 其包含的安全分析模型如下,具体可参考 链接
- 安装 ( docker 方式 )
docker pull mythril/myth
- 进行检查
docker run -v ${PWD}:/contract mythril/myth analyze /contract/Overflow_Add.sol --solv 0.4.25
之后可以得到如下输出
❯ docker run -v ${PWD}:/contract mythril/myth analyze /contract/Overflow_Add.sol --solv 0.4.25
==== Integer Arithmetic Bugs ====
SWC ID: 101
Severity: High
Contract: Overflow_Add
Function name: fallback
PC address: 143
Estimated Gas Usage: 5954 - 26049
The arithmetic operator can overflow.
It is possible to cause an integer overflow or underflow in the arithmetic operation.
--------------------
In file: /contract/Overflow_Add.sol:6
balance += deposit
--------------------
Initial State:
Account: [CREATOR], balance: 0x1, nonce:0, storage:{}
Account: [ATTACKER], balance: 0x0, nonce:0, storage:{}
Account: [SOMEGUY], balance: 0x0, nonce:0, storage:{}
Transaction Sequence:
Caller: [CREATOR], calldata: , value: 0x0
Caller: [ATTACKER], function: add(uint256), txdata: 0x1003e2d2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, value: 0x0
这个工具比较旧了, 目前使用的 solidity 编译器版本为 0.4.21, 但作为一个安全工具, 我们还是可以去了解下如何使用它
- 安装 && 启动
docker pull luongnguyen/oyente && docker run -i -t luongnguyen/oyente
- 执行测试
cd /oyente/oyente && python oyente.py -s greeter.sol
Slither 是一个用 Python 3 编写的智能合约静态分析框架,提供如下功能:
-
自动化漏洞检测。提供超 30 多项的漏洞检查模型,模型列表详见: https://github.com/crytic/slither#detectors
-
自动优化检测。Slither 可以检测编译器遗漏的代码优化项并给出优化建议
-
代码理解。Slither 能够绘制合约的继承拓扑图,合约方法调用关系图等,帮助开发者理解代码
-
辅助代码审查。用户可以通过 API 与 Slither 进行交互
- 安装 ( docker 方式 )
docker pull trailofbits/eth-security-toolbox
- 登陆容器
docker run -it -v ${PWD}:/contracts trailofbits/eth-security-toolbox
- 进行检查
cd /contracts
slither Suicidal.sol --solc /usr/bin/solc-v0.5.13
输入结果如下
-
[可选] 使用 solc-select 切换/管理solidity(solc)版本
-
安装
pip3 install solc-select
-
安装需要的版本 & 使用需要的版本
solc-select install 0.8.17 solc-select use 0.8.17 solc --version
-
使用slither(无需版本声明)
cd /contracts slither MyContract.sol
-
mythX 是一个付费工具, 支持命令行, vscode 插件等形式进行分析.
可参考 官网 操作指导进行操作.
进行正确配置后, 就可以进行 solidity 文件漏洞扫描了, 这里以 vscode 为例, 扫描结果如下.
总的来说, 毕竟是付费的, 体验还是很不错的 ^_^
合约中会存在很多的方法, 特别是一些大型商业合约, 方法相互嵌套, 很容易令人迷惑. SolGraph 就是用于展示合约方法之间相互关系的一个工具, 使用这个这个工具, 可以清晰的展示合约方法之间的调用关系.
- 安装 solgraph
yarn global add solgraph
- 安装 graphviz ( 以 macos 为例 )
brew install graphviz
- 进行分析
solgraph GraphContract.sol > GraphContract.dot
- 转换分析结果为图片
dot -Tpng GraphContract.dot -o GraphContract.png
manticore 是基于符号执行方法的合约分析工具,它实际上也是通过断言,来判断是否满足某种属性。
- 特点:
-
给定输入,搜索可能的状态。
-
自动生成输入信息。
-
检测执行失败或者崩溃的地方。
-
通过事件或者指令钩子,更精确的控制搜索路径。
- 安装:
pip install "manticore[native]"
如果运行 manticore 报错,请复制最后一行的提示信息,在谷歌搜索。大概率是依赖包版本问题。
注意:由于遍历或者搜索的效率其实比较慢,可能需要运行很久。
运行后将会生成很多辅助分析的材料,如何分析请见该项目文档。除此之外,也可以高度自定义,编写 python 代码,初始化合约状态,然后再检查不变量。
- 检测漏洞:
类似于断言的方法,判断合约是否满足某个属性,详细操作间见文档。
也是基于断言的审计工具,但是比较特殊的是,他可以很方便的扫描链上的合约,然后寻找漏洞。它自称是“基于属性的运行时验证工具”,我暂时还不清楚它使用的原理。感兴趣可以深入阅读它的文档。
他主要是提供了语法糖,可以简化节点的查询工作,比如不用每次查询余额都要写一串的 web3。
这是一个 vscode 的插件,通过可视化的方式辅助分析合约。建议使用时换成它自定义的主题,可能显示效果会好一些。使用方法请看标题的官方网站,介绍的很清楚,也有动图演示。
Aderyn是一个用 Rust 编写的开源 solidity 智能合约静态分析框架,可以快速检测潜在漏洞,生成分析报告,使安全审计人员有时间专注于更复杂的漏洞。
Aderyn可以根据需要构建自定义检测器,具体参考Detectors Quickstart。
- 安装:
cargo install aderyn
- 使用:
aderyn path/to/your/project
- 举例(Overflow_Add.sol):
aderyn Overflow_Add.sol
分析报告见report.md