Инструменты безопасности: Slither, Mythril, Foundry

Машина находит то, что упускает уставший человек — и наоборот.

Статический анализ — проверка кода без его запуска: инструмент читает исходник/байт-код и ищет известные опасные паттерны. Фаззинг — запуск кода с тысячами случайных входов в поиске нарушений свойств.

Зачем инструменты, если есть аудит

Инструменты не заменяют мышление, но дёшево ловят целые классы типовых ошибок и расширяют покрытие до тысяч сценариев, которые человек руками не переберёт. Правильный процесс — многослойный: автоматические проверки на каждом коммите, потом ручной аудит для логических и экономических багов, которые машина не понимает.

Slither — статический анализатор

Slither быстро сканирует контракт и подсвечивает подозрительные места: возможную реентранси, использование tx.origin, незащищённые функции, опасные низкоуровневые вызовы, неинициализированные переменные. Запускается за секунды, идеален для CI.

# статический анализ контрактов проекта
slither .
# сфокусироваться на одном детекторе
slither . --detect reentrancy-eth

Mythril — символьное исполнение

Mythril идёт глубже: он «символически» прогоняет пути исполнения, подбирая входы, которые приводят к нарушению (например, к выводу средств или переполнению). Это мощнее статики, но медленнее и требует настройки.

# символьный анализ одного контракта
myth analyze contracts/Vault.sol

Foundry — тесты, фаззинг, форк

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

// Фаззинг-тест в Foundry: параметр перебирается автоматически
function testFuzz_depositNeverLosesFunds(uint96 amount) public {
    vm.assume(amount > 0);
    uint256 before = vault.totalAssets();
    vault.deposit(amount);
    // свойство, которое НЕ должно нарушаться ни при каком amount
    assertGe(vault.totalAssets(), before);
}

Как работает под капотом: слои проверки

Разумный конвейер: линтер + Slither на каждом коммите (быстро, ловит типовое) → юнит- и фаззинг-тесты Foundry (свойства и крайние случаи) → Mythril/символьное для критичных контрактов → ручной аудит для логики и экономики → опционально формальная верификация (математическое доказательство, что свойство выполняется всегда) для самых ответственных частей.

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

  • Считать «зелёный» Slither гарантией. Он ловит типовое, но не понимает бизнес-логику.
  • Только юнит-тесты «happy path». Без фаззинга крайние случаи остаются непокрытыми.
  • Игнорировать предупреждения как «шум». Среди ложных срабатываний прячутся настоящие.

Итоги

  • Инструменты дёшево ловят типовые баги и расширяют покрытие, но не заменяют аудит.
  • Slither — быстрый статический анализ; Mythril — символьное исполнение.
  • Foundry даёт юнит-тесты, фаззинг и форк-тесты; фаззинг сам ищет ломающий вход.
  • Стройте многослойный конвейер вплоть до формальной верификации критичных частей.
Проверьте себя
1. Что делает статический анализатор вроде Slither?
AЗапускает контракт в проде
BБез запуска ищет в коде известные опасные паттерны
CГенерирует случайность
DДеплоит контракт
2. Чем ценен фаззинг (например, в Foundry)?
AУскоряет деплой
BПрогоняет код на множестве случайных входов и сам ищет вход, нарушающий свойство
CШифрует тесты
DЗаменяет аудит полностью
3. Почему «зелёный» Slither не гарантирует безопасность?
AОн слишком строгий
BОн ловит типовые паттерны, но не понимает бизнес-логику и экономику протокола
CОн не работает с Solidity
DОн требует прода