Аудит смарт-контрактов нашёл 5 уязвимостей — разработчики всё исправили. Через месяц протокол взломали новым вектором: атакующий использовал нестандартную последовательность вызовов, которую аудиторы не смоделировали. Аудит — снимок во времени. Bug Bounty — постоянная живая проверка тысячами глаз. Это необходимость для проектов, управляющих миллионами долларов. Без неё вы рискуете потерять средства из-за уязвимости, которую не заметил аудитор. Мы помогаем построить программу, которая привлекает лучших исследователей и защищает ваш протокол.
Как работает программа Bug Bounty для DeFi?
Программа строится на трёх китах: правила (scope), система наград (rewards) и платформа (Immunefi или HackerOne). Правила описывают, что можно исследовать — какие контракты, транзакции, off-chain компоненты. Система наград определяет выплаты за каждый уровень критичности: critical до $1M и выше, medium до $50k. Платформа управляет отчётами, верификацией и выплатами.
Сравнение платформ: Immunefi vs HackerOne
| Характеристика |
Immunefi |
HackerOne |
| Фокус |
DeFi, смарт-контракты |
Универсальная (web2 + web3) |
| Сообщество |
>50 000 исследователей |
>600 000 |
| Средняя выплата за critical |
$80k |
$20k |
| Интеграции |
Tenderly, Etherscan |
Широкий набор API |
Разработка правил и скоупа
Типичные ошибки при создании скоупа:
- Неявный out-of-scope: не указаны оракулы, мосты, фронтенд. Хакер находит баг в Chainlink интеграции, а его не принимают.
- Размытые триггеры: "существенная потеря средств" — без конкретного порога. Правило: "критическая уязвимость — возможность украсть более 100 ETH".
- Перегруженные зоны: в скоупе 20 контрактов, но разработчик документации не справляется. Оптимум: 3-5 основных контрактов + ссылка на вспомогательные.
Мы интегрируем правила как YAML-файл (пример):
scope:
smart_contracts:
- address: "0x..."
name: "LendingPool"
severity: critical
- address: "0x..."
name: "PriceOracle"
severity: high
off_chain:
- service: "API endpoint"
severity: medium
exclusions:
- type: "frontend"
reason: "no control"
Система наград
Стандартная сетка выплат зависит от сложности скоупа. Например:
| Уровень |
Пример |
Вознаграждение |
| Critical |
Прямая кража средств |
$50k – $1M |
| High |
Блокировка вывода |
$10k – $50k |
| Medium |
Griefing-атака |
$2k – $10k |
| Low |
Информационное |
$500 – $2k |
Мы не фиксируем цены — каждый проект уникален. Но даём ориентиры на основе опыта: программа на 12 проектах показала, что средняя выплата за critical — $80k.
Почему стоит начать с Immunefi?
Immunefi — стандарт в DeFi: более $90M выплаченных наград, интеграция с Tenderly для симуляции атак. HackerOne шире, но в крипте его аудитория меньше. Мы подбираем платформу под профиль клиента. Для молодого протокола с простой архитектурой HackerOne даёт больше веб2-специалистов. Для сложных контрактов лучше Immunefi.
Что такое скоуп и почему он критичен?
Скоуп определяет границы тестирования. Если он слишком широк, исследователи распыляются на низкоприоритетные баги. Если слишком узок — критический вектор остаётся незамеченным. Мы разрабатываем скоуп, балансирующий между глубиной и покрытием, с чёткими критериями для каждого уровня критичности.
Процесс работы
Как запустить Bug Bounty за 4 шага
- Анализ и дизайн программы (1 неделя). Изучаем ваш стек: Solidity, Foundry, Hardhat. Определяем критичные функции, оцениваем риски. Составляем документ "Scope of Work" с правилами и сеткой наград.
- Разработка конфигурации и интеграция (1 неделя). Настраиваем платформу: скоуп, роли, уведомления. Пишем документацию для хакеров: как тестировать, как отчитываться.
- Запуск в закрытом режиме (1 неделя). Публикуем программу в invite-only для 10–20 проверенных исследователей. Собираем первые отчёты, корректируем правила.
- Открытый запуск и мониторинг (2 недели). Открываем для всех. Ежедневно анализируем отчёты, уведомляем команду о критических. Настраиваем автоматический пайплайн через Tenderly для верификации.
Полный цикл: 4–6 недель. В итоге — работающая программа с настроенной инфраструктурой. Закажите предварительный анализ вашего протокола – он поможет определить скоуп и бюджет программы.
Что входит в работу
- Документация программы (rules, scope, rewards)
- Интеграция с Immunefi или HackerOne
- Настройка автоматической верификации отчётов (Tenderly + webhook)
- Подготовка dashboard для отслеживания метрик
- Обучение команды заказчика: как реагировать на отчёты
- Гарантийная поддержка 30 дней после запуска
Мы работаем с проектами, прошедшими хотя бы один внешний аудит. Без аудита запуск bug bounty — как стрельба без прицела: хакеры найдут тривиальные баги, вы заплатите, а критический вектор останется.
Типичные ошибки на старте
- Слишком широкий скоуп: разрешены все контракты — хакер тратит время на низкосложные баги. Узкий скоуп даёт качественные отчёты.
- Нереалистичные выплаты: $500 за critical — исследователи уйдут к конкурентам. Ориентируйтесь на Immunefi: медиана $50k за critical.
- Отсутствие триажа: отчёт лежит в очереди 3 дня — хакер уходит на другой проект. Мы настраиваем автотриаж: critical — немедленный алерт в Telegram.
Опыт и гарантии
Мы запустили программы для 12+ криптопроектов с суммарным вознаграждением более $2M. Наша команда — senior-разработчики с опытом аудита и создания смарт-контрактов. Мы гарантируем: программа будет привлекать квалифицированных исследователей, а вы будете получать только релевантные отчёты.
"После запуска программы на Immunefi мы получили 3 critical-отчёта за первый месяц. Два из них раскрыли потенциальную потерю средств на $300k." — пример из практики (данные обезличены).
Чек-лист для запуска программы Bug Bounty
- Пройти хотя бы один внешний аудит смарт-контрактов.
- Определить скоуп: какие контракты, функции, off-chain компоненты.
- Установить уровни критичности и соответствующие вознаграждения.
- Выбрать платформу (Immunefi или HackerOne).
- Настроить автоматическую верификацию отчётов.
- Обучить команду обработке инцидентов.
Свяжитесь с нами для оценки вашего проекта. Получите консультацию по запуску — разберём ваш скоуп за час.
Аудит смарт-контрактов: как находят то, что не видит компилятор
Когда протокол теряет $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 при повторном обращении.