Реальные уроки: что пошло не так и как избежать

Каждый крупный взлом — это учебник одного класса ошибки; соберём выводы, не операционные детали.

Урок безопасности — обобщённый вывод из инцидента: какой класс уязвимости сработал и какая практика его предотвращает, без воспроизводимого «как именно атаковать».

Зачем учиться на чужих ошибках

История 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Повышают комиссии