
Статический анализатор для Solidity и Vyper
Присоединяйтесь к Slack-каналу Empire Hacking
- Обсуждения и поддержка
Slither — это фреймворк статического анализа для Solidity и Vyper, написанный на Python3. Он запускает набор детекторов уязвимостей, выводит визуальную информацию о деталях контрактов и предоставляет API для простого написания собственных анализов. Slither позволяет разработчикам находить уязвимости, улучшать понимание кода и быстро прототипировать собственные анализы.
Запустите Slither в приложении Hardhat/Foundry/Dapp/Brownie:```console slither .
Это предпочтительный вариант, если ваш проект имеет зависимости, поскольку Slither полагается на базовый фреймворк компиляции для компиляции исходного кода.
Однако вы можете запустить Slither на одном файле, который не импортирует зависимости:```console
slither tests/uninitialized.sol
Примечание Slither требует Python 3.10+. Если вы не собираетесь использовать один из поддерживаемых фреймворков сборки, вам потребуется solc, компилятор Solidity; мы рекомендуем использовать solc-select для удобного переключения между версиями solc.
uv — это быстрый менеджер пакетов Python, который в 10-100 раз быстрее pip.```console
curl -LsSf https://astral.sh/uv/install.sh | sh
uv tool install slither-analyzer
uvx --from slither-analyzer slither
Для обновления:```console
uv tool upgrade slither-analyzer
python3 -m pip install slither-analyzer
Для обновления:```console
python3 -m pip install --upgrade slither-analyzer
brew install slither-analyzer
### Использование Git (Разработка)```bash
git clone https://github.com/crytic/slither.git && cd slither
# Install as editable for development
uv tool install -e .
# Or use uv run for testing without installation
uv run slither <target>
Флаг -e устанавливает в редактируемый режим, то есть изменения в исходном коде немедленно отражаются без переустановки.
Используйте образ Docker eth-security-toolbox. Он включает все наши инструменты безопасности и все основные версии Solidity в одном образе. /home/share будет смонтирован в /share внутри контейнера.```bash
docker pull trailofbits/eth-security-toolbox
Чтобы предоставить общий доступ к каталогу в контейнере:```bash
docker run -it -v /home/share:/share trailofbits/eth-security-toolbox
$GIT_TAG на реальный тег) ```YAML
slither [target] --checklist.slither [target] --checklist --markdown-root https://github.com/ORG/REPO/blob/COMMIT/ (замените ORG, REPO, COMMIT)| Номер | Детектор | Что он обнаруживает | Влияние | Уверенность |
|---|---|---|---|---|
| 1 | abiencoderv2-array | Массив abiencoderv2 в хранилище | High | High |
| 2 | arbitrary-send-erc20 | transferFrom использует произвольный from | High | High |
| 3 | array-by-reference | Изменение массива хранилища по значению | High | High |
| 4 | encode-packed-collision | Коллизия ABI encodePacked | High | High |
| 5 | incorrect-shift | Порядок параметров в инструкции сдвига неверен. | High | High |
| 6 | multiple-constructors | Несколько схем конструкторов | High | High |
| 7 | name-reused | Повторное использование имени контракта | High | High |
| 8 | protected-vars | Обнаружены незащищённые переменные | High | High |
| 9 | public-mappings-nested | Публичные отображения с вложенными переменными |
Для получения дополнительной информации см.
human-summary: Вывести удобочитаемую сводку по контрактамinheritance-graph: Экспортировать граф наследования каждого контракта в dot-файлcontract-summary: Вывести сводку по контрактамloc: Подсчитать общее количество строк кода (LOC), исходных строк кода (SLOC) и строк комментариев (CLOC) в исходных файлах (SRC), зависимостях (DEP) и тестовых файлах (TEST).entry-points: Вывести все изменяющие состояние точки входа и их переменные контрактовcall-graph: Экспортировать граф вызовов контрактов в dot-файлcfg: Экспортировать CFG каждой функцииfunction-summary: Вывести сводку по функциямvars-and-auth: Вывести записываемые переменные состояния и авторизацию функцийnot-pausable: Вывести функции, не использующие модификатор whenNotPaused.Для запуска принтера используйте --print и список принтеров, разделённых запятыми.
См. документацию принтера для полного списка.
slither-check-upgradeability: Проверить обновляемость на основе delegatecallslither-prop: Автоматическая генерация юнит-тестов и свойствslither-flat: Свести код в один файлslither-check-erc: Проверить соответствие стандарту ERCslither-read-storage: Чтение значений хранилища из контрактовslither-interface: Создать интерфейс для контрактаСм. документацию по инструментам для дополнительных инструментов.
Свяжитесь с нами, чтобы получить помощь в создании собственных инструментов.
Документация по внутренностям Slither доступна здесь.
Не стесняйтесь заглянуть в наш Slack-канал (#ethereum) для получения помощи по использованию или расширению Slither.
Документация принтера описывает информацию, которую Slither может визуализировать для каждого контракта.
Документация детектора описывает, как написать новый анализ уязвимостей.
Документация API описывает методы и объекты, доступные для пользовательского анализа.
Документация SlithIR описывает промежуточное представление SlithIR.
Как исключить моки или тесты?
Как исправить ошибки «unknown file» или проблемы компиляции?
slither contract.sol завершится ошибкой. Вместо этого используйте slither . в родительской директории contracts/ (вы должны увидеть contracts/ при выполнении ls). Если у вас есть папка node_modules/, она должна находиться в той же директории, что и contracts/. Чтобы убедиться, что проблема связана с slither, выполните команду компиляции для используемой вами платформы, например npx hardhat compile. Это должно успешно работать; в противном случае механизм компиляции slither, crytic-compile, не сможет сгенерировать AST.Slither распространяется под лицензией AGPLv3. Свяжитесь с нами, если вам нужно исключение из условий.
| Название | Использование | Авторы | Издание | Код |
|---|---|---|---|---|
| ReJection: A AST-Based Reentrancy Vulnerability Detection Method | AST-анализ, построенный на основе Slither | Rui Ma, Zefeng Jian, Guangyuan Chen, Ke Ma, Yujia Chen | CTCIS 19 | - |
| MPro: Combining Static and Symbolic Analysis for Scalable Testing of Smart Contract | Использование зависимостей данных через Slither | William Zhang, Sebastian Banescu, Leodardo Pasos, Steven Stewart, Vijay Ganesh | ISSRE 2019 | MPro |
| ETHPLOIT: From Fuzzing to Efficient Exploit Generation against Smart Contracts | Использование зависимостей данных через Slither | Qingzhao Zhang, Yizhuo Wang, Juanru Li, Siqi Ma | SANER 20 | - |
| Verification of Ethereum Smart Contracts: A Model Checking Approach | Символическое выполнение на основе CFG от Slither | Tam Bang, Hoang H Nguyen, Dung Nguyen, Toan Trieu, Tho Quan | IJMLC 20 | - |
| Smart Contract Repair | Использование детекторов уязвимостей Slither | Xiao Liang Yu, Omar Al-Bataineh, David Lo, Abhik Roychoudhury | TOSEM 20 | SCRepair |
| Demystifying Loops in Smart Contracts | Использование зависимостей данных через Slither | Ben Mariano, Yanju Chen, Yu Feng, Shuvendu Lahiri, Isil Dillig | ASE 20 | - |
| Trace-Based Dynamic Gas Estimation of Loops in Smart Contracts | Использование CFG от Slither для обнаружения циклов | Chunmiao Li, Shijie Nie, Yang Cao, Yijun Yu, Zhenjiang Hu | IEEE Open J. Comput. Soc. 1 (2020) | - |
| SAILFISH: Vetting Smart Contract State-Inconsistency Bugs in Seconds |
Если вы используете Slither в академической работе, рассмотрите возможность подачи заявки на Crytic $10k Research Prize.
| High |
| High |
| 10 | rtlo | Используется управляющий символ «справа налево» | High | High |
| 11 | shadowing-state | Затенение переменных состояния | High | High |
| 12 | suicidal | Функции, позволяющие любому уничтожить контракт | High | High |
| 13 | uninitialized-state | Неинициализированные переменные состояния | High | High |
| 14 | uninitialized-storage | Неинициализированные переменные хранилища | High | High |
| 15 | unprotected-upgrade | Незащищённый обновляемый контракт | High | High |
| 16 | arbitrary-send-erc20-permit | transferFrom использует произвольный from с permit | High | Medium |
| 17 | arbitrary-send-eth | Функции, отправляющие Ether произвольным адресам | High | Medium |
| 18 | controlled-array-length | Присвоение заражённой длины массива | High | Medium |
| 19 | controlled-delegatecall | Контролируемый получатель delegatecall | High | Medium |
| 20 | delegatecall-loop | Платные функции, использующие delegatecall внутри цикла | High | Medium |
| 21 | incorrect-exp | Некорректное возведение в степень | High | Medium |
| 22 | incorrect-return | Если return неправильно используется в режиме ассемблера. | High | Medium |
| 23 | msg-value-loop | msg.value внутри цикла | High | Medium |
| 24 | reentrancy-eth | Уязвимости повторного входа (хищение эфиров) | High | Medium |
| 25 | reentrancy-balance | Уязвимости повторного входа, приводящие к устаревшим проверкам баланса | High | Medium |
| 26 | return-leave | Если return используется вместо leave. | High | Medium |
| 27 | storage-array | Ошибка компилятора для массива целых чисел со знаком в хранилище | High | Medium |
| 28 | unchecked-transfer | Непроверенный перевод токенов | High | Medium |
| 29 | weak-prng | Слабый ГПСЧ | High | Medium |
| 30 | domain-separator-collision | Обнаруживает токены ERC20, у которых есть функция, сигнатура которой совпадает с DOMAIN_SEPARATOR() из EIP-2612 | Medium | High |
| 31 | enum-conversion | Обнаруживает опасное преобразование перечисления | Medium | High |
| 32 | erc20-interface | Некорректные интерфейсы ERC20 | Medium | High |
| 33 | erc721-interface | Некорректные интерфейсы ERC721 | Medium | High |
| 34 | incorrect-equality | Опасные строгие равенства | Medium | High |
| 35 | locked-ether | Контракты, которые блокируют эфир | Medium | High |
| 36 | mapping-deletion | Удаление по отображению, содержащему структуру | Medium | High |
| 37 | pyth-deprecated-functions | Обнаруживает устаревшие функции Pyth | Medium | High |
| 38 | pyth-unchecked-confidence | Обнаруживает, когда не проверяется уровень уверенности цены Pyth | Medium | High |
| 39 | pyth-unchecked-publishtime | Обнаруживает, когда не проверяется publishTime цены Pyth | Medium | High |
| 40 | shadowing-abstract | Затенение переменных состояния из абстрактных контрактов | Medium | High |
| 41 | tautological-compare | Сравнение переменной с самой собой всегда возвращает true или false в зависимости от сравнения | Medium | High |
| 42 | tautology | Тавтология или противоречие | Medium | High |
| 43 | write-after-write | Неиспользуемая запись | Medium | High |
| 44 | boolean-cst | Неправильное использование логической константы | Medium | Medium |
| 45 | chronicle-unchecked-price | Обнаруживает, когда не проверяется цена Chronicle. | Medium | Medium |
| 46 | constant-function-asm | Константные функции, использующие ассемблерный код | Medium | Medium |
| 47 | constant-function-state | Константные функции, изменяющие состояние | Medium | Medium |
| 48 | divide-before-multiply | Неточный порядок арифметических операций | Medium | Medium |
| 49 | gelato-unprotected-randomness | Вызов _requestRandomness в незащищённой функции | Medium | Medium |
| 50 | out-of-order-retryable | Транзакции retryable с нарушением порядка | Medium | Medium |
| 51 | reentrancy-no-eth | Уязвимости повторного входа (без хищения эфиров) | Medium | Medium |
| 52 | reused-constructor | Повторно используемый базовый конструктор | Medium | Medium |
| 53 | tx-origin | Опасное использование tx.origin | Medium | Medium |
| 54 | unchecked-lowlevel | Непроверенные низкоуровневые вызовы | Medium | Medium |
| 55 | unchecked-send | Непроверенная отправка | Medium | Medium |
| 56 | uninitialized-local | Неинициализированные локальные переменные | Medium | Medium |
| 57 | unused-return | Неиспользуемые возвращаемые значения | Medium | Medium |
| 58 | chainlink-feed-registry | Обнаруживает использование реестра фидов Chainlink | Low | High |
| 59 | incorrect-modifier | Модификаторы, которые могут возвращать значение по умолчанию | Low | High |
| 60 | optimism-deprecation | Обнаруживает использование устаревших predeploy или функций Optimism. | Low | High |
| 61 | shadowing-builtin | Затенение встроенных символов | Low | High |
| 62 | shadowing-local | Затенение локальных переменных | Low | High |
| 63 | uninitialized-fptr-cst | Вызов неинициализированных указателей на функции в конструкторах | Low | High |
| 64 | variable-scope | Локальные переменные, используемые до их объявления | Low | High |
| 65 | void-cst | Вызов конструктора, который не реализован | Low | High |
| 66 | calls-loop | Множественные вызовы в цикле | Low | Medium |
| 67 | events-access | Отсутствие событий контроля доступа | Low | Medium |
| 68 | events-maths | Отсутствие событий арифметики | Low | Medium |
| 69 | incorrect-unary | Опасные унарные выражения | Low | Medium |
| 70 | missing-zero-check | Отсутствие проверки нулевого адреса | Low | Medium |
| 71 | reentrancy-benign | Безвредные уязвимости повторного входа | Low | Medium |
| 72 | reentrancy-events | Уязвимости повторного входа, приводящие к событиям в неправильном порядке | Low | Medium |
| 73 | return-bomb | Низкоуровневый вызываемый код может неожиданно израсходовать весь газ вызывающего. | Low | Medium |
| 74 | timestamp | Опасное использование block.timestamp | Low | Medium |
| 75 | assembly | Использование ассемблера | Informational | High |
| 76 | assert-state-change | Изменение состояния в assert | Informational | High |
| 77 | boolean-equal | Сравнение с логической константой | Informational | High |
| 78 | cyclomatic-complexity | Обнаруживает функции с высокой (> 11) цикломатической сложностью | Informational | High |
| 79 | deprecated-standards | Устаревшие стандарты Solidity | Informational | High |
| 80 | erc20-indexed | Неиндексированные параметры событий ERC20 | Informational | High |
| 81 | function-init-state | Функция, инициализирующая переменные состояния | Informational | High |
| 82 | incorrect-using-for | Обнаруживает использование оператора using-for, когда ни одна функция из данной библиотеки не соответствует данному типу | Informational | High |
| 83 | low-level-calls | Низкоуровневые вызовы | Informational | High |
| 84 | missing-inheritance | Отсутствие наследования | Informational | High |
| 85 | naming-convention | Соответствие соглашениям об именах Solidity | Informational | High |
| 86 | pragma | Если используются разные директивы pragma | Informational | High |
| 87 | redundant-statements | Избыточные операторы | Informational | High |
| 88 | solc-version | Некорректная версия Solidity | Informational | High |
| 89 | unimplemented-functions | Нереализованные функции | Informational | High |
| 90 | unindexed-event-address | События с параметрами address, но без индексированных параметров | Informational | High |
| 91 | unused-state | Неиспользуемые переменные состояния | Informational | High |
| 92 | costly-loop | Дорогостоящие операции в цикле | Informational | Medium |
| 93 | dead-code | Функции, которые не используются | Informational | Medium |
| 94 | reentrancy-unlimited-gas | Уязвимости повторного входа через send и transfer | Informational | Medium |
| 95 | too-many-digits | Соответствие лучшим практикам числовой нотации | Informational | Medium |
| 96 | cache-array-length | Обнаруживает циклы for, которые используют член length некоторого массива хранилища в условии цикла и не изменяют его. | Optimization | High |
| 97 | constable-states | Переменные состояния, которые можно объявить константами | Optimization | High |
| 98 | external-function | Публичная функция, которую можно объявить внешней | Optimization | High |
| 99 | immutable-states | Переменные состояния, которые можно объявить неизменяемыми | Optimization | High |
| 100 | var-read-using-this | Контракт читает свою собственную переменную, используя this | Optimization | High |
| Использование SlithIR для построения графа зависимостей хранилища |
| Priyanka Bose, Dipanjan Das, Yanju Chen, Yu Feng, Christopher Kruegel, and Giovanni Vigna |
| S&P 22 |
| Sailfish |
| SolType: Refinement Types for Arithmetic Overflow in Solidity | Использование Slither в качестве интерфейса для построения системы уточнённых типов | Bryan Tan, Benjamin Mariano, Shuvendu K. Lahiri, Isil Dillig, Yu Feng | POPL 22 | - |
| Do Not Rug on Me: Leveraging Machine Learning Techniques for Automated Scam Detection | Использование Slither для извлечения характеристик токенов (mintable, pausable, ..) | Mazorra, Bruno, Victor Adan, and Vanesa Daza | Mathematics 10.6 (2022) | - |
| MANDO: Multi-Level Heterogeneous Graph Embeddings for Fine-Grained Detection of Smart Contract Vulnerabilities | Использование 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 |
| Automated Auditing of Price Gouging TOD Vulnerabilities in Smart Contracts | Использование Slither для извлечения CFG и зависимостей данных | Sidi Mohamed Beillahi, Eric Keilty, Keerthi Nelaturu, Andreas Veneris, and Fan Long | 2022 IEEE International Conference on Blockchain and Cryptocurrency (ICBC) | Smart-Contract-Repair |
| Modeling and Enforcing Access Control Policies for Smart Contracts | Расширение зависимостей данных Slither | Jan-Philipp Toberg, Jonas Schiffl, Frederik Reiche, Bernhard Beckert, Robert Heinrich, Ralf Reussner | IEEE International Conference on Decentralized Applications and Infrastructures (DAPPS), 2022 | SolidityAccessControlEnforcement |
| Smart Contract Vulnerability Detection Based on Deep Learning and Multimodal Decision Fusion | Использование Slither для извлечения CFG | Weichu Deng, Huanchun Wei, Teng Huang, Cong Cao, Yun Peng, and Xuan Hu | Sensors 2023, 23, 7246 | - |
| Semantic-enriched Code Knowledge Graph to Reveal Unknowns in Smart Contract Code Reuse | Использование Slither для извлечения характеристик кода (CFG, функция, типы параметров, ..) | Qing Huang, Dianshu Liao, Zhenchang Xing, Zhengkang Zuo, Changjing Wang, Xin Xia | ACM Transactions on Software Engineering and Methodology, 2023 | - |
| Smart Contract Parallel Execution with Fine-Grained State Accesses | Использование Slither для построения графов доступа к состоянию | Xiaodong Qi, Jiao Jiao, Yi Li | International Conference on Distributed Computing Systems (ICDCS), 2023 | - |
| Bad Apples: Understanding the Centralized Security Risks in Decentralized Ecosystems | Реализация внутреннего анализа на основе Slither | Kailun Yan , Jilian Zhang , Xiangyu Liu , Wenrui Diao , Shanqing Guo | ACM Web Conference April 2023 | - |
| Identifying Vulnerabilities in Smart Contracts using Interval Analysis | Создание 4 детекторов на основе Slither | Ştefan-Claudiu Susan, Andrei Arusoaie | FROM 2023 | - |
| Storage State Analysis and Extraction of Ethereum Blockchain Smart Contracts (нет открытого доступа к PDF) | Использование CFG и AST от Slither | Maha Ayub , Tania Saleem , Muhammad Janjua , Talha Ahmad | TOSEM 2023 | SmartMuv |