加入帝国黑客 Slack
- 讨论和支持
Slither是一个用 Python3 编写的 Solidity & Vyper 静态分析框架。它运行一套漏洞检测器,打印有关合同详细信息的可视化信息,并提供一个 API 来轻松编写自定义分析。 Slither 使开发人员能够发现漏洞、增强代码理解力并快速构建自定义分析原型。
在 Hardhat/Foundry/Dapp/Brownie 应用程序上运行 Slither:
slither .
如果您的项目具有依赖项,那么这是首选选项,因为 Slither 依赖底层编译框架来编译源代码。
但是,您可以在不导入依赖项的单个文件上运行 Slither:
slither tests/uninitialized.sol
笔记
Slither 需要 Python 3.8+。如果您不打算使用受支持的编译框架之一,则需要 solc(Solidity 编译器);我们建议使用 solc-select 来方便地在 solc 版本之间切换。
python3 -m pip install slither-analyzer
git clone https://github.com/crytic/slither.git && cd slither
python3 -m pip install .
如果您更喜欢通过 git 安装 Slither,我们建议使用 Python 虚拟环境,如开发人员安装说明中详述。
使用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
$GIT_TAG
替换为真实标签) - repo : https://github.com/crytic/slither
rev : $GIT_TAG
hooks :
- id : slither
slither [target] --checklist
。slither [target] --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 编码打包碰撞 | 高的 | 高的 |
5 | incorrect-shift | 移位指令中的参数顺序不正确。 | 高的 | 高的 |
6 | multiple-constructors | 多种构造方案 | 高的 | 高的 |
7 | name-reused | 合同名称重复使用 | 高的 | 高的 |
8 | protected-vars | 检测到未受保护的变量 | 高的 | 高的 |
9 | public-mappings-nested | 具有嵌套变量的公共映射 | 高的 | 高的 |
10 | rtlo | 使用从右到左覆盖控制字符 | 高的 | 高的 |
11 | shadowing-state | 状态变量遮蔽 | 高的 | 高的 |
12 | suicidal | 允许任何人破坏合约的功能 | 高的 | 高的 |
13 | uninitialized-state | 未初始化的状态变量 | 高的 | 高的 |
14 | uninitialized-storage | 未初始化的存储变量 | 高的 | 高的 |
15 | unprotected-upgrade | 不受保护的可升级合约 | 高的 | 高的 |
16 | codex | 使用 Codex 查找漏洞。 | 高的 | 低的 |
17 号 | arbitrary-send-erc20-permit | TransferFrom 使用任意 from 并获得许可 | 高的 | 中等的 |
18 | arbitrary-send-eth | 将 Ether 发送到任意目的地的函数 | 高的 | 中等的 |
19 | controlled-array-length | 受污染的数组长度分配 | 高的 | 中等的 |
20 | controlled-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 | 弱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 | 低级别的被调用者可能会意外消耗所有调用者的gas。 | 低的 | 中等的 |
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 | 如果使用不同的编译指令 | 信息性 | 高的 |
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 | 通过发送和传输的重入漏洞 | 信息性 | 中等的 |
88 | too-many-digits | 符合数字表示法最佳实践 | 信息性 | 中等的 |
89 | cache-array-length | 检测在循环条件中使用某些存储数组的length 成员的for 循环,并且不修改它。 | 优化 | 高的 |
90 | constable-states | 可以声明为常量的状态变量 | 优化 | 高的 |
91 | external-function | 可以声明为外部的公共函数 | 优化 | 高的 |
92 | immutable-states | 可以声明为不可变的状态变量 | 优化 | 高的 |
93 | var-read-using-this | 合约使用this 读取它自己的变量 | 优化 | 高的 |
有关更多信息,请参阅
human-summary
:打印人类可读的合约摘要inheritance-graph
:将每个合约的继承图导出到点文件contract-summary
:打印合同摘要loc
:计算在源文件 (SRC)、依赖项 (DEP) 和测试文件 (TEST) 中找到的代码总行数 (LOC)、源代码行数 (SLOC) 和注释代码行数 (CLOC)。call-graph
:将合约的调用图导出到点文件cfg
: 导出各个功能的CFGfunction-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
:为合约生成接口有关其他工具,请参阅工具文档。
联系我们获取构建自定义工具的帮助。
有关 Slither 内部结构的文档可在此处获取。
请随时访问我们的 Slack 频道 (#ethereum),寻求使用或扩展 Slither 的帮助。
Printer 文档描述了 Slither 能够为每个合同可视化的信息。
检测器文档描述了如何编写新的漏洞分析。
API 文档描述了可用于自定义分析的方法和对象。
SlithIR 文档描述了 SlithIR 中间表示形式。
如何排除模拟或测试?
如何解决“未知文件”或编译问题?
slither contract.sol
将失败。相反,请使用slither .
在contracts/
的父目录中(当您运行ls
时,您应该看到contracts/
)。如果您有node_modules/
文件夹,它必须与contracts/
位于同一目录中。要验证此问题是否与 slither 有关,请运行您正在使用的框架的编译命令,例如npx hardhat compile
。这一定会成功;否则,slither 的编译引擎crytic-compile 无法生成AST。 Slither 根据 AGPLv3 许可证进行许可和分发。如果您正在寻找条款的例外情况,请联系我们。
标题 | 用法 | 作者 | 场地 | 代码 |
---|---|---|---|---|
Rejection:一种基于 AST 的重入漏洞检测方法 | 建立在 Slither 之上的基于 AST 的分析 | 马锐、简泽峰、陈光远、马柯、陈雨佳 | CTCIS 19 | - |
MPro:结合静态和符号分析进行智能合约的可扩展测试 | 通过 Slither 利用数据依赖性 | 张威廉、塞巴斯蒂安·巴内斯库、莱奥达尔多·帕索斯、史蒂文·斯图尔特、维杰·加内什 | 2019年国际安全工程师学会 | 米普罗 |
ETHPLOIT:从模糊测试到针对智能合约的高效漏洞利用生成 | 通过 Slither 利用数据依赖性 | 张清照、王一卓、李娟如、马思琪 | 萨纳尔20 | - |
以太坊智能合约的验证:一种模型检查方法 | 建立在 Slither CFG 之上的符号执行 | Tam Bang、Hoang H Nguyen、Dung Nguyen、Toan Trieu、Tho Quan | IJMLC 20 | - |
智能合约修复 | 依靠 Slither 的漏洞检测器 | 余晓亮、奥马尔·巴泰奈、大卫·罗、阿比克·罗乔杜里 | 托森20 | SC修复 |
揭秘智能合约中的循环 | 通过 Slither 利用数据依赖性 | Ben Mariano、Yanju Chen、Yu Feng、Shuvendu Lahiri、Isil Dillig | 日月光20 | - |
智能合约中基于轨迹的动态气体循环估计 | 使用Slither的CFG来检测环路 | 李春苗、聂士杰、曹阳、于宜君、胡镇江 | IEEE 开放 J. 计算。苏克。 1 (2020) | - |
SAILFISH:在几秒钟内审查智能合约状态不一致的错误 | 依靠SlithIR构建存储依赖图 | Priyanka Bose、Dipanjan Das、Yanju Chen、Yu Feng、Christopher Kruegel 和 Giovanni Vigna | 标准普尔 22 指数 | 旗鱼 |
SolType:Solidity 中算术溢出的细化类型 | 使用Slither作为前端构建细化类型系统 | Bryan Tan、Benjamin Mariano、Shuvendu K. Lahiri、Isil Dillig、Yu Feng | 流行性感冒22 | - |
不要欺负我:利用机器学习技术进行自动诈骗检测 | 使用 Slither 提取代币的特征(可铸造,可暂停,..) | 马索拉、布鲁诺、维克多·亚当和凡妮莎·达萨 | 数学10.6(2022) | - |
MANDO:用于细粒度检测智能合约漏洞的多级异构图嵌入 | 使用Slither提取CFG和调用图 | Hoang Nguyen、Nhat-Minh Nguyen、Chunyao Xie、Zahra Ahmadi、Daniel Kudendo、Thanh-Nam Doan 和 Lingxiao Jiang | IEEE 第九届数据科学和高级分析国际会议(DSAA,2022) | ge-sc |
自动审计智能合约中的哄抬物价 TOD 漏洞 | 使用Slither提取CFG和数据依赖关系 | Sidi Mohamed Beillahi、Eric Keilty、Keerthi Nelaturu、Andreas Veneris 和 Fan Long | 2022 年 IEEE 区块链和加密货币国际会议 (ICBC) | 智能合约修复 |
智能合约的建模和执行访问控制策略 | 扩展 Slither 的数据依赖性 | 扬·菲利普·托伯格、乔纳斯·希弗、弗雷德里克·赖什、伯恩哈德·贝克特、罗伯特·海因里希、拉尔夫·雷斯纳 | IEEE 去中心化应用和基础设施国际会议 (DAPPS),2022 年 | Solidity访问控制执行 |
基于深度学习和多模态决策融合的智能合约漏洞检测 | 使用 Slither 提取 CFG | 邓伟初、魏焕春、黄腾、曹聪、彭云、胡轩 | 传感器 2023, 23, 7246 | - |
语义丰富的代码知识图揭示智能合约代码重用中的未知数 | 使用 Slither 提取代码特征(CFG、函数、参数类型等) | 黄庆、廖殿书、邢振昌、左正康、王昌静、夏欣 | ACM 软件工程和方法学汇刊,2023 年 | - |
具有细粒度状态访问的智能合约并行执行 | 使用 Slither 构建状态访问图 | 齐晓东、娇娇、李毅 | 分布式计算系统国际会议 (ICDCS),2023 年 | - |
坏苹果:了解去中心化生态系统中的中心化安全风险 | 在 Slither 之上实施内部分析 | 严凯伦、张吉连、刘翔宇、刁文瑞、郭善庆 | ACM 网络会议 2023 年 4 月 | - |
使用区间分析识别智能合约中的漏洞 | 在 Slither 顶部创建 4 个探测器 | Ştefan-Claudiu Susan、安德烈·阿鲁索耶 | 2023 年起 | - |
以太坊区块链智能合约的存储状态分析和提取(开放获取中没有 PDF) | 信赖 Slither 的 CFG 和 AST | Maha Ayub、Tania Saleem、Muhammad Janjua、Talha Ahmad | 2023年TOSEM | 智能Muv |
如果您在学术工作中使用 Slither,请考虑申请 Crytic 10k 美元研究奖。