Аппрувы токенов ERC-20: как infinite allowance крадет все средства из кошелька

ERC-20 token approval
Каждый раз, когда вы подключаете MetaMask к новому DeFi-протоколу, вы открываете невидимый шлюз в свой кошелек. Механизм token approval (аппрув токенов), заложенный в стандарте ERC-20, позволяет смарт-контрактам управлять вашими активами без вашего дальнейшего участия. Удобно? Да. Опасно? Критически.
В июле 2024 года мост LI.FI потерял $11,6 млн из-за эксплуатации уязвимости в модуле unlimited approval — злоумышленник получил неограниченные права на вывод токенов из 153 кошельков. Это лишь один из тысяч случаев, когда infinite allowance превращает пользователей в банкоматы для хакеров.
По данным исследования UC Santa Barbara, уязвимость Approved Controllable TransferFrom (ACT) затронула более 32,000 смарт-контрактов, приведя к потерям свыше $65 млн. Ваши токены могут быть следующими.

Как работают аппрувы: механика разрешений

Базовый принцип ERC-20

Стандарт ERC-20 предусматривает три ключевые функции для управления токенами:
Когда вы взаимодействуете с DEX (Uniswap, 1inch) или DeFi-протоколом (Aave, Compound), вы вызываете approve(spender,amount), разрешая смарт-контракту списывать токены с вашего баланса.

Infinite allowance: ловушка удобства

Большинство DeFi-приложений по умолчанию запрашивают unlimited approval (максимальное значение 2^256 - 1 или type(uint256).max). Обоснование разработчиков: «чтобы пользователю не приходится платить gas за approve при каждой сделке».
Проблема: разрешив infinite allowance, вы предоставляете смарт-контракту право в любой момент забрать все ваши токены этого стандарта, даже те, которые вы получите в будущем. Если контракт взломан или является мошенническим — ваши средства под угрозой полного дрейна.

Векторы атаки: как крадут через аппрувы

1. Эксплуатация уязвимых контрактов (ACT-атаки)

Исследователи UC Santa Barbara выявили уязвимость Approved Controllable TransferFrom: если смарт-контракт позволяет атакующему контролировать параметры вызова transferFrom, он может украсть не только средства протокола, но и токены всех пользователей, одобривших этот контракт.
Механизм атаки:
  1. Пользователь одобряет контракт A на управление своими USDC
  2. Контракт A содержит уязвимость, позволяющую атакующему вызывать transferFrom с произвольными параметрами
  3. Атакующий инициирует перевод всех USDC пользователя на свой адрес
  4. Поскольку allowance бесконечен, транзакция исполняется без дополнительного подтверждения

2. Approval Race Condition (гонка разрешений)

Классическая уязвимость ERC-20: при попытке изменить allowance с 100 на 50 токенов, злоумышленник может фронтраннуть транзакцию и вывести 100 токенов по старому лимиту, а затем еще 50 по новому — всего 150 вместо разрешенных 50.
// Уязвимый код (упрощенно)
function _approve(address owner, address spender, uint256 value) internal {
    _allowances[owner][spender] = value; // Простая перезапись!
    emit Approval(owner, spender, value);
}

3. Фишинговые аппрувы

Мошеннические сайты имитируют популярные DeFi-протоколы и заставляют пользователей подписывать транзакции approve на адреса контрактов-воров. Пользователь думает, что одобряет Uniswap, а фактически разрешает неизвестному контракту вывести все токены.
Признаки фишингового аппрува:
  • Запрос на одобрение «нового моста» или «обновленного роутера»
  • Необычно высокий gas limit (обычно approve стоит дешево)
  • Адрес контракта не совпадает с официальным (проверяйте на Etherscan)

4. Эксплуатация Permit2 и современных стандартов

Даже «улучшенные» механизмы одобрения, такие как Permit2 от Uniswap Labs, не защищены от ACT-уязвимостей. Исследователи подтвердили эксплуатацию controllable Permit2.transferFrom в реальных контрактах.

Как проверить и отозвать опасные аппрувы

Инструменты для аудита разрешений

Инструмент Сети Особенности
Revoke.cash 100+ сетей Интуитивный интерфейс, оценка риска, история аппрувов

Etherscan Token Approvals Ethereum Официальный инструмент, детализация по ERC-20/721/1155

MetaMask Portfolio ETH, Polygon, BNB Chain Встроенная функция Spending Caps

BscScan/Polygonscan BSC, Polygon Аналоги Etherscan для альтернативных сетей

Unrekt, approved.zone, Cointool Мультисеть Специализированные анализаторы

Пошаговая инструкция по отзыву (Revoke.cash)

Подключение: Перейдите на revoke.cash и подключите кошелек (MetaMask, WalletConnect и др.

READ  ASIC-майнинг: зависимость от пула как уязвимость

Анализ: Платформа отобразит все активные аппрувы с указанием:

  • Контракта-получателя разрешения
  • Токена и суммы allowance
  • Возраста аппрува
  • Оценки потенциального риска
Отзыв: Нажмите «Revoke» рядом с подозрительным или устаревшим разрешением

Подтверждение: Оплатите gas fee за транзакцию отзыва (обычно $1-5 в зависимости от сети)

Важно: Отзыв аппрува — это on-chain транзакция, требующая gas. Если у вас нет ETH (или native токена сети) на оплату комиссии, отозвать разрешение невозможно.

Ручной отзыв через Etherscan

Для продвинутых пользователей:
  1. Перейдите в раздел More → Token Approvals на Etherscanё
  2. Введите адрес кошелька
  3. Включите Show all approvals для отображения всех разрешений
  4. Нажмите Revoke напротив подозрительного контракта

Профилактика: как не стать жертвой

Золотые правила безопасности

  1. Никаких infinite allowance
    Всегда устанавливайте точную сумму, необходимую для конкретной операции. В MetaMask нажмите «Edit permission» и замените «Default» на «Custom» с точным количеством токенов.
  2. Регулярный аудит
    Проверяйте активные аппрувы ежемесячно. Удаляйте разрешения для протоколов, которыми не пользуетесь более 30 дней.
  3. Проверка контрактов
    Перед аппрувом сверяйте адрес смарт-контракта с официальным сайтом протокола. Используйте блокчейн-эксплореры для анализа истории и верификации кода.
  4. Используйте increaseAllowance/decreaseAllowance
    При работе с современными токенами предпочитайте атомарные операции изменения лимита вместо прямого approve.
  5. Отдельные кошельки для DeFi
    Не храните основные сбережения на кошельке, активно используемом для фарминга и трейдинга. Используйте «горячий» кошелек с минимальным балансом для операций, а «холодный» — для хранения.

Технические меры защиты для разработчиков

Если вы разрабатываете смарт-контракты:
  • Используйте SafeERC20 от OpenZeppelin с safeIncreaseAllowance и safeDecreaseAllowance
  • Избегайте прямого контроля пользователя над параметрами transferFrom
  • Внедряйте two-step transfers и locking periods для критических операций
  • Проводите аудиты безопасности перед деплоем

Что делать, если средства уже украдены

Немедленные действия

  1. Отзовите все аппрувы через Revoke.cash или аналоги — это предотвратит дальнейший дрейн
  2. Проверьте другие токены — если один контракт скомпрометирован, проверьте все остальные аппрувы
  3. Создайте новый кошелек для дальнейших операций (старый считайте скомпрометированным)
  4. Зафиксируйте доказательства: хеши транзакций, адреса контрактов, скриншоты
  5. Обратитесь в правоохранительные органы при значительных суммах (в некоторых юрисдикциях криптовалютные кражи расследуются)

Важное ограничение

В отличие от банковских транзакций, отменить или вернуть on-chain перевод невозможно. Блокчейн необратим. Единственная защита — превентивная.

Заключение: аппрувы — это кредит доверия без срока давности

Механизм ERC-20 approval — фундаментальная уязвимость, заложенная в архитектуре Ethereum. Infinite allowance превращает смарт-контракты в потенциальных троянов, спящих в вашем кошельке до момента активации хакером.
Ключевые выводы:
  • Каждый infinite approval — это потенциальная потеря 100% баланса токена
  • Регулярный аудит через Revoke.cash обязателен для активных DeFi-пользователей
  • Предпочитайте точные лимиты бесконечным разрешениям
  • Устаревшие аппрувы — мёртвый груз, который может стоить вам всего
В мире DeFi ваша безопасность — ваша ответственность. Не становитесь очередным банкоматом для хакеров из-за лени проверить разрешения.
Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: