Slither是使用Python 3编写的Solidity和Vyper静态分析框架。
项目描述
Slither,智能合约静态分析器
加入帝国黑客Slack
- 讨论和支持
Slither是使用Python3编写的Solidity和Vyper静态分析框架。它运行一套漏洞检测器,打印关于合约详细信息的可视化信息,并提供API以轻松编写自定义分析。Slither使开发者能够发现漏洞、增强其代码理解,并快速原型化自定义分析。
功能
- 检测具有低误报率的漏洞 Solidity 代码(见奖牌列表)
- 识别源代码中错误条件发生的位置
- 易于集成到持续集成和 Hardhat/Foundry 构建
- 内置的 '打印器' 快速报告关键合约信息
- Detector API 以在 Python 中编写自定义分析
- 能够分析使用 Solidity >= 0.4 编写的合约
- 中间表示(SlithIR)可实现简单、高精度分析
- 正确解析了所有公共 Solidity 代码的 99.9%
- 每个合约的平均执行时间小于 1 秒
- 与 CI 中的 Github 代码扫描集成
- 支持 Vyper 智能合约
用法
在 Hardhat/Foundry/Dapp/Brownie 应用程序上运行 Slither
slither .
如果您的项目有依赖项,这是首选选项,因为 Slither 依赖于底层编译框架来编译源代码。
但是,您可以在不导入依赖项的单个文件上运行 Slither
slither tests/uninitialized.sol
如何安装
注意
Slither 需要 Python 3.8+。如果您不打算使用 支持的编译框架,则需要 solc,Solidity 编译器;我们建议使用 solc-select 便于在不同 solc 版本之间切换。
使用Pip
python3 -m pip install slither-analyzer
使用Git
git clone https://github.com/crytic/slither.git && cd slither
python3 -m pip install .
如果您更喜欢通过 git 安装 Slither,我们建议使用 Python 虚拟环境,如开发者安装说明中所述。
使用Docker
使用 eth-security-toolbox
docker 镜像。它包含我们所有的安全工具和所有主要的 Solidity 版本。将 /home/share
挂载到容器中的 /share
。
docker pull trailofbits/eth-security-toolbox
在容器中共享目录
docker run -it -v /home/share:/share trailofbits/eth-security-toolbox
集成
- 对于 GitHub 动作集成,请使用 slither-action。
- 要生成 Markdown 报告,请使用
slither [目标] --checklist
。 - 要生成带有 GitHub 代码高亮的 Markdown,请使用
slither [目标] --checklist --markdown-root https://github.com/ORG/REPO/blob/COMMIT/
(替换ORG
、REPO
、COMMIT
)
检测器
编号 | 检测器 | 检测内容 | 影响 | 置信度 |
---|---|---|---|---|
1 | abiencoderv2-array |
存储 abiencoderv2 数组 | 高 | 高 |
2 | arbitrary-send-erc20 |
transferFrom 使用任意的 from |
高 | 高 |
3 | array-by-reference |
按值修改存储数组 | 高 | 高 |
4 | encode-packed-collision |
ABI 编码 Packed 冲突 | 高 | 高 |
5 | incorrect-shift |
移位指令中参数的顺序不正确。 | 高 | 高 |
6 | multiple-constructors |
多个构造函数方案 | 高 | 高 |
7 | name-reused |
合约的名称重复使用 | 高 | 高 |
8 | protected-vars |
检测到未受保护的变量 | 高 | 高 |
9 | public-mappings-nested |
带有嵌套变量的公共映射 | 高 | 高 |
10 | rtlo |
使用 Right-To-Left-Override 控制字符 | 高 | 高 |
11 | shadowing-state |
状态变量阴影 | 高 | 高 |
12 | suicidal |
允许任何人销毁合约的函数 | 高 | 高 |
13 | uninitialized-state |
未初始化的状态变量 | 高 | 高 |
14 | uninitialized-storage |
未初始化的存储变量 | 高 | 高 |
15 | unprotected-upgrade |
未受保护的升级合约 | 高 | 高 |
16 | codex |
使用 Codex 查找漏洞。 | 高 | 低 |
17 | arbitrary-send-erc20-permit |
transferFrom 使用 permit 的任意 from | 高 | 中等 |
18 | arbitrary-send-eth |
将以太币发送到任意目的地的函数 | 高 | 中等 |
19 | controlled-array-length |
污染的数组长度分配 | 高 | 中等 |
20 | controlled-delegatecall |
受控的 delegatecall 目标 | 高 | 中等 |
21 | delegatecall-loop |
在循环中使用 delegatecall 的可支付函数 |
高 | 中等 |
22 | incorrect-exp |
错误的指数运算 | 高 | 中等 |
23 | incorrect-return |
在汇编模式下不正确使用 return 。 |
高 | 中等 |
24 | msg-value-loop |
循环中的 msg.value | 高 | 中等 |
25 | reentrancy-eth |
重入漏洞(以太币盗窃) | 高 | 中等 |
26 | return-leave |
如果使用 return 而不是 leave 。 |
高 | 中等 |
27 | storage-array |
有符号存储整数数组编译器错误 | 高 | 中等 |
28 | unchecked-transfer |
未检查的代币转账 | 高 | 中等 |
29 | weak-prng |
弱伪随机数生成器 | 高 | 中等 |
30 | domain-separator-collision |
检测具有与 EIP-2612 的 DOMAIN_SEPARATOR() 签名冲突的函数的 ERC20 代币 | 中等 | 高 |
31 | enum-conversion |
检测危险的枚举转换 | 中等 | 高 |
32 | erc20-interface |
错误的 ERC20 接口 | 中等 | 高 |
33 | erc721-interface |
错误的 ERC721 接口 | 中等 | 高 |
34 | incorrect-equality |
危险的严格相等性 | 中等 | 高 |
35 | locked-ether |
锁定以太币的合约 | 中等 | 高 |
36 | mapping-deletion |
删除包含结构的映射 | 中等 | 高 |
37 | shadowing-abstract |
从抽象合约中遮蔽的状态变量 | 中等 | 高 |
38 | tautological-compare |
比较一个变量与自身,根据比较始终返回 true 或 false | 中等 | 高 |
39 | tautology |
重言式或矛盾 | 中等 | 高 |
40 | write-after-write |
未使用的写入 | 中等 | 高 |
41 | boolean-cst |
布尔常数的误用 | 中等 | 中等 |
42 | constant-function-asm |
使用汇编代码的常量函数 | 中等 | 中等 |
43 | constant-function-state |
改变状态的常量函数 | 中等 | 中等 |
44 | divide-before-multiply |
不精确的算术运算顺序 | 中等 | 中等 |
45 | out-of-order-retryable |
顺序重试交易 | 中等 | 中等 |
46 | reentrancy-no-eth |
重入漏洞(没有以太币盗窃) | 中等 | 中等 |
47 | reused-constructor |
重用基构造函数 | 中等 | 中等 |
48 | tx-origin |
危险的 tx.origin 使用 |
中等 | 中等 |
49 | unchecked-lowlevel |
未检查的低级调用 | 中等 | 中等 |
50 | unchecked-send |
未检查的发送 | 中等 | 中等 |
51 | uninitialized-local |
未初始化的局部变量 | 中等 | 中等 |
52 | unused-return |
未使用的返回值 | 中等 | 中等 |
53 | incorrect-modifier |
可能返回默认值的修饰符 | 低 | 高 |
54 | shadowing-builtin |
内置符号遮蔽 | 低 | 高 |
55 | shadowing-local |
局部变量遮蔽 | 低 | 高 |
56 | uninitialized-fptr-cst |
构造函数中未初始化的函数指针调用 | 低 | 高 |
57 | variable-scope |
在声明之前使用局部变量 | 低 | 高 |
58 | void-cst |
未实现调用的构造函数 | 低 | 高 |
59 | calls-loop |
循环中的多次调用 | 低 | 中等 |
60 | events-access |
缺少事件访问控制 | 低 | 中等 |
61 | events-maths |
缺少事件算术 | 低 | 中等 |
62 | incorrect-unary |
危险的算术表达式 | 低 | 中等 |
63 | missing-zero-check |
缺少零地址验证 | 低 | 中等 |
64 | reentrancy-benign |
良性的重入漏洞 | 低 | 中等 |
65 | reentrancy-events |
导致事件顺序错误的重入漏洞 | 低 | 中等 |
66 | return-bomb |
低级被调用者可能意外消耗所有调用者的气体。 | 低 | 中等 |
67 | timestamp |
危险的 block.timestamp 使用 |
低 | 中等 |
68 | assembly |
汇编使用 | 信息性 | 高 |
69 | assert-state-change |
断言状态变化 | 信息性 | 高 |
70 | boolean-equal |
与布尔常数的比较 | 信息性 | 高 |
71 | cyclomatic-complexity |
检测具有高(> 11)循环复杂度的函数 | 信息性 | 高 |
72 | deprecated-standards |
废弃的 Solidity 标准 | 信息性 | 高 |
73 | erc20-indexed |
未索引的 ERC20 事件参数 | 信息性 | 高 |
74 | function-init-state |
初始化状态变量的函数 | 信息性 | 高 |
75 | incorrect-using-for |
检测在给定库中没有匹配给定类型的函数时使用 using-for 语句 | 信息性 | 高 |
76 | low-level-calls |
低级调用 | 信息性 | 高 |
77 | missing-inheritance |
缺少继承 | 信息性 | 高 |
78 | naming-convention |
符合 Solidity 命名约定 | 信息性 | 高 |
79 | pragma |
如果使用了不同的 pragma 指令 | 信息性 | 高 |
80 | redundant-statements |
冗余语句 | 信息性 | 高 |
81 | solc-version |
不正确的 Solidity 版本 | 信息性 | 高 |
82 | unimplemented-functions |
未实现函数 | 信息性 | 高 |
83 | unused-import |
检测未使用的导入 | 信息性 | 高 |
84 | unused-state |
未使用的状态变量 | 信息性 | 高 |
85 | costly-loop |
循环中的昂贵操作 | 信息性 | 中等 |
86 | dead-code |
未使用的函数 | 信息性 | 中等 |
87 | reentrancy-unlimited-gas |
通过 send 和 transfer 导致的重入漏洞 | 信息性 | 中等 |
88 | 数字位数过多 |
符合数值表示最佳实践 | 信息性 | 中等 |
89 | 缓存数组长度 |
检测使用某些存储数组成员的长度作为循环条件的for 循环,并且没有修改它。 |
优化 | 高 |
90 | constable-states |
可以声明为常量的状态变量 | 优化 | 高 |
91 | external-function |
可以声明为外部公开的函数 | 优化 | 高 |
92 | immutable-states |
可以声明为不可变的状态变量 | 优化 | 高 |
93 | var-read-using-this |
合约使用this 读取其自身的变量 |
优化 | 高 |
更多信息,请参见
打印机
快速审查打印机
human-summary
: 打印合约的可读性摘要inheritance-graph
: 导出每个合约的继承图到dot文件contract-summary
: 打印合约的摘要loc
: 计算源文件(SRC)、依赖(DEP)和测试文件(TEST)中找到的总代码行数(LOC)、源代码行数(SLOC)和注释行数(CLOC)。
深度审查打印机
call-graph
: 导出合约的调用图到dot文件cfg
: 导出每个函数的控制流图(CFG)function-summary
: 打印函数的摘要vars-and-auth
: 打印被写入的状态变量和函数的授权not-pausable
: 打印未使用whenNotPaused
修饰符的函数。
要运行打印机,请使用--print
和以逗号分隔的打印机列表。
有关完整列表,请参阅打印机文档。
工具
slither-check-upgradeability
: 审查基于delegatecall
的升级性slither-prop
: 自动单元测试和属性生成slither-flat
: 展平代码库slither-check-erc
: 检查ERC的符合性slither-format
: 自动补丁生成slither-read-storage
: 从合约中读取存储值slither-interface
: 为合约生成接口
有关其他工具,请参阅工具文档。
联系我们以获得构建自定义工具的帮助。
API文档
Slither内部文档可在此处找到。
获取帮助
欢迎加入我们的Slack频道(#ethereum),获取使用或扩展Slither的帮助。
-
打印机文档描述了Slither可以为每个合约可视化的信息。
-
检测器文档描述了如何编写新的漏洞分析。
-
API文档描述了可用于自定义分析的方法和对象。
-
SlithIR文档(点击查看)描述了SlithIR中间表示。
常见问题解答
如何排除模拟或测试?
- 查看我们关于路径过滤的文档。
如何修复“未知文件”或编译问题?
- 由于Slither需要solc抽象语法树(AST),它必须具备所有依赖项。如果一个合约有依赖项,使用
slither contract.sol
将会失败。相反,在contracts/
的父目录中使用slither .
(当你运行ls
时应该看到contracts/
)。如果你有一个node_modules/
文件夹,它必须位于与contracts/
相同的目录中。为了验证这个问题是否与Slither相关,运行你正在使用的框架的编译命令,例如npx hardhat compile
。这必须成功;否则,Slither的编译引擎crytic-compile无法生成AST。
许可
Slither根据AGPLv3许可证授权和分发。如果您希望获得许可条款的例外,请联系我们(点击发送邮件)。
出版物
Trail of Bits 出版物
- Slither:智能合约的静态分析框架,作者:Josselin Feist, Gustavo Grieco, Alex Groce - WETSEB '19
外部出版物
标题 | 用法 | 作者 | 地点 | 代码 |
---|---|---|---|---|
ReJection:基于AST的重入漏洞检测方法 | 基于Slither的AST分析 | 作者:Rui Ma, Zefeng Jian, Guangyuan Chen, Ke Ma, Yujia Chen | CTCIS 19 | - |
MPro:结合静态和符号分析进行智能合约的可扩展测试 | 通过Slither利用数据依赖 | 作者:William Zhang, Sebastian Banescu, Leodardo Pasos, Steven Stewart, Vijay Ganesh | ISSRE 2019 | MPro |
ETHPLOIT:从模糊测试到针对智能合约的有效利用生成 | 通过Slither利用数据依赖 | 作者:Qingzhao Zhang, Yizhuo Wang, Juanru Li, Siqi Ma | SANER 20 | - |
基于模型检查的以太坊智能合约验证方法 | 基于Slither的CFG的符号执行 | 作者:Tam Bang, Hoang H Nguyen, Dung Nguyen, Toan Trieu, Tho Quan | IJMLC 20 | - |
智能合约修复 | 依靠Slither的漏洞检测器 | 作者:Xiao Liang Yu, Omar Al-Bataineh, David Lo, Abhik Roychoudhury | TOSEM 20 | SCRepair |
揭秘智能合约中的循环 | 通过Slither利用数据依赖 | 作者:Ben Mariano, Yanju Chen, Yu Feng, Shuvendu Lahiri, Isil Dillig | ASE 20 | - |
智能合约中循环的基于跟踪的动态气消耗估计 | 使用Slither的CFG检测循环 | 作者:Chunmiao Li, Shijie Nie, Yang Cao, Yijun Yu, Zhenjiang Hu | IEEE Open J. Comput. Soc. 1 (2020) | - |
SAILFISH:在几秒钟内检查智能合约状态不一致错误 | 依靠SlithIR构建存储依赖图 | 作者:Priyanka Bose, Dipanjan Das, Yanju Chen, Yu Feng, Christopher Kruegel, and Giovanni Vigna | S&P 22 | Sailfish |
SolType:Solidity中算术溢出的细化类型 | 将Slither作为前端构建细化类型系统 | 作者:Bryan Tan, Benjamin Mariano, Shuvendu K. Lahiri, Isil Dillig, Yu Feng | POPL 22 | - |
不要踩我:利用机器学习技术进行自动诈骗检测 | 使用Slither提取代币的特征(可铸币、可暂停等) | 作者:Mazorra, Bruno, Victor Adan, and Vanesa Daza | Mathematics 10.6 (2022) | - |
MANDO:用于细粒度检测智能合约漏洞的多级异构图嵌入 | 使用Slither提取CFG和调用图 | 作者:Hoang Nguyen, Nhat-Minh Nguyen, Chunyao Xie, Zahra Ahmadi, Daniel Kudendo, Thanh-Nam Doan and Lingxiao Jiang | IEEE 9th International Conference on Data Science and Advanced Analytics (DSAA, 2022) | ge-sc |
自动审计智能合约中的价格操纵TOD漏洞 | 使用Slither提取CFG和数据依赖 | 穆罕默德·贝拉哈利,埃里克·基尔蒂,克里希蒂·内拉图鲁,安德烈亚斯·韦纳里斯,和范龙 | 2022年IEEE区块链与加密货币国际会议(ICBC) | 智能合约修复 |
建模和执行智能合约访问控制策略 | 扩展Slither的数据依赖 | Jan-Philipp Toberg,Jonas Schiffl,Frederik Reiche,Bernhard Beckert,Robert Heinrich,Ralf Reussner | IEEE分布式应用与基础设施国际会议(DAPPS),2022 | Solidity访问控制执行 |
基于深度学习和多模态决策融合的智能合约漏洞检测 | 使用Slither提取CFG | 邓伟,魏焕春,黄腾,曹聪,彭云,和胡璇 | Sensors 2023,23,7246 | - |
语义增强代码知识图谱揭示智能合约代码重用中的未知信息 | 使用Slither提取代码特征(CFG,函数,参数类型等) | 黄青,廖点殊,邢振长,左正刚,王长京,夏欣 | ACM软件工程与方法学交易,2023 | - |
支持细粒度状态访问的智能合约并行执行 | 使用Slither构建状态访问图 | 齐晓东,焦焦,李毅 | 国际分布式计算系统会议(ICDCS),2023 | - |
坏苹果:理解去中心化生态系统中的集中式安全风险 | 在Slither之上实施内部分析 | 颜凯伦,张丽娟,刘翔宇,赵文瑞,郭山庆 | ACM网络会议四月2023 | - |
使用区间分析识别智能合约中的漏洞 | 在Slither之上创建4个检测器 | Ştefan-Claudiu Susan,Andrei Arusoaie | FROM 2023 | - |
以太坊区块链智能合约存储状态分析和提取(无开放获取PDF) | 依赖Slither的CFG和AST | 马哈·阿尤布,塔尼亚·赛勒姆,穆罕默德·贾努阿,塔拉·阿赫马德 | TOSEM 2023 | SmartMuv |
如果您在学术工作中使用Slither,请考虑申请Crytic $10k研究奖。
项目详情
下载文件
下载您平台上的文件。如果您不确定要选择哪个,请了解更多关于安装包的信息。
源分布
构建分布版
slither_analyzer-0.10.4.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | bb89945509c7c1d461db2af1bfd85a7a02878334050e23aefc88d65568783a32 |
|
MD5 | 3d400b54565375354d2c15222adc11c1 |
|
BLAKE2b-256 | ee64ebefdb4d633754013cafe1e8c28c04722ff49d5bdd98b6393dcd50f35428 |
slither_analyzer-0.10.4-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 344745d885c8d883b78616622c3b443a56cab4022e09c475a3f570358cf24a14 |
|
MD5 | 7a34d34bcbc7ee60f810d411178b224d |
|
BLAKE2b-256 | 017d9f1e0584716106daaca1ac8f80180b274dd68c6e89e8a854ba99cacd0dec |