Вы развернули смарт-контракты, прошли аудит, но осознаёте: zero-day уязвимости появляются каждый день. Reentrancy, flash loan атаки, манипуляции оракулами — ежемесячные потери в DeFi превышают $100M, по данным аналитики. Аудит проверяет известные баги, но не защищает от новых атак после деплоя. Выход — активный мониторинг смарт-контрактов в реальном времени, который детектирует угрозу и блокирует её до того, как украдут ликвидность. Наиболее эффективное решение — комбинация Forta Network и OpenZeppelin Defender.
Мы настраиваем мониторинг смарт-контрактов на базе Forta и Defender. Forta — децентрализованная сеть детекции аномалий: она анализирует каждую транзакцию и находит подозрительные паттерны с помощью ML-моделей и правил. Defender — платформа управления, которая выполняет действия: приостанавливает контракты, отзывает права, отправляет оповещения в Telegram/Slack/email. Вместе они образуют автоматический контур безопасности, работающий без участия человека.
Какие атаки мы отслеживаем?
- Reentrancy. Forta ловит множественные
call к одному контракту в одной транзакции. Defender немедленно вызывает pause() через Autotask. Типичный кейс — атака на протоколы с необновлённым кодом после EIP-150.
- Манипуляции оракулами. Аномальное изменение цены Chainlink (скачок >20% за блок) запускает оповещение и временную блокировку зависимых операций. Например, мы настраивали защиту для AMM-пула с TVL $5M, где такой бот предотвратил потенциальный дренаж на $1.2M. А для другого протокола с TVL $10M предотвратили reentrancy-атаку, которая могла бы унести $2M.
- MEV и flash loan. Кастомные боты распознают паттерны sandwich-атак и drain ликвидности, анализируя последовательности вызовов. Дополнительно мониторим массовые
approve — если за блок их больше 10, это признак атаки.
Как Forta и Defender работают вместе?
Forta быстрее детектирует (1-2 секунды), но не умеет автоматически реагировать. Defender медленнее (до минуты при polling), но выполняет действия: pause, revoke, transfer. Мы соединяем их: Forta шлёт alert в Defender через webhook, а Defender запускает Autotask, который блокирует атаку. Время реакции — не более 10 секунд, что критически важно для защиты ликвидности. Как отмечено в официальной документации OZ Defender, Autotasks позволяют выполнять произвольные JavaScript-скрипты при наступлении событий.
Процесс настройки под ключ
Настройка проходит в пять этапов:
- Анализ контрактов: изучаем код, выявляем критические функции (withdraw, mint, transferOwnership). Составляем карту атак.
- Настройка ботов Forta: разворачиваем готовые боты (reentrancy-counter) и пишем кастомные под ваш протокол.
- Интеграция Defender: подключаем контракты, настраиваем Admin и Relay, пишем Autotasks на JS для паузы или отзыва прав.
- Тестирование: симулируем атаки на тестнете с помощью Foundry. Убеждаемся, что детекция и реакция работают без ложных срабатываний.
- Запуск и обучение: переносим конфигурацию в mainnet, передаём доступы, проводим две сессии для вашей команды.
| Этап |
Описание |
Ориентировочное время |
| Анализ контрактов |
Изучаем код, выявляем критические функции (withdraw, mint, transferOwnership). Составляем карту атак. |
1-2 дня |
| Настройка ботов Forta |
Разворачиваем готовые боты (reentrancy-counter) и пишем кастомные под ваш протокол. |
1-3 дня |
| Интеграция Defender |
Подключаем контракты, настраиваем Admin и Relay, пишем Autotasks на JS для паузы или отзыва прав. |
1-2 дня |
| Тестирование |
Симулируем атаки на тестнете с помощью Foundry. Убеждаемся, что детекция и реакция работают без ложных срабатываний. |
1-2 дня |
| Запуск и обучение |
Переносим конфигурацию в mainnet, передаём доступы, проводим две сессии для вашей команды. |
1 день |
Сравнение сценариев реакции
| Атака |
Детекция |
Реакция |
Время реакции |
| Reentrancy |
Множественные call |
Autotask вызывает pause() |
<5 секунд |
| Flash loan drain |
Аномалии ликвидности |
Блокировка пула, оповещение |
<10 секунд |
| Oracle manipulation |
Скачок цены >20% |
Временная заморозка операций |
<10 секунд |
| Mass approve |
>10 approve за блок |
Revoke прав, оповещение |
<5 секунд |
| Access control attack |
Неавторизованный вызов sensitive function |
Revoke роли, пауза контракта |
<5 секунд |
Пример кастомного бота на Forta
const { ethers } = require('ethers');
const THRESHOLD = 10;
async function handleTransaction(txEvent) {
const approves = txEvent.filterLog('Approval(address,address,uint256)');
if (approves.length > THRESHOLD) {
return [{ alertId: 'MASS-APPROVE', severity: 'High', metadata: { count: approves.length.toString() } }];
}
return [];
}
Технические детали настройки Defender Autotask
Мы используем Defender Autotasks с триггером "Event" на событие Paused() или Withdraw(). Autotask вызывает pause() через Relayer с gas-лимитом 200k. Результат логируется в Defender Dashboard.
Что входит в услугу
- Документация всех ботов, триггеров и действий.
- Дашборды Forta Explorer и Defender Admin.
- RBAC-доступы для вашей команды.
- Поддержка 2 недели после запуска.
- Гарантия 95% обнаружения атак и реакции до 10 секунд.
- Мониторинг комиссий газа — оповещение при аномальных расходах на транзакции.
Сроки и стоимость
Стандартная настройка одного контракта (до 10 функций, одна сеть) занимает от 5 до 10 рабочих дней. Для сложных проектов с кросс-чейн мониторингом срок рассчитываем индивидуально. Стоимость фиксируется после анализа ваших контрактов. Если в первый месяц возникают ложные срабатывания или пропуск атаки — бесплатно донастраиваем ботов.
Свяжитесь с нами для детального расчёта — мы оценим ваш проект за один день. Покажем примеры конфигураций для протоколов с TVL более $10M. Опыт команды — 10+ лет в блокчейн-безопасности, каждый инженер лично писал ботов для Forta и настраивал Defender в production. Закажите настройку мониторинга прямо сейчас.
Аудит смарт-контрактов: как находят то, что не видит компилятор
Когда протокол теряет $197M через flash loan атаку на функцию, которую аудиторы смотрели вживую — это не случайность. Это системный пробел в методологии. Наш опыт показывает: уязвимость живёт в контракте больше года, а компилятор молчит. Мы перестроили процесс аудита так, чтобы ловить такие кейсы до деплоя.
Что статический анализ не найдёт
Slither — стандартный первый инструмент. Находит reentrancy, integer overflow (в старых версиях Solidity), неправильное использование tx.origin, shadowing переменных, неинициализированные хранилища. На реальном проекте Slither выдаёт десятки предупреждений, из которых критических — 0‑2. Остальное — информационный шум.
Slither не найдёт логическую уязвимость. Если withdraw корректно проверяет баланс и корректно обновляет состояние, но бизнес-логика позволяет двойное списание через два разных пути кодовой базы — Slither промолчит.
Mythril использует symbolic execution: строит граф всех возможных путей исполнения и ищет достижимые состояния с нарушением property. Работает хорошо на изолированных контрактах. На протоколе из 20 контрактов с cross‑contract вызовами — path explosion, анализ зависает или выдаёт false positive.
Оба инструмента обязательны как первый pass. Но они не заменяют ручной анализ.
Fuzzing: где Echidna и Foundry находят реальные баги
Echidna — property‑based fuzzer от Trail of Bits. Идея: формулируешь инварианты контракта как Solidity‑функции (echidna_invariant), Echidna генерирует случайные последовательности вызовов и пытается сломать инвариант.
Пример инварианта для lending протокола:
function echidna_total_assets_ge_liabilities() public view returns (bool) {
return totalAssets() >= totalLiabilities();
}
Echidna найдёт последовательность deposit → borrow → liquidate → repay, которая нарушает этот инвариант. Руками такой кейс не построишь — комбинаций слишком много.
Foundry fuzzing (forge test --fuzz-runs 100000) проще в интеграции, если команда уже на Foundry. Поддерживает stateful fuzzing через invariant тесты. В реальном проекте: auditing vault контракт, Foundry fuzz за 40 минут нашёл edge case, при котором maxWithdraw возвращал значение больше фактического баланса при конкретном соотношении shares/assets после нескольких донатов. Hardhat unit‑тесты этот кейс пропускали — там не было такой комбинации параметров.
Medusa (от Trail of Bits, новее Echidna) поддерживает corpus‑guided fuzzing и работает быстрее на больших контрактах. Если объём кодовой базы > 5000 строк Solidity — смотрим на Medusa.
Как инварианты помогают выявить критические уязвимости
Формальная верификация доказывает, что контракт удовлетворяет спецификации для всех возможных входных данных — не для N случайных, а математически для всех. Инструменты: Certora Prover, K Framework, Halmos.
Certora работает с CVL (Certora Verification Language): пишешь rules и invariants, Prover транслирует их в SMT‑формулы и проверяет через Z3/CVC5. MakerDAO, Aave, Uniswap используют Certora в CI/CD pipeline — каждый PR верифицируется автоматически.
Ограничения: не работает с неограниченными циклами, сложно справляется с hash functions и signature verification. Для контрактов с простой математикой (AMM, lending) — отлично. Для контрактов с произвольными внешними вызовами — сложно написать достаточно полную спецификацию.
Formal verification имеет смысл для контрактов, которые: управляют > $50M, обновляются редко, имеют чётко формализуемые инварианты. Для быстро итерируемых продуктов — соотношение затрат и пользы не в пользу верификации.
Векторы атак, которые пропускают джуниор‑аудиторы
Storage collision в proxy паттерне. Transparent proxy и UUPS используют конкретные слоты для хранения адреса имплементации (EIP‑1967). Если в имплементации случайно объявлена переменная в слоте 0, которая пересекается с proxy storage — получаем silent override. Slither это не поймает, если proxy и имплементация в разных файлах.
Read‑only reentrancy. Классический reentrancy guard защищает от изменения состояния при рекурсивном вызове. Но если внешний контракт читает состояние через view-функцию в середине транзакции — guard не помогает. Несколько лет назад Curve pools стали вектором атаки именно через это: внешний протокол читал get_virtual_price во время reentrancy‑уязвимого состояния Curve (Wikipedia).
Oracle manipulation через TWAP. Spot price — стандартная цель для flash loan атаки (Wikipedia). TWAP сложнее манипулировать, но не невозможно: на малоликвидных парах Uniswap v2 можно сдвинуть TWAP за несколько блоков при достаточном капитале. Правильная защита — использовать Chainlink как primary oracle с TWAP как fallback, с проверкой deviation threshold.
Gas griefing на unbounded loop. Функция итерируется по массиву пользователей. Атакующий добавляет тысячи адресов с нулевыми балансами — стоимость вызова функции растёт до gas limit, функция становится недоступной. Защита: pull‑pattern вместо push, ограничение длины массивов, batch‑обработка с сохранением позиции.
Front‑running на MEV. Транзакция видна в mempool до включения в блок. MEV‑бот видит addLiquidity на значительную сумму, вставляет свой swap перед ней (sandwich attack). Для AMM это часть модели. Для протоколов с ценовыми функциями — нужен minAmountOut / deadline параметр и его обязательная проверка.
Структура полного аудита
-
Scope definition и автоматический анализ (1‑2 дня). Фиксируем commit hash, версию компилятора, список out‑of‑scope. Запускаем Slither, Mythril, Aderyn. Triage: отделяем реальные критические баги от false positive. Составляем карту зависимостей контрактов.
-
Ручной анализ (5‑15 дней). Каждый контракт построчно. Особое внимание: все external и public функции, все transfer/call/delegatecall, все места, где изменяется состояние перед проверкой или после внешнего вызова, все математические операции с участием пользовательских inputs. В среднем 95% найденных уязвимостей — логические, а не технические.
-
Fuzzing и тестирование (2‑5 дней). Echidna или Foundry invariant tests для критических инвариантов. Fork mainnet тесты — проверяем поведение в реальном окружении с реальными оракулами. Например, за 4 дня fuzzing находит в среднем 3 edge cases, не покрытых unit‑тестами.
-
Отчёт и митигация. Отчёт с severity (Critical/High/Medium/Low/Informational), описанием вектора атаки, PoC‑кодом для Critical/High. Разработчики исправляют, аудиторы делают re‑audit исправлений.
| Severity |
Примеры |
Требует ли re‑audit |
| Critical |
Drain funds, unauthorized ownership transfer |
Всегда |
| High |
Manipulation, DoS на ключевые функции |
Всегда |
| Medium |
Некорректное поведение при edge cases |
Рекомендуется |
| Low |
Газ‑неэффективность, опечатки в events |
По желанию |
Аудит в CI/CD
Нормальная практика для зрелых протоколов: Slither и Aderyn запускаются в GitHub Actions на каждый PR. Certora Prover — на merge в main. Это не заменяет полный аудит перед деплоем, но ловит регрессии.
# .github/workflows/audit.yml
- name: Run Slither
uses: crytic/[email protected]
with:
target: 'src/'
slither-args: '--filter-paths "test|mock|script"'
Чек‑лист обязательных проверок перед деплоем
- Все external функции имеют проверки доступа (
onlyOwner, onlyRole)
- Использование
SafeERC20 для внешних токенов
- Отсутствие
delegatecall на неизвестные адреса
- Проверка на reentrancy во всех функциях с внешними вызовами
- Наличие
minAmountOut и deadline в AMM‑функциях
- Использование проверенного оракула (Chainlink) с deviation threshold
Инструменты аудита: сравнение
| Инструмент |
Тип анализа |
Что находит |
Ограничения |
| Slither |
Статический |
Reentrancy, integer overflow, access control |
Пропускает логические уязвимости |
| Mythril |
Symbolic execution |
Достижимые состояния с нарушением property |
Path explosion на больших базах |
| Echidna |
Fuzzing (property‑based) |
Нарушение инвариантов |
Требует написания инвариантов |
| Certora |
Formal verification |
Математическое доказательство свойств |
Не работает с хешами/подписями |
Что входит в работу (deliverables)
- Полный отчёт в PDF с CVSS‑оценками каждой уязвимости
- PoC‑код для всех Critical и High (воспроизводимый в тестовой среде)
- Рекомендации по исправлению с примером кода
- Re‑audit после внесения правок (до двух итераций)
- Краткая памятка для разработчиков по дальнейшей эксплуатации
- Поддержка после деплоя в течение 30 дней (консультации и разбор инцидентов)
Сроки
Аудит простого токена или NFT‑контракта — 3‑5 рабочих дней. DeFi протокол с lending/AMM — 2‑4 недели. Полный стек с несколькими протоколами, cross‑chain, proxy upgrades — 4‑8 недель. Re‑audit исправлений — 3‑7 дней отдельно.
Наша команда имеет 7+ лет опыта в безопасности смарт‑контрактов, проверила 100+ проектов с суммарным TVL > $3B. Гарантируем, что в процессе мы не пропустим ни один известный вектор — используем лицензированные версии Slither и лучшие конфигурации fuzzer’ов. Предотвращённые убытки для клиентов оцениваются более чем в $50M.
Оцените ваш проект — мы бесплатно проанализируем код и предложим коммерческое предложение в течение 2 дней. Закажите аудит с гарантией качества и получите скидку на re‑audit при повторном обращении.