Governance- и экономические атаки

Иногда протокол захватывают не через баг в коде, а через его же правила управления.

Governance-атака — захват контроля над протоколом через его легальный механизм управления (голосование токенами), когда атакующий набирает достаточно голосов, чтобы провести вредоносное решение.

Управление как поверхность атаки

Многие DeFi-протоколы управляются держателями токена: предложения (изменить параметры, потратить казну, обновить логику) принимаются голосованием. Это децентрализует власть, но создаёт новый риск: если кто-то получит большинство голосов, он сможет легально провести решение, выгодное ему и губительное для протокола — например, направить казну себе. Кода-бага нет: сработали штатные правила.

Где появляется флеш-займ

Если вес голоса считается по мгновенному балансу токенов, атакующий может занять огромное количество токенов управления флеш-займом, проголосовать ими и вернуть заём — всё в одной транзакции. Поэтому критична защита, которую мы уже встречали: снапшот силы голоса на прошлый блок. Флеш-займ живёт в текущем блоке и не повлияет на «вес», зафиксированный ранее.

// УЯЗВИМО: вес = текущий баланс (флеш-займ даёт голоса)
uint votes = token.balanceOf(voter);

// БЕЗОПАСНЕЕ: вес = баланс на момент создания предложения (снапшот в прошлом)
uint votes = token.getPastVotes(voter, proposalSnapshotBlock);

Другие экономические атаки

  • Манипуляция стимулами. Перекос наград/комиссий, который выкачивает ценность из честных участников.
  • Атака на инфляцию долей пула. Через крайние случаи (пустой пул, первый депозит) исказить пересчёт долей.
  • Накопление округления. Систематический сдвиг округления в свою пользу (см. урок о точности).

Общее у них: эксплуатируется не синтаксис, а экономический дизайн — стимулы и инварианты, которые не учли всех сценариев.

Как работает под капотом: защита управления

Зрелое управление эшелонировано: голоса по снапшоту прошлого блока (против флеш-займов), кворум (минимальная явка), порог предложения (нельзя выносить предложение с пыли) и обязательный таймлок на исполнение принятого решения. Таймлок — последний рубеж: даже если вредоносное предложение прошло, есть окно, в которое сообщество замечает угрозу и выходит/реагирует.

Эшелоны защиты governance:
  снапшот прошлого блока  -- против флеш-голосования
  кворум + порог          -- против дешёвых атак
  таймлок на исполнение   -- окно для реакции сообщества

Частые ошибки

  • Вес голоса по мгновенному балансу. Открывает флеш-голосование.
  • Исполнение решения мгновенно, без таймлока. Нет окна реакции.
  • Низкий кворум/порог. Дешёвый захват малой долей токенов.

Итоги

  • Governance-атака использует штатные правила голосования, а не баг в коде.
  • Вес голоса считайте по снапшоту прошлого блока — против флеш-займов.
  • Защита эшелонирована: снапшот, кворум, порог, таймлок исполнения.
  • Экономические атаки бьют по дизайну стимулов и инвариантов, а не по синтаксису.
Проверьте себя
1. Чем governance-атака отличается от обычного взлома?
AОна использует баг в компиляторе
BОна проводит вредоносное решение через штатный механизм голосования, без бага в коде
CОна крадёт приватный ключ
DОна переполняет uint
2. Как снапшот прошлого блока защищает голосование от флеш-займов?
AУскоряет подсчёт
BВес голоса фиксируется в прошлом, а флеш-займ живёт в текущем блоке и не влияет на него
CШифрует голоса
DЗапрещает голосовать
3. Зачем нужен таймлок на исполнение решений governance?
AЧтобы ускорить апгрейд
BЧтобы дать сообществу окно заметить вредоносное решение и среагировать до его исполнения
CЧтобы снизить газ
DЧтобы скрыть голосование