Prerequisites:
- 07-security/09-audit-methodology
Инструменты аудита: Slither, Mythril, Aderyn
Зачем нужны инструменты?
В предыдущем уроке мы узнали: automated tools находят ~20% уязвимостей. Кажется мало? Но эти 20% — low-hanging fruit, которые инструменты находят за СЕКУНДЫ. Без инструментов аудитор тратит часы на проверки, которые автоматизированы.
Аналогия: Automated tools = spell checker. Не заменяет редактора, но ловит опечатки мгновенно. Публиковать книгу без spell check — непрофессионально. Аудировать контракт без Slither — непрофессионально.
В этом уроке:
- Запустим Slither через Docker и разберем output
- Запустим Mythril через Docker и прочитаем SWC-classified findings
- Научимся triage findings (TP vs FP vs Info)
- Сравним все инструменты
- Подведем итог всего модуля Security
Сравнение инструментов
| Критерий | Slither | Mythril | Aderyn |
|---|---|---|---|
Подход | Static analysis (AST + CFG + dataflow) | Symbolic execution + SMT solver | AST pattern matching |
Язык | Python | Python (z3 solver) | Rust |
Скорость | Секунды (быстрый) | Минуты-часы (медленный) | Секунды (быстрый) |
Detectors | 200+ built-in detectors | ~40 SWC detectors | ~30 Cyfrin detectors |
Framework | Trail of Bits | ConsenSys Diligence | Cyfrin |
Сильные стороны | Coverage, скорость, custom detectors, CI/CD | Находит глубокие баги (multi-tx), formal verification | Скорость, Rust reliability, новые детекторы |
Слабые стороны | False positives, не находит multi-tx баги | Медленный, path explosion, high FP rate | Меньше детекторов, новый инструмент |
Лучше всего для | CI/CD pipeline, первый проход аудита | Глубокий анализ critical контрактов | Быстрая проверка, дополнение к Slither |
Docker | trailofbits/eth-security-toolbox | mythril/myth | cyfrin/aderyn (cargo install) |
Output | JSON, text, Markdown, SARIF | JSON, text, Markdown | JSON, Markdown |
Slither: Static Analysis
Что такое Slither?
Slither — статический анализатор от Trail of Bits. Разбирает Solidity AST (Abstract Syntax Tree) и применяет 200+ детекторов для поиска уязвимостей.
Как работает:
Solidity code → Compile → AST → Slither IR (SlithIR) → Detectors → Findings
Slither НЕ выполняет код. Он анализирует СТРУКТУРУ кода: control flow, data flow, dependencies.
Запуск через Docker
# Из директории labs/ethereum/
# Первый запуск скачает образ (~2 GB)
docker compose --profile security run slither \
contracts/security/VulnerableVault.sol \
--solc-remaps '@openzeppelin/=node_modules/@openzeppelin/'
Пояснение параметров:
--profile security— активирует security services в docker-composecontracts/security/VulnerableVault.sol— путь к контракту (внутри контейнера /share/)--solc-remaps— маппинг импортов OpenZeppelin
Slither output: разбор по строкам
Ключевые Slither детекторы
| Детектор | Severity | Что ищет | SWC |
|---|---|---|---|
reentrancy-eth | High | Reentrancy с ETH transfer | SWC-107 |
reentrancy-no-eth | Medium | Reentrancy без ETH (state change) | SWC-107 |
unprotected-upgrade | High | initialize() без access control | — |
arbitrary-send-eth | High | Отправка ETH на произвольный адрес | — |
controlled-delegatecall | High | delegatecall с user-controlled address | SWC-112 |
suicidal | High | selfdestruct без access control | SWC-106 |
unchecked-lowlevel | Medium | Unchecked return value of low-level call | SWC-104 |
divide-before-multiply | Medium | Precision loss: a/bc вместо ac/b | — |
tx-origin | Medium | Использование tx.origin для auth | SWC-115 |
solc-version | Info | Floating pragma version | SWC-103 |
Slither в CI/CD pipeline
# .github/workflows/security.yml
name: Security Analysis
on: [push]
jobs:
slither:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: crytic/[email protected]
with:
target: 'contracts/'
slither-args: '--filter-paths node_modules'
fail-on: 'high'
Best practice: Запускайте Slither на каждый PR. Fail pipeline если найдены High severity findings.
Mythril: Symbolic Execution
Что такое Mythril?
Mythril — символический исполнитель от ConsenSys. В отличие от Slither, Mythril ВЫПОЛНЯЕТ код символически: вместо конкретных значений использует символы (x, y) и решает уравнения через SMT solver (Z3).
Как работает:
Solidity → Bytecode → EVM simulation → Symbolic execution → Z3 solver → Findings
Mythril может найти баги, которые Slither пропускает: multi-transaction attacks, conditional bugs, integer overflow paths.
Запуск через Docker
# Из директории labs/ethereum/
# Первый запуск скачает образ (~1.5 GB)
docker compose --profile security run mythril \
analyze /tmp/contracts/security/VulnerableVault.sol \
--solv 0.8.28
Пояснение параметров:
analyze— команда анализа/tmp/contracts/security/VulnerableVault.sol— путь внутри контейнера (volume mounted to /tmp)--solv 0.8.28— версия Solidity compiler
Mythril output: SWC classification
Mythril классифицирует findings по SWC Registry (Smart Contract Weakness Classification):
==== Integer Arithmetic Bugs ====
SWC ID: 101
Severity: High
Contract: VulnerableVault
Function name: deposit()
PC address: 0x1a3
Estimated Gas Usage: 812 - 897
----
The arithmetic operator can underflow.
It is possible to cause an integer overflow or underflow
in the arithmetic operation.
----
Transaction Sequence:
Caller: [ATTACKER]
Function: deposit()
Call value: 115792089237316195423570985008687907853...
Ключевые SWC коды
| SWC ID | Название | Mythril находит? | Описание |
|---|---|---|---|
| SWC-101 | Integer Overflow/Underflow | Да | Арифметическое переполнение |
| SWC-104 | Unchecked Call Return Value | Да | Не проверен результат low-level call |
| SWC-106 | Unprotected SELFDESTRUCT | Да | selfdestruct без access control |
| SWC-107 | Reentrancy | Да | State change после external call |
| SWC-110 | Assert Violation | Да | assert() может быть violated |
| SWC-112 | Delegatecall to Untrusted Callee | Да | delegatecall на user input |
| SWC-115 | Authorization through tx.origin | Да | tx.origin вместо msg.sender |
Mythril: важные флаги
# Увеличить глубину анализа (дольше, но находит больше)
--execution-timeout 300 # 5 минут вместо default 60 сек
--max-depth 50 # Глубже исследовать execution paths
--transaction-count 3 # Multi-transaction анализ (default: 1)
# Пример: глубокий анализ critical контракта
docker compose --profile security run mythril \
analyze /tmp/contracts/security/VulnerableVault.sol \
--solv 0.8.28 \
--execution-timeout 300 \
--max-depth 50 \
--transaction-count 3
Trade-off: Больше depth/timeout = больше findings, но exponentially больше время. Для CI/CD — default. Для manual аудита — максимальные настройки.
Aderyn: AST Pattern Matching
Что такое Aderyn?
Aderyn — инструмент от Cyfrin (Patrick Collins). Написан на Rust, работает через AST pattern matching. Молодой проект, но быстро развивается.
Ключевые отличия:
- Скорость: Rust = молниеносный анализ
- Детекторы: Фокус на практических уязвимостях из реальных аудитов Cyfrin
- Output: Чистый Markdown отчет
Запуск (установка)
# Через cargo (Rust)
cargo install aderyn
# Запуск
aderyn ./contracts/security/
# Output: report.md в текущей директории
Aderyn vs Slither: когда что использовать
| Сценарий | Рекомендация |
|---|---|
| CI/CD pipeline | Slither (mature, много детекторов) |
| Быстрая проверка | Aderyn (быстрый, чистый output) |
| Deep analysis | Mythril (symbolic execution) |
| Полный аудит | Slither + Mythril + Manual review |
| Learning | Все три + сравнить результаты |
Triage Findings: Практическое руководство
Workflow triage
Slither output (30-50 findings)
↓ фильтр по severity
High/Medium findings (10-15)
↓ ручной анализ каждого
True Positive (3-5) → Включить в отчет
False Positive (5-8) → Отметить как FP
Informational (2-3) → Low priority в отчете
Как отличить TP от FP
True Positive (TP) — настоящая уязвимость:
- Можете написать PoC exploit
- Нарушает invariant протокола
- Приводит к потере/блокировке средств
False Positive (FP) — ложное срабатывание:
- Контекст, который инструмент не понимает
- Access control защищает функцию
- Dead code / unreachable path
- Intended behavior
Пример FP: Slither детектор arbitrary-send-eth находит owner.call{value: balance}("") в функции emergencyWithdraw() с onlyOwner modifier. Это FP: отправка средств owner — intended behavior.
Классический false positive pattern
// Slither: "reentrancy-eth" на withdraw()
// Но функция имеет nonReentrant modifier!
function withdraw(uint256 amount) external nonReentrant {
require(balances[msg.sender] >= amount);
(bool success, ) = msg.sender.call{value: amount}("");
require(success);
balances[msg.sender] -= amount; // Slither: "state after call!"
}
Slither видит pattern “state change after external call”, но НЕ учитывает nonReentrant. Это FP.
Layered Defense: стратегия
Ни один инструмент не находит все. Стратегия layered defense:
Layer 1: Slither (static)
→ Быстрый, широкий, catches known patterns
→ ~50-70% recall на known vulnerability classes
→ Запускать ПЕРВЫМ
Layer 2: Mythril (symbolic)
→ Медленный, глубокий, finds multi-tx bugs
→ ~30-50% recall, но находит то, что Slither пропускает
→ Запускать на critical контрактах
Layer 3: Manual Review (человек)
→ Business logic, economic attacks, cross-contract
→ ~80% recall на critical/high findings
→ НЕОБХОДИМ для любого серьезного аудита
Layer 4: Formal Verification (если бюджет позволяет)
→ Halmos, Certora, KEVM
→ Математическое доказательство invariants
→ Для протоколов с TVL > $100M
Золотое правило:
Slither + Mythril + Manual review= минимальный набор для серьезного аудита. Ни один компонент нельзя убрать.
Lab: запуск инструментов на наших контрактах
Подготовка
# Перейти в директорию лабораторной
cd labs/ethereum/
# Убедитесь, что контракты скомпилированы
forge build
Упражнение 1: Slither на VulnerableVault
# Запуск Slither
docker compose --profile security run slither \
contracts/security/VulnerableVault.sol \
--solc-remaps '@openzeppelin/=node_modules/@openzeppelin/'
# Ожидаемый output: 3-5 findings (reentrancy-eth, etc.)
# Задание: классифицируйте каждый finding как TP/FP/Info
Упражнение 2: Mythril на VulnerableVault
# Запуск Mythril (может занять 1-3 минуты)
docker compose --profile security run mythril \
analyze /tmp/contracts/security/VulnerableVault.sol \
--solv 0.8.28
# Ожидаемый output: SWC-107 (reentrancy), возможно SWC-101
# Задание: сравните findings с результатами Slither
Упражнение 3: Сравнение результатов
Создайте таблицу:
| Finding | Slither | Mythril | Triage |
|---------|---------|---------|--------|
| Reentrancy in withdraw() | ✓ (reentrancy-eth) | ✓ (SWC-107) | TP |
| Unprotected initialize() | ✓ (unprotected-upgrade) | ? | TP |
| Event after call | ✓ (reentrancy-events) | ✗ | Info |
| ... | ... | ... | ... |
Задание: Запустите оба инструмента на каждом контракте в
contracts/security/и сравните результаты. Сколько findings нашел только Slither? Только Mythril? Оба?
Написание аудит-отчета
Собираем все вместе
Вот полный workflow создания audit report для наших контрактов:
1. Scope: contracts/security/ (8 контрактов, ~500 nSLOC)
2. Automated: Slither (X findings) + Mythril (Y findings)
3. Triage: Z true positives
4. Manual review: business logic check
5. Report: severity classification + PoC
Шаблон finding:
### [H-01] Reentrancy in VulnerableVault.withdraw()
**Severity:** High | **Likelihood:** High | **Impact:** Critical
**Description:**
withdraw() выполняет external call (msg.sender.call{value}) перед state update
(balances[msg.sender] = 0). Атакующий может рекурсивно вызвать withdraw().
**PoC:**
forge test --match-path test/security/ReentrancyExploit.t.sol -vvv
**Recommendation:**
Apply CEI pattern + ReentrancyGuard.
**References:**
- SWC-107
- contracts/security/ReentrancyVulnerable.sol (SEC-02)
Ключевые выводы
- Slither — быстрый static analysis, 200+ детекторов, идеален для CI/CD
- Mythril — symbolic execution, находит глубокие баги, но медленный
- Aderyn — быстрый Rust-инструмент от Cyfrin, дополняет Slither
- Triage (TP/FP/Info) — ключевой навык, ~50% findings от инструментов = FP
- Layered defense: Slither + Mythril + Manual = минимальный набор
- Docker compose упрощает запуск:
--profile security run slither/mythril - CI/CD integration: Slither на каждый PR, fail на High findings
Module 6 Recap: Security & Audit
Поздравляем! Вы завершили модуль Security — самый критически важный модуль для любого разработчика smart contract.
| Концепция | Урок | Ключевой вывод |
|---|---|---|
| OWASP Top 10 | SEC-01 | Access Control — #1, reentrancy — #5. Ландшафт сменился с 2016 |
| Reentrancy | SEC-02 | 4 варианта: single, cross-function, cross-contract, read-only |
| Integer Overflow | SEC-03 | 0.8+ защищает, но unchecked и downcasting — риски |
| Access Control | SEC-04 | От нуля до RBAC: Ownable -> Ownable2Step -> AccessControl |
| MEV | SEC-05 | Supply chain: users -> searchers -> builders -> relays -> validators |
| Sandwich | SEC-06 | Frontrun + backrun = profit за счет пользователя |
| Flashbots | SEC-07 | Private mempool, Protect RPC, 90% MEV refund |
| Flash Loan атаки | SEC-08 | Уязвимость в оракуле, не во flash loan |
| Методология аудита | SEC-09 | 4 фазы: scoping, auto, manual (60%), reporting |
| Инструменты аудита | SEC-10 | Slither + Mythril + manual = layered defense |
Что вы теперь умеете
После этого модуля вы можете:
- Идентифицировать 10 основных типов уязвимостей smart contract
- Написать PoC exploit для reentrancy, integer overflow, access control
- Понять MEV supply chain и защитить транзакции через Flashbots
- Запустить Slither и Mythril через Docker
- Провести triage findings (TP vs FP vs Info)
- Написать структурированный audit report
- Формализовать invariants протокола
Следующий модуль
В следующем модуле — Governance & Scalability. DAO governance с OpenZeppelin Governor, Layer 2 решения (Optimistic Rollups, ZK Rollups), cross-chain bridges и будущее масштабирования Ethereum.
Переход: Security -> Governance & Scalability. Теперь, когда вы умеете находить и исправлять уязвимости, следующий шаг — понять как протоколы УПРАВЛЯЮТСЯ (governance) и как Ethereum МАСШТАБИРУЕТСЯ (L2).
Finished the lesson?
Mark it as complete to track your progress