Prerequisites:
- 04-ethereum/07-solidity-patterns
Обзор уязвимостей смарт-контрактов
Зачем это блокчейн-разработчику?
Смарт-контракты управляют миллиардами долларов и не могут быть исправлены после деплоя. Одна уязвимость — одна транзакция — и все средства потеряны навсегда. В отличие от традиционного ПО, здесь нет hotfix, нет rollback, нет “мы исправим в следующем релизе”.
С 2016 по 2024 год потери от уязвимостей смарт-контрактов превысили **326M за одну транзакцию. Каждая атака — это урок, закрепленный в стандартах безопасности.
В этом модуле мы систематически изучим уязвимости: от классификации OWASP до практических эксплойтов в Foundry. Мы начинаем с обзора — чтобы видеть полную картину перед глубоким погружением.
Мост от пройденных тем к безопасности
Вы уже изучили концепции, которые являются фундаментом безопасности:
| Пройденная тема | Урок | Связь с безопасностью |
|---|---|---|
| CEI pattern (Checks-Effects-Interactions) | ETH-07 | Нарушение CEI -> reentrancy (SEC-02) |
| amountOutMin в swap | DEFI-02/03 | Отсутствие slippage protection -> sandwich attack (SEC-07) |
| Flash loans | DEFI-06 | Flash loan как инструмент атаки: манипуляция оракулов (SEC-05) |
| ERC-20 approve | ETH-08 | Бесконечный approve -> drain средств |
| Ownable / Access Control | ETH-08 | Отсутствие модификаторов доступа -> кража средств (SEC-04) |
| Gas и EVM | ETH-05 | Газовые лимиты -> DoS атаки (SEC-08) |
Ключевой инсайт: Безопасность — это не отдельная дисциплина, а следствие глубокого понимания каждого компонента. CEI, который вы изучили в ETH-07, предотвращает самую дорогостоящую уязвимость в истории Ethereum.
OWASP Smart Contract Top 10 (2025)
Что такое OWASP?
OWASP (Open Worldwide Application Security Project) — международная некоммерческая организация, создающая стандарты безопасности. Их Top 10 — каноническая классификация наиболее критичных уязвимостей. Для веб-приложений OWASP Top 10 существует с 2003 года. Для смарт-контрактов — с 2023 года.
SWC Registry
SWC (Smart Contract Weakness Classification) — реестр уязвимостей смарт-контрактов, аналог CWE для традиционного ПО. Каждая уязвимость имеет идентификатор (SWC-107 для reentrancy, SWC-100 для функций с неограниченным доступом).
Классификация Top 10
Покрытие в этом курсе
В этом модуле (Security & Audit) мы детально разберем:
- #1 Access Control (SEC-04): Ownable, Ownable2Step, AccessControl (RBAC)
- #5 Reentrancy (SEC-02): 4 варианта, CEI, ReentrancyGuard, ReentrancyGuardTransient
- #8 Integer Overflow/Underflow (SEC-03): unchecked, downcasting, SafeCast
Остальные категории (#2 Oracle Manipulation, #3 Logic Errors, #6 Unchecked External Calls, #7 Flash Loan Attacks, #9 DoS, #10 Front-Running) будут рассмотрены в SEC-05 через SEC-08.
Хронология крупнейших DeFi-атак
Зачем изучать историю атак?
Каждая атака привела к:
- Новым стандартам — OpenZeppelin ReentrancyGuard появился после The DAO
- Новым инструментам — Slither, Mythril, Foundry fuzzing
- Новым паттернам — CEI, pull-over-push, TWAP оракулы
- Регуляторным изменениям — SEC обратила внимание на DeFi после крупных взломов
Анализ паттернов
Распределение по типам уязвимостей за 2016—2024:
| Тип уязвимости | % от общих потерь | Крупнейший инцидент |
|---|---|---|
| Access Control | ~35% | Poly Network ($611M) |
| Logic Errors | ~25% | Wormhole (197M) |
| Reentrancy | ~15% | The DAO (62M, 2023) |
| Oracle Manipulation | ~15% | Mango Markets ($114M) |
| Integer Overflow | ~5% | BEC Token ($900M рыночная) |
| Flash Loan | ~5% | bZx ($8M), множество мелких |
Наблюдение: Access Control — уязвимость #1 не случайно. Ошибка в одной строке (отсутствие
onlyOwner) может стоить сотен миллионов.
Три уровня понимания безопасности
Уровень 1: Интуитивный (аналогия)
Смарт-контракт — это банковский сейф с программируемым замком:
- Код замка (логика контракта) виден всем (открытый исходный код)
- Замок нельзя поменять после установки (immutable deployment)
- Взломщику не нужен физический доступ — достаточно найти ошибку в коде замка
- Все деньги в сейфе доступны мгновенно через одну транзакцию
Уровень 2: Алгоритмический (код)
Каждая уязвимость — это конкретный паттерн кода, который можно:
- Идентифицировать статическим анализом (Slither, Semgrep)
- Эксплуатировать в тестах (Foundry vm.prank, vm.deal)
- Исправить применением стандартного решения (OZ libraries)
- Верифицировать формальной проверкой (Certora, Halmos)
// Паттерн уязвимости (pseudo):
function vulnerable() {
// CHECK: проверка условия
require(condition);
// INTERACTION: внешний вызов (ОШИБКА -- слишком рано!)
externalCall();
// EFFECT: обновление состояния (слишком поздно!)
updateState();
}
// Исправленный паттерн (CEI):
function safe() {
// CHECK: проверка условия
require(condition);
// EFFECT: обновление состояния
updateState();
// INTERACTION: внешний вызов (теперь безопасно)
externalCall();
}
Уровень 3: Формальный (математический)
Безопасность смарт-контракта можно формализовать как набор инвариантов — свойств, которые должны выполняться при любой последовательности транзакций:
Инвариант 1 (сохранение средств):
forall state S, tx T:
sum(balances) after T == sum(balances) before T + deposits - withdrawals
Инвариант 2 (авторизация):
forall tx T calling restricted_function():
T.sender in authorized_set
Инвариант 3 (целостность состояния):
forall state S during any callback:
S is consistent (no stale values)
Нарушение инварианта 1 — это reentrancy (средства извлекаются без уменьшения баланса). Нарушение инварианта 2 — это access control. Нарушение инварианта 3 — это read-only reentrancy.
Инструменты безопасности
| Инструмент | Тип | Что находит |
|---|---|---|
| Slither | Статический анализ | Reentrancy, unused variables, shadow variables |
| Mythril | Символьное выполнение | Integer overflow, unchecked call returns |
| Foundry Fuzzing | Фаззинг | Нарушения инвариантов при случайных входах |
| Certora Prover | Формальная верификация | Математическое доказательство инвариантов |
| Echidna | Property-based testing | Свойства, которые должны всегда выполняться |
| Halmos | Symbolic testing | Символьное тестирование в Foundry |
Для этого курса: Мы используем Foundry для эксплуатации уязвимостей (vm.prank, vm.deal, vm.expectRevert) и демонстрации исправлений.
Структура модуля Security & Audit
| Урок | Тема | OWASP # | Лабораторная |
|---|---|---|---|
| SEC-01 | Обзор уязвимостей (этот урок) | Все | — |
| SEC-02 | Reentrancy (4 варианта) | #5 | VulnerableVault exploit |
| SEC-03 | Integer Overflow/Underflow | #8 | LegacyOverflow tests |
| SEC-04 | Access Control | #1 | UnsafeToken exploit |
| SEC-05 | Oracle Manipulation & Flash Loans | #2, #7 | Price manipulation |
| SEC-06 | Logic Errors & Input Validation | #3, #4 | Fuzzing invariants |
| SEC-07 | Front-Running & MEV | #10, #6 | Sandwich simulation |
| SEC-08 | DoS & Audit Process | #9 | Full audit checklist |
Итоги
Что мы узнали:
- OWASP Smart Contract Top 10 — каноническая классификация уязвимостей. Access Control (#1) и Reentrancy (#5) — самые дорогостоящие.
- SWC Registry — идентификаторы уязвимостей (SWC-107, SWC-100 и др.)
- Хронология атак — от The DAO (2016) до Euler (2023), каждая привела к новым стандартам
- Три уровня — интуитивный (аналогии), алгоритмический (код), формальный (инварианты)
- Связь с пройденным — CEI, flash loans, access control из предыдущих модулей
Что дальше: В SEC-02 мы детально разберем reentrancy — самую “иконическую” уязвимость Ethereum — и напишем эксплойт в Foundry.
Finished the lesson?
Mark it as complete to track your progress