跳转到主要内容

Slither是使用Python 3编写的Solidity和Vyper静态分析框架。

项目描述

Slither,智能合约静态分析器

Slither Static Analysis Framework Logo

Build Status PyPI Slither - Read the Docs Slither - Wiki

加入帝国黑客Slack

Slack Status

- 讨论和支持

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/(替换 ORGREPOCOMMIT

检测器

编号 检测器 检测内容 影响 置信度
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读取其自身的变量 优化

更多信息,请参见

打印机

快速审查打印机

深度审查打印机

要运行打印机,请使用--print和以逗号分隔的打印机列表。

有关完整列表,请参阅打印机文档

工具

有关其他工具,请参阅工具文档

联系我们以获得构建自定义工具的帮助。

API文档

Slither内部文档可在此处找到。

获取帮助

欢迎加入我们的Slack频道(#ethereum),获取使用或扩展Slither的帮助。

常见问题解答

如何排除模拟或测试?

如何修复“未知文件”或编译问题?

  • 由于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 出版物

外部出版物

标题 用法 作者 地点 代码
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 (569.3 kB 查看哈希值

上传于 源代码

构建分布版

slither_analyzer-0.10.4-py3-none-any.whl (796.9 kB 查看哈希值)

上传于 Python 3

由以下支持