Присоединяйтесь к Империи взлома Slack
- Обсуждения и поддержка
Slither — это платформа статического анализа Solidity & Vyper, написанная на Python3. Он запускает набор детекторов уязвимостей, печатает визуальную информацию о деталях контракта и предоставляет API для легкого написания собственного анализа. Slither позволяет разработчикам находить уязвимости, улучшать понимание кода и быстро создавать прототипы пользовательских анализов.
Запустите Slither в приложении Hardhat/Foundry/Dapp/Brownie:
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 .
Мы рекомендуем использовать виртуальную среду Python, как подробно описано в инструкциях по установке для разработчиков, если вы предпочитаете устанавливать Slither через git.
Используйте образ докера eth-security-toolbox
. Он включает в себя все наши инструменты безопасности и все основные версии 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 encodePacked Collision | Высокий | Высокий |
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 | Используйте Кодекс для поиска уязвимостей. | Высокий | Низкий |
17 | arbitrary-send-erc20-permit | TransferFrom использует произвольный from с разрешением | Высокий | Середина |
18 | arbitrary-send-eth | Функции, которые отправляют эфир в произвольные места назначения | Высокий | Середина |
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 | Если вместо leave используется return . | Высокий | Середина |
27 | storage-array | Ошибка компилятора целочисленного массива со знаком хранилища | Высокий | Середина |
28 | unchecked-transfer | Непроверенная передача токенов | Высокий | Середина |
29 | weak-prng | Слабый ГПСЧ | Высокий | Середина |
30 | domain-separator-collision | Обнаруживает токены ERC20, у которых есть функция, подпись которой конфликтует с DOMAIN_SEPARATOR() EIP-2612. | Середина | Высокий |
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 | Устаревшие стандарты твердости | Информационный | Высокий |
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 | Обнаруживает for , которые используют элемент length некоторого массива хранения в своем условии цикла и не изменяют его. | Оптимизация | Высокий |
90 | constable-states | Переменные состояния, которые можно объявить постоянными | Оптимизация | Высокий |
91 | external-function | Открытая функция, которая может быть объявлена внешней | Оптимизация | Высокий |
92 | immutable-states | Переменные состояния, которые можно объявить неизменяемыми | Оптимизация | Высокий |
93 | var-read-using-this | Контракт считывает свою собственную переменную, используя this | Оптимизация | Высокий |
Для получения дополнительной информации см.
human-summary
: Распечатать удобочитаемую сводку контрактов.inheritance-graph
: Экспортируйте график наследования каждого контракта в точечный файл.contract-summary
: Распечатать сводку контрактов.loc
: подсчитайте общее количество строк кода (LOC), строк исходного кода (SLOC) и строк кода комментариев (CLOC), найденных в исходных файлах (SRC), зависимостях (DEP) и тестовых файлах (TEST).call-graph
: экспортируйте график вызовов контрактов в точечный файл.cfg
: экспортируйте CFG каждой функции.function-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.
В документации принтера описывается информация, которую Slither способен визуализировать для каждого контракта.
В документации Детектора описывается, как написать новый анализ уязвимостей.
В документации API описаны методы и объекты, доступные для пользовательского анализа.
Документация SlithIR описывает промежуточное представление SlithIR.
Как исключить макеты или тесты?
Как исправить «неизвестный файл» или проблемы с компиляцией?
slither contract.sol
завершится неудачно. Вместо этого используйте slither .
в родительском каталоге contracts/
(при запуске ls
вы должны увидеть contracts/
). Если у вас есть папка node_modules/
, она должна находиться в том же каталоге, что и contracts/
. Чтобы убедиться, что эта проблема связана со скольжением, запустите команду компиляции для используемой вами платформы, например, npx hardhat compile
. Это должно сработать успешно; в противном случае механизм компиляции slither, crytic-compile, не сможет сгенерировать AST. Slither лицензируется и распространяется по лицензии AGPLv3. Свяжитесь с нами, если вы ищете исключение из условий.
Заголовок | Использование | Авторы | Место проведения | Код |
---|---|---|---|---|
ReJection: метод обнаружения уязвимостей повторного входа на основе AST | Анализ на основе AST, построенный на основе Slither | Руй Ма, Цзефэн Цзянь, Гуангюань Чен, Ке Ма, Юцзя Чен | ЦТСИС 19 | - |
MPro: объединение статического и символического анализа для масштабируемого тестирования смарт-контракта | Используйте зависимость данных с помощью Slither | Уильям Чжан, Себастьян Банеску, Леодардо Пасос, Стивен Стюарт, Виджай Ганеш | ИССРЭ 2019 | МПро |
ETHPLOIT: от фаззинга к эффективной генерации эксплойтов для смарт-контрактов | Используйте зависимость данных с помощью Slither | Цинчжао Чжан, Ичжуо Ван, Хуанру Ли, Сики Ма | САНЕР 20 | - |
Верификация смарт-контрактов Ethereum: подход к проверке модели | Символическое исполнение, построенное на основе компьютерной графики Slither. | Там Банг, Хоанг Х Нгуен, Дунг Нгуен, Тоан Чие, Тхо Куан | МЖМЛК 20 | - |
Смарт-контракт Ремонт | Положитесь на детекторы уязвимостей Slither | Сяо Лян Юй, Омар Аль-Батаине, Дэвид Ло, Абхик Ройчудри | ТОСЕМ 20 | SCRремонт |
Демистификация циклов в смарт-контрактах | Используйте зависимость данных с помощью Slither | Бен Мариано, Янджу Чен, Ю Фэн, Шувенду Лахири, Исил Диллиг | АСЭ 20 | - |
Динамическая газовая оценка циклов на основе трассировок в смарт-контрактах | Используйте CFG Slither для обнаружения петель. | Чуньмяо Ли, Шицзе Не, Ян Цао, Ицзюнь Юй, Чжэньцзян Ху | IEEE Open J. Comput. Соц. 1 (2020) | - |
SAILFISH: проверка ошибок несогласованности состояний смарт-контрактов за считанные секунды | Положитесь на SlithIR для построения графа зависимости хранилища. | Приянка Бозе, Дипанджан Дас, Янджу Чен, Ю Фэн, Кристофер Крюгель и Джованни Винья | индекс S&P 22 | Парусник |
SolType: типы уточнений для арифметического переполнения в Solidity | Используйте Slither в качестве интерфейса для создания системы типов уточнений. | Брайан Тан, Бенджамин Мариано, Шувенду К. Лахири, Исил Диллиг, Ю Фэн | ПОПЛ 22 | - |
Не нападайте на меня: использование методов машинного обучения для автоматического обнаружения мошенничества | Используйте Slither для извлечения функций токенов (mintable, pausable, ..) | Мазорра, Бруно, Виктор Адан и Ванеса Даса | Математика 10.6 (2022) | - |
MANDO: внедрение многоуровневых гетерогенных графов для детального обнаружения уязвимостей смарт-контрактов | Используйте Slither для извлечения CFG и графа вызовов. | Хоанг Нгуен, Нят-Мин Нгуен, Чуньяо Се, Захра Ахмади, Даниэль Кудендо, Тхань-Нам Доан и Линсяо Цзян | 9-я Международная конференция IEEE по науке о данных и передовой аналитике (DSAA, 2022 г.) | ге-ск |
Автоматизированный аудит уязвимостей TOD, связанных с взвинчиванием цен в смарт-контрактах | Используйте Slither для извлечения зависимостей CFG и данных. | Сиди Мохамед Бейллахи, Эрик Килти, Кирти Нелатуру, Андреас Венерис и Фан Лонг | Международная конференция IEEE по блокчейну и криптовалюте (ICBC) 2022 г. | Смарт-Контракт-Ремонт |
Моделирование и обеспечение соблюдения политик контроля доступа для смарт-контрактов | Расширить зависимости данных Slither | Ян-Филипп Тоберг, Йонас Шиффл, Фредерик Райх, Бернхард Беккерт, Роберт Генрих, Ральф Ройсснер | Международная конференция IEEE по децентрализованным приложениям и инфраструктурам (DAPPS), 2022 г. | SolidityAccessControlEnforcement |
Обнаружение уязвимостей смарт-контрактов на основе глубокого обучения и мультимодального объединения решений | Используйте Slither, чтобы извлечь CFG. | Вэйчу Дэн, Хуаньчунь Вэй, Тэн Хуан, Цун Цао, Юн Пэн и Сюань Ху | Датчики 2023, 23, 7246 | - |
Семантически обогащенный граф знаний кода для выявления неизвестных при повторном использовании кода смарт-контракта | Используйте Slither для извлечения функций кода (CFG, функции, типы параметров и т. д.) | Цин Хуан, Дяньшу Ляо, Чжэнчан Син, Чжэнкан Цзо, Чанцзин Ван, Синь Ся | Транзакции ACM по разработке программного обеспечения и методологии, 2023 г. | - |
Параллельное выполнение смарт-контрактов с детальным доступом к состоянию | Используйте Slither для построения графов доступа к состояниям | Сяодун Ци, Цзяо Цзяо, И Ли | Международная конференция по распределенным вычислительным системам (ICDCS), 2023 г. | - |
Плохие яблоки: понимание централизованных рисков безопасности в децентрализованных экосистемах | Внедрить внутренний анализ поверх Slither | Кайлунь Янь, Цзилиан Чжан, Сянюй Лю, Вэньруй Дяо, Шаньцин Го | Веб-конференция ACM, апрель 2023 г. | - |
Выявление уязвимостей в смарт-контрактах с помощью интервального анализа | Создайте 4 детектора на вершине Слизера. | Штефан-Клаудиу Сюзан, Андрей Арушоайе | С 2023 ГОДА | - |
Анализ состояния хранилища и извлечение смарт-контрактов блокчейна Ethereum (PDF в открытом доступе отсутствует) | Положитесь на CFG и AST от Slither. | Маха Аюб, Таня Салим, Мухаммад Джанджуа, Тальха Ахмад | ТОСЕМ 2023 | СмартМув |
Если вы используете Slither в академической работе, подумайте о том, чтобы подать заявку на премию Crytic Research Prize в размере 10 тысяч долларов.