Апрув токена - это разрешение, которое ты даёшь смарт-контракту на перемещение твоих ERC-20. Каждый раз при использовании DEX, лендинг-протокола или NFT-маркетплейса ты подписываешь транзакцию апрува. Если апрув безлимитный, а контракт оказывается вредоносным или взломанным - он может опустошить всё одной транзакцией.
Как это работает технически
У ERC-20 токенов (USDC, WETH, UNI и тысяч других) есть функция approve(spender, amount). При её вызове:
spender- адрес контракта (роутер DEX, лендинг-пул и т.д.)amount- сколько токенов этот контракт вправе переместить с твоего кошелька
Большинство кошельков и dApp запрашивают amount = 2^256 - 1 - фактически безлимит. Логика простая: один раз апрувнул - пользуйся всегда. Проблема: апрув активен до отзыва. Если контракт-получатель взломают или он окажется вредоносным, он опустошит всё за одну транзакцию.
Почему безлимитные апрувы стали стандартом
До EIP-2612 (permit-подписи) каждое ERC-20-взаимодействие требовало отдельной on-chain транзакции апрува. Чтобы не платить двойной газ, протоколы стали запрашивать безлимитные апрувы сразу. В 2020 году это был разумный компромисс. Сегодня, с ростом TVL и более изощрёнными атаками, это существенный риск, о котором большинство пользователей не подозревает.
Как дрейнеры кошельков эксплуатируют апрувы
Схема атаки прямая:
- Взаимодействуешь с dApp, похожим на настоящий (фейковый аирдроп, копия DEX, фишинг).
- dApp просит подписать апрув. UI показывает название токена. Spender - контракт-дрейнер атакующего.
- Подписываешь. Транзакция выглядит обычно.
- Дрейнер вызывает
transferFrom(твойКошелёк, кошелёкАтакующего, maxUint256)и опустошает баланс.
Для атаки не нужен твой приватный ключ. Нужен только выданный тобой апрув.
Как проверить текущие апрувы
Сканер апрувов Web3defender читает on-chain allowances и помечает:
- Безлимитные апрувы (amount =
MAX_UINT256) - Апрувы неверифицированным или недавно задеплоенным контрактам
- Апрувы, не использовавшиеся месяцами (устаревшие)
- Апрувы контрактам из списка вредоносных GoPlus
Сканер покрывает Ethereum, BSC, Polygon, Arbitrum и Base.
Как отозвать апрувы
- Открой сканер апрувов Web3defender или revoke.cash.
- Подключи кошелёк.
- Выбери апрувы для удаления.
- Подпиши транзакцию отзыва (по одной на каждый апрув, стоит газ).
Если контракт, которому ты выдал апрув, был взломан - переведи токены на чистый кошелёк до отзыва. Когда токены ушли с адреса, безлимитный апрув для атакующего бесполезен.
Как защититься
- Апрувай точные суммы. В некоторых dApp есть поле “custom amount”. Используй его.
- Используй EIP-2612 permit там, где доступно. Permit - офлайн-подпись с истечением. Постоянного on-chain allowance не создаёт.
- Отзывай апрувы после каждой сессии для ценных токенов: USDC, WETH, USDT.
- Проверяй новые dApp в Web3defender до любых апрувов. Фишинговый сайт визуально неотличим от оригинала.
- Используй отдельный горячий кошелёк для DeFi. Долгосрочные активы - в холодный кошелёк, который никогда не подписывает апрувы.
Разница между апрувом и permit
Апрув (approve) | Permit (EIP-2612) | |
|---|---|---|
| On-chain? | Да, стоит газ | Нет, офлайн-подпись |
| Сохраняется? | До отзыва | До истечения или использования |
| Риск | Постоянный, пока не отзовёшь | Истекает автоматически |
| Доступен для | Всех ERC-20 токенов | Токенов с поддержкой EIP-2612 |
USDC, DAI и WETH поддерживают permit. Если dApp это поддерживает - используй permit.
FAQ
Отзыв апрувов стоит газ? Да. Каждый отзыв - транзакция. В Ethereum mainnet: $2-$10 в зависимости от цены газа. В BSC или Polygon: менее $0,10.
Если апрув безлимитный, но контракт прошёл аудит - я в безопасности? Нет. Аудиты снижают риск, но не устраняют его. Контракт можно взломать через уязвимость, которую аудит пропустил. Ограниченные апрувы всегда безопаснее.
Меня уже опустошили. Деньги вернут? Средства, ушедшие через апрув, как правило, невозвратны. Транзакция валидна и необратима. Сообщи в местные органы и команду протокола. Немедленно отзови все оставшиеся апрувы, чтобы остановить дальнейшие потери.
Может ли dApp вывести токены, которые я не апрувил? Нет. Контракт может перемещать только явно апрувнутые токены. Для вывода нативного ETH или BNB нужна другая атака: вредоносный вызов контракта, переводящий средства напрямую, а не через transferFrom.