加入帝國駭客 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 美元研究獎。