Реальные уроки: что пошло не так и как избежать
Каждый крупный взлом — это учебник одного класса ошибки; соберём выводы, не операционные детали.
Урок безопасности — обобщённый вывод из инцидента: какой класс уязвимости сработал и какая практика его предотвращает, без воспроизводимого «как именно атаковать».
Зачем учиться на чужих ошибках
История DeFi — это, по сути, повторение одних и тех же классов уязвимостей. Изучая, что пошло не так, мы переводим дорогие уроки индустрии в свои привычки. Ниже — обобщённые уроки по классам, которые мы разобрали в курсе; намеренно без операционных деталей, только причина и защита.
Уроки по классам уязвимостей
| Класс | Что пошло не так (обобщённо) | Как избежать |
| Реентранси | состояние обновлялось после внешнего вызова | CEI + nonReentrant |
| Манипуляция оракулом | цена бралась из спота одного пула | агрегированные оракулы, TWAP, свежесть |
| Контроль доступа | критическая функция/инициализатор без защиты | роли, мультисиг, защищённый initialize |
| Апгрейд | коллизия storage / контроль апгрейда у одного ключа | сохранять layout, таймлок + мультисиг |
| Подписи | отсутствие nonce/домена — реплей | nonce, EIP-712, deadline |
| Экономика | логика доверяла мгновенному состоянию | снапшоты, инварианты, не доверять споту |
Сквозные системные выводы
- Большинство взломов — это известные классы. Дисциплина из этого курса предотвращает подавляющую часть.
- Композируемость переносит риск. Интегрируясь с чужим протоколом, вы наследуете его допущения — проверяйте их.
- Деньги притягивают атаки пропорционально TVL. Чем больше средств, тем выше планка безопасности.
- Экономические баги коварнее кодовых. Код может быть «корректен», а инвариант экономики — нарушаем; отсюда важность инвариант-тестов.
- Защита эшелонирована. Ни один рубеж (тесты/аудит/bounty/пауза) не достаточен в одиночку.
Как работает под капотом: мышление после инцидента
Зрелые команды проводят пост-мортем: какой инвариант был нарушен, почему его не поймали тесты/аудит, какая практика добавляется, чтобы класс ошибки не повторился. Цель — не наказать, а превратить инцидент в постоянную защиту. Так индустрия медленно вытесняет старые классы багов.
Дисциплина безопасного разработчика (итог курса)
Перед каждым внешним вызовом: обновил ли я состояние? (CEI)
Каждая привилегированная функция: защищена? кто владелец?
Откуда цена? манипулируема ли она?
Что сломается при огромном временном капитале? (флеш)
Исход случайности: известен/управляем в момент ставки?
Есть ли инвариант, который это нарушает? проверил фаззером?
Есть ли рубильник (пауза/лимит) на случай, если я ошибся?Частые ошибки
- «С нами такого не случится». Большинство жертв так и думали.
- Учиться только на своих ошибках. Чужие инциденты — бесплатный опыт.
- Останавливаться после запуска. Безопасность — процесс: мониторинг, обновления, реакция.
Итоги
- Взломы повторяют известные классы — дисциплина курса предотвращает большинство.
- Композируемость и большой TVL повышают планку безопасности.
- Экономические инварианты проверяйте фаззингом — код может быть «корректен», а система — нет.
- Защита эшелонирована; безопасность — непрерывный процесс, а не разовый этап.
Проверьте себя
1. Какой главный системный вывод из истории взломов DeFi?
AАтаки всегда уникальны и непредсказуемы
BБольшинство взломов повторяют известные классы уязвимостей, и дисциплина их предотвращает
CБезопасность не нужна при большом TVL
DАудит делает протокол неуязвимым
2. Почему экономические баги коварнее кодовых?
AИх легче найти статикой
BКод может быть «корректен», а инвариант экономики — нарушаем, поэтому нужны инвариант-тесты
CОни не приводят к потерям
DОни видны компилятору
3. Что делают зрелые команды после инцидента?
AСкрывают факт
BПост-мортем: какой инвариант нарушен, почему не поймали, какую практику добавить, чтобы класс не повторился
CУдаляют контракт навсегда
DПовышают комиссии