加入 Empire Hacking Slack
<sub><i>- 讨论和支持 </i></sub>
Slither 是一个用 Python3 编写的 Solidity 和 Vyper 静态分析框架。它运行一套漏洞检测器,打印合约细节的可视化信息,并提供 API 以便轻松编写自定义分析。Slither 使开发者能够发现漏洞、增强代码理解,并快速原型化自定义分析。
在 Hardhat/Foundry/Dapp/Brownie 应用程序上运行 Slither:
slither .
如果您的项目有依赖项,这是首选选项,因为 Slither 依赖于底层编译框架来编译源代码。
然而,您可以在不导入依赖项的单个文件上运行 Slither:
slither tests/uninitialized.sol
注意 <br /> 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
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 encodePacked 冲突 | 高 | 高 |
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 | 向任意目标发送以太币的函数 | 高 | 中 |
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 | 将变量与自身比较总是返回真或假,取决于比较方式 | 中 | 高 |
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 |