Какие уязвимости мы ищем в смарт-контрактах?
Мы проводим многоуровневый пентест криптопроектов, который выходит далеко за рамки стандартного 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-летним опытом помогут защитить ваши средства.







