Які вразливості ми шукаємо в смарт-контрактах?
Ми проводимо багаторівневий пентест криптопроєктів, який виходить далеко за рамки стандартного web application pentest плюс Slither. Це робота зі смарт-контрактами, інфраструктурою, frontend, bridges, backend API та соціальною інженерією. Ronin Bridge втратив $625M не через уразливість у контракті — через компрометацію 5 з 9 validator ключів через spear phishing, згідно з аналізом Ronin Bridge. Наш досвід показує, що ефективний пентест повинен покривати всі вектори атаки.
Пентест криптопроєкту вимагає глибокого розуміння як Solidity, так і архітектури L2 rollups, механізмів консенсусу та економіки DeFi. Без комплексного підходу легко пропустити критичні уразливості, такі як маніпуляція оракулами або реорганізація транзакцій (reorg). Автоматичні інструменти знаходять близько 30% проблем, решту — лише ручний аналіз. Тому ми комбінуємо Slither, Mythril та Aderyn з багатогодинним рев'ю коду. Кожна уразливість класифікується за CVSS, для критичних ми надаємо PoC за лічені години після виявлення. У портфоліо — понад 200 перевірених проєктів, включаючи топ-10 DeFi протоколів за TVL. Ми тестуємо не лише контракти, а й інфраструктуру: RPC ноди, bridge релеї, validator keys management, а також frontend dApp на предмет компрометації supply chain. Кожен компонент може стати точкою входу для атаки.
Статичний аналіз контрактів
Початок будь-якого пентесту контрактів — автоматизовані інструменти:
# Slither — статичний аналізатор від Trail of Bits slither . --print human-summary slither . --detect reentrancy-eth,reentrancy-no-eth,arbitrary-send-eth slither . --triage-mode # Mythril — symbolic execution myth analyze contracts/Vault.sol --solv 0.8.20 # Aderyn — Rust-based аналізатор, швидший за Slither для великих кодових баз aderyn . Автоматичні інструменти знаходять низько висячі плоди: неправильний порядок операцій, невикористані return values, reentrancy в очевидних місцях. Але критичні уразливості вони знаходять рідко. Ручне рев'ю виявляє в 3 рази більше проблем, а для критичних — в 5 разів більше.
Ручний аналіз контрактів
Фокусні області для мануального рев'ю:
Access control: перевіряємо, хто може викликати privileged функції, коректність onlyOwner / AccessControl, відсутність backdoor через конструктор або initializer.
// Класична помилка: ініціалізатор можна викликати повторно contract VulnerableProxy { bool private initialized; function initialize(address _admin) external { // УРАЗЛИВІСТЬ: немає перевірки !initialized admin = _admin; } } // Правильно: function initialize(address _admin) external { require(!initialized, "Already initialized"); initialized = true; admin = _admin; } Price oracle manipulation: перевіряємо, чи використовуються spot ціни замість TWAP. Flash loan атака на oracle може призвести до повної втрати коштів.
// Уразливо: spot price з AMM пулу function getPrice() external view returns (uint256) { (uint112 reserve0, uint112 reserve1,) = pair.getReserves(); return uint256(reserve1) * 1e18 / uint256(reserve0); } // Правильно: TWAP через Uniswap V3 оракул function getTWAPPrice(uint32 twapInterval) external view returns (uint256) { uint32[] memory secondsAgo = new uint32[](2); secondsAgo[0] = twapInterval; secondsAgo[1] = 0; (int56[] memory tickCumulatives,) = pool.observe(secondsAgo); int56 tickDelta = tickCumulatives[1] - tickCumulatives[0]; int24 tick = int24(tickDelta / int56(uint56(twapInterval))); return OracleLibrary.getQuoteAtTick(tick, 1e18, token0, token1); } Signature validation: правильна перевірка EIP-712 підписів, захист від replay атак через nonce та chainId.
Економічні атаки
Flash loan атаки на AMM протоколи потребують глибокого розуміння механіки пулів. Ми симулюємо їх у Foundry:
// Симуляція flash loan атаки через Foundry // forge test --match-test testFlashLoanAttack -vvv function testFlashLoanAttack() public { uint256 flashAmount = 1000 ether; vm.deal(address(attacker), flashAmount); uint256 priceBefore = target.getPrice(); attacker.manipulatePool(flashAmount); uint256 priceAfter = target.getPrice(); console.log("Price manipulation:", priceBefore, "->", priceAfter); uint256 profit = attacker.exploit(); attacker.repayFlash(flashAmount); assertGt(profit, 0, "Attack should be profitable"); } Чому пентест криптопроєкту складніший за звичайний веб-аудит?
Ми тестуємо не лише API та frontend, а й інфраструктуру блокчейн-нод, bridge контракти, механізми консенсусу валідаторів.
Frontend безпека
Wallet drainer injection: найчастіша атака на dApp — компрометація frontend через supply chain. Перевіряємо наявність Subresource Integrity (SRI) хешів, CSP заголовки, integrity в lockfile. Також шукаємо clipboard hijacking через XSS.
Фішинг через typosquatting: реєстрація схожих доменів. Включаємо в аудит перевірку моніторингу таких доменів та DNS алертингу.
Інфраструктурний аудит
RPC endpoint безпека: перевіряємо, чи відкритий RPC публічно, чи є аутентифікація, методи whitelist.
Приклад перевірки RPC
curl -X POST http://node-ip:8545 \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","method":"eth_accounts","id":1}' Якщо повертає акаунти — критична уразливість.
Приватні ключі та секрети: аудит управління deploy-ключами (HSM, AWS KMS), перевірка .env файлів у git history, ротація ключів при звільненнях.
Admin panel exposure: пошук незахищених admin інтерфейсів (Grafana, Jenkins, Kibana), перевірка MFA та IP whitelist.
Bridge та cross-chain специфіка
Bridge контракти — найбільш ризиковий компонент. Специфічні перевірки:
- Replay attack: підпис має включати chainId та унікальний nonce.
// Уразливо: немає chainId у підписі bytes32 hash = keccak256(abi.encode(recipient, amount, nonce)); // Правильно: EIP-712 з chainId bytes32 hash = keccak256(abi.encode( BRIDGE_TYPEHASH, recipient, amount, nonce, block.chainid )); - Validator key management: перевіряємо, скільки ключів потрібно скомпрометувати. У Ronin Bridge ефективний threshold був 2/2, незважаючи на 9 валідаторів. Ми моделюємо такі сценарії.
- Finality assumptions: bridge має чекати фінальності блоку (для Ethereum — 12+ блоків, для BSC — більше).
Етапи аудиту
| Етап | Що робимо | Приклад тривалості |
|---|---|---|
| Аналітика | Вивчення архітектури, виділення критичних компонентів | 1-3 дні |
| Автоматичний аналіз | Прогін Slither, Mythril, Aderyn, аналіз звітів | 1-2 дні |
| Ручне рев'ю | Детальна перевірка коду, бізнес-логіки, економіки | 3-15 днів |
| Тестування | Foundry-симуляції, fuzzing, економічні атаки | 2-5 днів |
| Складання звіту | Опис уразливостей, PoC, рекомендації | 1-2 дні |
Що входить у звіт
Структура фінального репорту:
| Рівень | Опис |
|---|---|
| Critical | Пряма втрата коштів, негайна експлуатація |
| High | Значний ризик за певних умов |
| Medium | Логічні помилки, потенційний DoS |
| Low/Informational | Best practices, покращення |
Для кожної finding: опис, Proof of Concept (код), потенційний impact, рекомендації, статус після ремедіації. Додатково ми надаємо чек-лист перевірок та консультацію щодо виправлення.
Орієнтовні терміни
Повний пентест займає від 2 до 6 тижнів залежно від складності проєкту. Вартість розраховується індивідуально — напишіть нам для оцінки вашого проєкту. Ми гарантуємо конфіденційність та підписуємо NDA.
Замовте аудит вашого криптопроєкту, щоб виявити уразливості, які пропускають автоматичні сканери. Отримайте консультацію з безпеки — наші інженери з 10-річним досвідом допоможуть захистити ваші кошти.







