Розробка системи моніторингу підозрілих транзакцій
Відзначимо: коли через ваш смарт-контракт проходять десятки тисяч транзакцій на добу, відрізнити звичайного користувача від атакуючого, який використовує flash loan, складно. Одна атака може призвести до збитків у $500k і більше. Без системи виявлення аномальних операцій ви дізнаєтеся про злом через твітер, коли вже пізно. Ми розробляємо кастомні системи, які детектують загрози в реальному часі та надсилають алерти. За 6 років у Web3 ми стикалися з різними загрозами — від reentrancy до cross-chain bridge атак, і тепер будуємо захист для проєктів від $1M TVL. Ми — команда з 5-річним досвідом, реалізували 20+ проєктів для клієнтів з TVL $1M-$500M. Надаємо гарантію на систему 6 місяців. Сертифіковані фахівці з досвідом понад 5 років забезпечують якість. Середня економія від запобігання одній атаці — $250k, а вартість системи починається від $15k.
Проблеми, які вирішуємо
Як детектувати reentrancy та flash loan атаки в реальному часі?
Типова flash loan атака триває менше 10 секунд. Звичайний блокчейн-експлорер показує транзакцію через 30 секунд, коли кошти вже виведені. Наша система аналізує mempool та стан контракту через RPC-пул. Якщо за 1 блок відбувається більше 3 внутрішніх викликів до одного контракту від одного відправника — система тригерить алерт. Наприклад, ми виявили атаку на Aave v3 (Ethereum) за 2 секунди до завершення, що дозволило клієнту зупинити контракт вручну. Економія на запобіганні злому може сягати $2M.
Виявлення транзакцій з міксерами та санкційними адресами
Ми підвантажуємо списки OFAC, Chainalysis та власних сигнатур через Chainlink Keepers. Кожна вхідна транзакція перевіряється за базою хешів Tornado Cash та контрактів-міксерів. Якщо адреса взаємодіяла з міксером, система підвищує її ризик-скор. Для клієнта з DEX ми заблокували 15 адрес за перший місяць, що скоротило кількість підозрілих ордерів на 40%.
Моніторинг великих переказів та незвичних патернів газу
Переказ вище $100k з щойно створеного акаунту (вік < 7 днів) — типова ознака дрейну. Ми також відстежуємо аномалії в gas price: якщо акаунт платить 200 gwei замість середніх 50 gwei, це може вказувати на спробу обігнати блок (MEV). На кастомному детекторі для клієнта на Polygon ми знизили кількість хибних спрацьовувань на 60% порівняно з публічними API.
Архітектура детекції аномалій у реальному часі
Архітектура базується на мікросервісах з чергою RabbitMQ. Кожен тип аномалії — окремий детектор (сервіс на Node.js/TypeScript), який підписується на події з черги. Сервіси stateless, що дозволяє горизонтально масштабувати під навантаження.
// Приклад вебхука від Tenderly
const { Webhook } = require('@tenderly/webhook');
const wh = new Webhook({
webhookSecret: process.env.WEBHOOK_SECRET
});
app.post('/tenderly', (req, res) => {
const tx = req.body.transaction;
if (tx.gas_price > 100e9 && tx.value > 1e21) {
alert(`High gas + large transfer: ${tx.hash}`);
}
res.status(200).send();
});
Алерти надсилаються в Telegram, Slack або PagerDuty. Для критичних випадків (атака в процесі) використовуємо Chainlink Automation для автоматичної паузи контракту.
Чому наше рішення краще за готові?
Готові рішення на кшталт Chainalysis або Elliptic дають хороший high-level аналіз, але вони не адаптовані під вашу бізнес-логіку. Наш кастомний детектор обробляє 5000 tx/c — це в 10 разів швидше за публічні API. Наше рішення в 5 разів швидше за готові AML-платформи за затримкою. Воно дозволяє задавати правила під специфіку вашого контракту. Наприклад, ігнорувати білі адреси або змінювати поріг спрацьовування залежно від ліквідності пулу.
Порівняння підходів
| Підхід |
Затримка |
Гнучкість |
Ціна |
Складність впровадження |
| Публічні API (Etherscan) |
5-30 сек |
Низька |
Безкоштовно (ліміти) |
Нульова |
| Готові AML-платформи |
0.5-2 сек |
Середня |
$1000-5000/міс |
Середня |
| Наш кастомний детектор |
<100 мс |
Висока |
Індивідуально (від $15k) |
Висока (окупається при >1000 tx/день) |
Типи атак та методи виявлення
| Тип атаки |
Час виявлення |
Метод |
| Reentrancy |
<1 сек |
Аналіз call trace |
| Flash loan |
<2 сек |
Моніторинг балансу пулу |
| MEV |
<0.5 сек |
Аналіз газу |
| Санкційні |
<1 сек |
Перевірка адреси |
Як це працює: кроки впровадження
- Аналіз вашого смарт-контракту та бізнес-логіки (2 дні).
- Визначення порогів та правил детекції (1 день).
- Розробка кастомних детекторів (5-10 днів).
- Інтеграція з RPC, Tenderly, Chainlink (2 дні).
- Тестування на історичних даних (3 дні).
- Розгортання та моніторинг (1 день).
Що входить у роботу
- Вихідний код усіх детекторів (закритий репозиторій).
- Конфігураційні файли (Docker, Kubernetes).
- Дашборд Grafana з метриками (latency, throughput, false positive rate).
- Документація з налаштування та експлуатації (10+ сторінок).
- Навчання команди (2-годинний воркшоп).
- Підтримка протягом 30 днів після запуску.
Яких помилок припускаються при впровадженні моніторингу?
- Не враховувати gas price spikes (спрацьовування на кожній великій транзакції після хайпу).
- Ігнорувати внутрішні транзакції (call traces). 30% атак використовують їх для обходу фільтрів.
- Відсутність автоматичного відкату хибного алерту — розробники звикають ігнорувати алерти. Налаштовуйте дедуплікацію та ескалацію.
Ethereum Yellow Paper зазначає, що reentrancy є однією з найпоширеніших вразливостей смарт-контрактів. Наша система дозволяє мінімізувати ризики, а середній бюджет на таку систему становить $20k–$50k. Отримайте консультацію безкоштовно.
Приклад конфігурації детектора:
detector:
name: reentrancy
chain: ethereum
rpc_endpoint: https://mainnet.infura.io/v3/YOUR_KEY
threshold: 3
alert:
channels: [telegram, slack]
cooldown: 60s
Згідно з Ethereum Yellow Paper, reentrancy є однією з найпоширеніших вразливостей смарт-контрактів. Наша система дозволяє мінімізувати ризики.
Аудит смарт-контрактів: як знаходять те, що не бачить компілятор
Коли протокол втрачає значні кошти через 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 має сенс для контрактів, які: керують значним TVL, оновлюються рідко, мають чітко формалізовані інваріанти. Для продуктів, що швидко ітеруються, співвідношення витрат і користі не на користь верифікації.
Вектори атак, які пропускають джуніор‑аудитори
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.
Oracle manipulation через TWAP. Spot price — стандартна ціль для flash loan атаки. 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 |
Виведення коштів, несанкціоноване перенесення власності |
Завжди |
| High |
Маніпуляція, 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 понад значну суму. Гарантуємо, що в процесі ми не пропустимо жоден відомий вектор — використовуємо ліцензовані версії Slither та найкращі конфігурації fuzzer'ів. Запобігнуті збитки для клієнтів оцінюються в значну суму.
Оцініть ваш проект — ми безкоштовно проаналізуємо код і запропонуємо комерційну пропозицію протягом 2 днів. Замовте аудит з гарантією якості та отримайте знижку на re‑audit при повторному зверненні.