Назад к обновлениям
New releaseJul 29, 2026

slither v0.11.6

Статический анализатор для Solidity и Vyper

Поделиться

Slither, статический анализатор смарт-контрактов

Логотип статического анализатора Slither

Build Status PyPI Slither - Read the Docs Slither - Wiki

Присоединяйтесь к Slack-каналу Empire Hacking

Slack Status

- Обсуждения и поддержка

Slither — это фреймворк статического анализа для Solidity и Vyper, написанный на Python3. Он запускает набор детекторов уязвимостей, выводит визуальную информацию о деталях контрактов и предоставляет API для простого написания собственных анализов. Slither позволяет разработчикам находить уязвимости, улучшать понимание кода и быстро прототипировать собственные анализы.

Возможности

  • Обнаруживает уязвимый код Solidity с низким уровнем ложных срабатываний (см. список трофеев)
  • Определяет, где в исходном коде возникает условие ошибки
  • Легко интегрируется в непрерывную интеграцию и сборки Hardhat/Foundry
  • Встроенные «принтеры» быстро сообщают важную информацию о контракте
  • API детекторов для написания собственных анализов на Python
  • Возможность анализа контрактов, написанных на Solidity >= 0.4
  • Промежуточное представление (SlithIR) обеспечивает простые и высокоточные анализы
  • Корректно парсит 99.9% всего публичного кода Solidity
  • Среднее время выполнения менее 1 секунды на контракт
  • Интегрируется со сканированием кода GitHub в CI
  • Поддержка смарт-контрактов Vyper

Использование

Запустите Slither в приложении Hardhat/Foundry/Dapp/Brownie:```console slither .

Это предпочтительный вариант, если ваш проект имеет зависимости, поскольку Slither полагается на базовый фреймворк компиляции для компиляции исходного кода.

Однако вы можете запустить Slither на одном файле, который не импортирует зависимости:```console
slither tests/uninitialized.sol

Как установить

Примечание Slither требует Python 3.10+. Если вы не собираетесь использовать один из поддерживаемых фреймворков сборки, вам потребуется solc, компилятор Solidity; мы рекомендуем использовать solc-select для удобного переключения между версиями solc.

Использование uv (рекомендуется)

uv — это быстрый менеджер пакетов Python, который в 10-100 раз быстрее pip.```console

Install uv if you haven't already

curl -LsSf https://astral.sh/uv/install.sh | sh

Install slither as a tool

uv tool install slither-analyzer

Or run slither without installation

uvx --from slither-analyzer slither

Для обновления:```console
uv tool upgrade slither-analyzer

Использование Pip```console

python3 -m pip install slither-analyzer

Для обновления:```console
python3 -m pip install --upgrade slither-analyzer

Использование Brew```console

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

Используйте образ 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

Интеграция

  • Для интеграции с GitHub Actions используйте slither-action.
  • Для интеграции с pre-commit используйте (замените $GIT_TAG на реальный тег) ```YAML
  • Чтобы сгенерировать отчёт в Markdown, используйте slither [target] --checklist.
  • Чтобы сгенерировать Markdown с подсветкой исходного кода GitHub, используйте slither [target] --checklist --markdown-root https://github.com/ORG/REPO/blob/COMMIT/ (замените ORG, REPO, COMMIT)

Детекторы

НомерДетекторЧто он обнаруживаетВлияниеУверенность
1abiencoderv2-arrayМассив abiencoderv2 в хранилищеHighHigh
2arbitrary-send-erc20transferFrom использует произвольный fromHighHigh
3array-by-referenceИзменение массива хранилища по значениюHighHigh
4encode-packed-collisionКоллизия ABI encodePackedHighHigh
5incorrect-shiftПорядок параметров в инструкции сдвига неверен.HighHigh
6multiple-constructorsНесколько схем конструкторовHighHigh
7name-reusedПовторное использование имени контрактаHighHigh
8protected-varsОбнаружены незащищённые переменныеHighHigh
9public-mappings-nestedПубличные отображения с вложенными переменнымиHighHigh
10rtloИспользуется управляющий символ «справа налево»HighHigh
11shadowing-stateЗатенение переменных состоянияHighHigh
12suicidalФункции, позволяющие любому уничтожить контрактHighHigh
13uninitialized-stateНеинициализированные переменные состоянияHighHigh
14uninitialized-storageНеинициализированные переменные хранилищаHighHigh
15unprotected-upgradeНезащищённый обновляемый контрактHighHigh
16arbitrary-send-erc20-permittransferFrom использует произвольный from с permitHighMedium
17arbitrary-send-ethФункции, отправляющие Ether произвольным адресамHighMedium
18controlled-array-lengthПрисвоение заражённой длины массиваHighMedium
19controlled-delegatecallКонтролируемый получатель delegatecallHighMedium
20delegatecall-loopПлатные функции, использующие delegatecall внутри циклаHighMedium
21incorrect-expНекорректное возведение в степеньHighMedium
22incorrect-returnЕсли return неправильно используется в режиме ассемблера.HighMedium
23msg-value-loopmsg.value внутри циклаHighMedium
24reentrancy-ethУязвимости повторного входа (хищение эфиров)HighMedium
25reentrancy-balanceУязвимости повторного входа, приводящие к устаревшим проверкам балансаHighMedium
26return-leaveЕсли return используется вместо leave.HighMedium
27storage-arrayОшибка компилятора для массива целых чисел со знаком в хранилищеHighMedium
28unchecked-transferНепроверенный перевод токеновHighMedium
29weak-prngСлабый ГПСЧHighMedium
30domain-separator-collisionОбнаруживает токены ERC20, у которых есть функция, сигнатура которой совпадает с DOMAIN_SEPARATOR() из EIP-2612MediumHigh
31enum-conversionОбнаруживает опасное преобразование перечисленияMediumHigh
32erc20-interfaceНекорректные интерфейсы ERC20MediumHigh
33erc721-interfaceНекорректные интерфейсы ERC721MediumHigh
34incorrect-equalityОпасные строгие равенстваMediumHigh
35locked-etherКонтракты, которые блокируют эфирMediumHigh
36mapping-deletionУдаление по отображению, содержащему структуруMediumHigh
37pyth-deprecated-functionsОбнаруживает устаревшие функции PythMediumHigh
38pyth-unchecked-confidenceОбнаруживает, когда не проверяется уровень уверенности цены PythMediumHigh
39pyth-unchecked-publishtimeОбнаруживает, когда не проверяется publishTime цены PythMediumHigh
40shadowing-abstractЗатенение переменных состояния из абстрактных контрактовMediumHigh
41tautological-compareСравнение переменной с самой собой всегда возвращает true или false в зависимости от сравненияMediumHigh
42tautologyТавтология или противоречиеMediumHigh
43write-after-writeНеиспользуемая записьMediumHigh
44boolean-cstНеправильное использование логической константыMediumMedium
45chronicle-unchecked-priceОбнаруживает, когда не проверяется цена Chronicle.MediumMedium
46constant-function-asmКонстантные функции, использующие ассемблерный кодMediumMedium
47constant-function-stateКонстантные функции, изменяющие состояниеMediumMedium
48divide-before-multiplyНеточный порядок арифметических операцийMediumMedium
49gelato-unprotected-randomnessВызов _requestRandomness в незащищённой функцииMediumMedium
50out-of-order-retryableТранзакции retryable с нарушением порядкаMediumMedium
51reentrancy-no-ethУязвимости повторного входа (без хищения эфиров)MediumMedium
52reused-constructorПовторно используемый базовый конструкторMediumMedium
53tx-originОпасное использование tx.originMediumMedium
54unchecked-lowlevelНепроверенные низкоуровневые вызовыMediumMedium
55unchecked-sendНепроверенная отправкаMediumMedium
56uninitialized-localНеинициализированные локальные переменныеMediumMedium
57unused-returnНеиспользуемые возвращаемые значенияMediumMedium
58chainlink-feed-registryОбнаруживает использование реестра фидов ChainlinkLowHigh
59incorrect-modifierМодификаторы, которые могут возвращать значение по умолчаниюLowHigh
60optimism-deprecationОбнаруживает использование устаревших predeploy или функций Optimism.LowHigh
61shadowing-builtinЗатенение встроенных символовLowHigh
62shadowing-localЗатенение локальных переменныхLowHigh
63uninitialized-fptr-cstВызов неинициализированных указателей на функции в конструкторахLowHigh
64variable-scopeЛокальные переменные, используемые до их объявленияLowHigh
65void-cstВызов конструктора, который не реализованLowHigh
66calls-loopМножественные вызовы в циклеLowMedium
67events-accessОтсутствие событий контроля доступаLowMedium
68events-mathsОтсутствие событий арифметикиLowMedium
69incorrect-unaryОпасные унарные выраженияLowMedium
70missing-zero-checkОтсутствие проверки нулевого адресаLowMedium
71reentrancy-benignБезвредные уязвимости повторного входаLowMedium
72reentrancy-eventsУязвимости повторного входа, приводящие к событиям в неправильном порядкеLowMedium
73return-bombНизкоуровневый вызываемый код может неожиданно израсходовать весь газ вызывающего.LowMedium
74timestampОпасное использование block.timestampLowMedium
75assemblyИспользование ассемблераInformationalHigh
76assert-state-changeИзменение состояния в assertInformationalHigh
77boolean-equalСравнение с логической константойInformationalHigh
78cyclomatic-complexityОбнаруживает функции с высокой (> 11) цикломатической сложностьюInformationalHigh
79deprecated-standardsУстаревшие стандарты SolidityInformationalHigh
80erc20-indexedНеиндексированные параметры событий ERC20InformationalHigh
81function-init-stateФункция, инициализирующая переменные состоянияInformationalHigh
82incorrect-using-forОбнаруживает использование оператора using-for, когда ни одна функция из данной библиотеки не соответствует данному типуInformationalHigh
83low-level-callsНизкоуровневые вызовыInformationalHigh
84missing-inheritanceОтсутствие наследованияInformationalHigh
85naming-conventionСоответствие соглашениям об именах SolidityInformationalHigh
86pragmaЕсли используются разные директивы pragmaInformationalHigh
87redundant-statementsИзбыточные операторыInformationalHigh
88solc-versionНекорректная версия SolidityInformationalHigh
89unimplemented-functionsНереализованные функцииInformationalHigh
90unindexed-event-addressСобытия с параметрами address, но без индексированных параметровInformationalHigh
91unused-stateНеиспользуемые переменные состоянияInformationalHigh
92costly-loopДорогостоящие операции в циклеInformationalMedium
93dead-codeФункции, которые не используютсяInformationalMedium
94reentrancy-unlimited-gasУязвимости повторного входа через send и transferInformationalMedium
95too-many-digitsСоответствие лучшим практикам числовой нотацииInformationalMedium
96cache-array-lengthОбнаруживает циклы for, которые используют член length некоторого массива хранилища в условии цикла и не изменяют его.OptimizationHigh
97constable-statesПеременные состояния, которые можно объявить константамиOptimizationHigh
98external-functionПубличная функция, которую можно объявить внешнейOptimizationHigh
99immutable-statesПеременные состояния, которые можно объявить неизменяемымиOptimizationHigh
100var-read-using-thisКонтракт читает свою собственную переменную, используя thisOptimizationHigh

Для получения дополнительной информации см.

Принтеры

Принтеры быстрого обзора

Принтеры углублённого обзора* call-graph: Экспортировать граф вызовов контрактов в dot-файл

Для запуска принтера используйте --print и список принтеров, разделённых запятыми.

См. документацию принтера для полного списка.

Инструменты

См. документацию по инструментам для дополнительных инструментов.

Свяжитесь с нами, чтобы получить помощь в создании собственных инструментов.

Документация API

Документация по внутренностям Slither доступна здесь.

Получение помощи

Не стесняйтесь заглянуть в наш Slack-канал (#ethereum) для получения помощи по использованию или расширению Slither.

Часто задаваемые вопросы

Как исключить моки или тесты?

Как исправить ошибки «unknown file» или проблемы компиляции?

  • Поскольку slither требует AST solc, все зависимости должны быть доступны. Если контракт имеет зависимости, slither contract.sol завершится ошибкой. Вместо этого используйте slither . в родительской директории contracts/ (вы должны увидеть contracts/ при выполнении ls). Если у вас есть папка node_modules/, она должна находиться в той же директории, что и contracts/. Чтобы убедиться, что проблема связана с slither, выполните команду компиляции для используемой вами платформы, например npx hardhat compile. Это должно успешно работать; в противном случае механизм компиляции slither, crytic-compile, не сможет сгенерировать AST.

Лицензия

Slither распространяется под лицензией AGPLv3. Свяжитесь с нами, если вам нужно исключение из условий.

Публикации

Публикация Trail of Bits

Внешние публикации

НазваниеИспользованиеАвторыИзданиеКод
ReJection: A AST-Based Reentrancy Vulnerability Detection MethodAST-анализ, построенный на основе SlitherRui Ma, Zefeng Jian, Guangyuan Chen, Ke Ma, Yujia ChenCTCIS 19-
MPro: Combining Static and Symbolic Analysis for Scalable Testing of Smart ContractИспользование зависимостей данных через SlitherWilliam Zhang, Sebastian Banescu, Leodardo Pasos, Steven Stewart, Vijay GaneshISSRE 2019MPro
ETHPLOIT: From Fuzzing to Efficient Exploit Generation against Smart ContractsИспользование зависимостей данных через SlitherQingzhao Zhang, Yizhuo Wang, Juanru Li, Siqi MaSANER 20-
Verification of Ethereum Smart Contracts: A Model Checking ApproachСимволическое выполнение на основе CFG от SlitherTam Bang, Hoang H Nguyen, Dung Nguyen, Toan Trieu, Tho QuanIJMLC 20-
Smart Contract RepairИспользование детекторов уязвимостей SlitherXiao Liang Yu, Omar Al-Bataineh, David Lo, Abhik RoychoudhuryTOSEM 20SCRepair
Demystifying Loops in Smart ContractsИспользование зависимостей данных через SlitherBen Mariano, Yanju Chen, Yu Feng, Shuvendu Lahiri, Isil DilligASE 20-
Trace-Based Dynamic Gas Estimation of Loops in Smart ContractsИспользование CFG от Slither для обнаружения цикловChunmiao Li, Shijie Nie, Yang Cao, Yijun Yu, Zhenjiang HuIEEE Open J. Comput. Soc. 1 (2020)-
SAILFISH: Vetting Smart Contract State-Inconsistency Bugs in SecondsИспользование SlithIR для построения графа зависимостей хранилищаPriyanka Bose, Dipanjan Das, Yanju Chen, Yu Feng, Christopher Kruegel, and Giovanni VignaS&P 22Sailfish
SolType: Refinement Types for Arithmetic Overflow in SolidityИспользование Slither в качестве интерфейса для построения системы уточнённых типовBryan Tan, Benjamin Mariano, Shuvendu K. Lahiri, Isil Dillig, Yu FengPOPL 22-
Do Not Rug on Me: Leveraging Machine Learning Techniques for Automated Scam DetectionИспользование Slither для извлечения характеристик токенов (mintable, pausable, ..)Mazorra, Bruno, Victor Adan, and Vanesa DazaMathematics 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 JiangIEEE 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 Long2022 IEEE International Conference on Blockchain and Cryptocurrency (ICBC)Smart-Contract-Repair
Modeling and Enforcing Access Control Policies for Smart ContractsРасширение зависимостей данных SlitherJan-Philipp Toberg, Jonas Schiffl, Frederik Reiche, Bernhard Beckert, Robert Heinrich, Ralf ReussnerIEEE International Conference on Decentralized Applications and Infrastructures (DAPPS), 2022SolidityAccessControlEnforcement
Smart Contract Vulnerability Detection Based on Deep Learning and Multimodal Decision FusionИспользование Slither для извлечения CFGWeichu Deng, Huanchun Wei, Teng Huang, Cong Cao, Yun Peng, and Xuan HuSensors 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 XiaACM Transactions on Software Engineering and Methodology, 2023-
Smart Contract Parallel Execution with Fine-Grained State AccessesИспользование Slither для построения графов доступа к состояниюXiaodong Qi, Jiao Jiao, Yi LiInternational Conference on Distributed Computing Systems (ICDCS), 2023-
Bad Apples: Understanding the Centralized Security Risks in Decentralized EcosystemsРеализация внутреннего анализа на основе SlitherKailun Yan , Jilian Zhang , Xiangyu Liu , Wenrui Diao , Shanqing GuoACM Web Conference April 2023-
Identifying Vulnerabilities in Smart Contracts using Interval AnalysisСоздание 4 детекторов на основе SlitherŞtefan-Claudiu Susan, Andrei ArusoaieFROM 2023-
Storage State Analysis and Extraction of Ethereum Blockchain Smart Contracts (нет открытого доступа к PDF)Использование CFG и AST от SlitherMaha Ayub , Tania Saleem , Muhammad Janjua , Talha AhmadTOSEM 2023SmartMuv

Если вы используете Slither в академической работе, рассмотрите возможность подачи заявки на Crytic $10k Research Prize.

Категории