Отзыв апрувов в Web3: защита кошелька от скрытых списаний
Апрув токенов — это разрешение, которое пользователь выдаёт смарт-контракту на списание активов. Пока разрешение действует, контракт может вызывать transferFrom() в пределах установленного лимита.

Если лимит неограниченный, потенциальный объём списания определяется уже не интерфейсом приложения, а балансом токенов на кошельке.
Отзыв апрувов криптовалюта инструкция сводится к одной операции: значение allowance для конкретной пары «токен — spender» нужно установить в ноль либо заменить на ограниченную сумму. Простое отключение сайта от кошелька этого не делает. Disconnect Site разрывает соединение интерфейса с кошельком, но не изменяет состояние разрешения в блокчейне.
Механика апрувов: что именно получает смарт-контракт
В ERC-20 разрешение создаётся через функцию approve(). Она принимает два параметра:
1. spender — адрес, которому разрешено распоряжаться токенами.
2. amount — максимальное количество токенов, доступное для списания.
После подтверждения транзакции смарт-контракт, связанный с адресом spender, может вызвать transferFrom() и перевести активы с пользовательского адреса. Списание происходит при выполнении условий, заложенных в коде контракта. Пользователю не обязательно подписывать отдельную транзакцию на каждый перевод.
В интерфейсе DeFi-протокола этот процесс обычно выглядит как две операции. Сначала пользователь подтверждает апрув токена. Затем подписывает сам обмен, депозит, вывод или другое действие. Если приложение предлагает установить максимальный лимит, контракт получает разрешение на объём, который может значительно превышать текущую операцию.
Упрощённая логика выглядит так:
- кошелёк владеет токенами;
- пользователь вызывает
approve(spender, amount); - блокчейн записывает разрешение;
spenderполучает возможность использоватьtransferFrom();- разрешение сохраняется до его изменения или отзыва.
Апрув не означает, что средства немедленно ушли. Это право на последующее списание. Риск появляется в момент, когда адрес или код spender становятся вредоносными, взламываются либо используются через фишинговый интерфейс.
Какие разрешения требуют внимания
На практике встречаются несколько вариантов:
| Тип разрешения | Что означает | Технический риск |
|---|---|---|
| Ограниченный апрув | Контракт может списать указанное количество токенов | Риск ограничен размером amount, но не исключён |
| Неограниченный апрув | Контракт получает лимит, рассчитанный на очень большой объём токенов | При компрометации spender под угрозой может оказаться весь баланс этого токена |
| Нулевой allowance | Списание через данное разрешение невозможно | Для восстановления доступа потребуется новый апрув |
| Permit-подпись | Одобрение подписывается вне блокчейна и затем активируется через permit() | Отсутствует газ в момент подписи, но сохраняется риск фишинга подписи |
Не каждый старый апрув является уязвимостью. Если контракт проверен, адрес соответствует официальному протоколу, а разрешение ограничено объёмом операции, риск ниже. Но состояние нужно анализировать отдельно для каждой сети и каждого токена. Разрешение в Ethereum не отменяет такое же разрешение в BNB Chain, Polygon, Arbitrum или другой сети.
Апрув — это запись в состоянии токена, а не подключение сайта к кошельку. Удаление подключения не удаляет запись из блокчейна.
Почему кнопка Disconnect не защищает кошелёк
В кошельках обычно есть несколько независимых механизмов:
- подключение сайта к пользовательскому интерфейсу кошелька;
- подписи сообщений;
- разрешения токенов;
- разрешения NFT;
- лимиты расходов в smart account;
- разрешения, выданные отдельным смарт-контрактам.
Кнопка отключения сайта воздействует только на первый пункт. После её нажатия dApp больше не видит активную сессию через данный интерфейс. Уже подтверждённая транзакция approve() продолжает существовать в блокчейне.
Это различие имеет практическое значение. Пользователь мог взаимодействовать с протоколом несколько месяцев назад, отключить сайт и считать кошелёк очищенным. Если тогда был выдан неограниченный апрув, контрактный адрес всё ещё может попытаться использовать его. Для этого не требуется повторное посещение сайта.
Ситуация меняется, если:
- протокол был взломан;
- ключ владельца контракта скомпрометирован;
- в контракте обнаружен эксплойт;
- официальный домен заменён фишинговым интерфейсом;
- пользователь выдал разрешение поддельному токену или ложному spender;
- адрес контракта был заменён после обновления системы.
Отключение dApp не отзывает allowance. Оно также не отменяет ранее подписанные разрешения, включая некоторые варианты Permit. Если подпись уже передана злоумышленнику, она может быть активирована on-chain без повторного визита пользователя на сайт.
Как отличить операции
| Действие | Что меняется | Нужна on-chain транзакция |
|---|---|---|
| Disconnect Site | Соединение сайта с кошельком | Нет |
| Отзыв ERC-20 апрува | Значение allowance для spender | Да |
| Сброс лимита расходов | Spending cap в поддерживаемом кошельке или smart account | Да |
| Отмена Permit до активации | Зависит от реализации токена и протокола | Обычно требуется отдельный механизм |
| Перевод активов на новый адрес | Баланс перемещается | Да |
Disconnect может быть полезен как мера против повторного взаимодействия с подозрительным сайтом. Но это не операция очистки разрешений.
Как проверить разрешения смарт-контрактов
Проверка должна выполняться по сетям, в которых использовался кошелёк. Один адрес может иметь разные наборы allowance в нескольких блокчейнах. Сервисы для отзыва апрувов получают данные из сетей и показывают токен, spender, лимит и возможность сброса.
Алгоритм проверки:
1. Открыть сервис отзыва разрешений через адрес, введённый вручную или сохранённый в официальном источнике.
2. Подключить кошелёк только к проверенному домену.
3. Выбрать нужную сеть.
4. Просмотреть список ERC-20-разрешений.
5. Отдельно проверить токены с неограниченным лимитом.
6. Сопоставить адрес spender с официальным адресом протокола.
7. Отозвать разрешения, которые больше не используются.
8. Повторить проверку в остальных сетях.
9. Убедиться, что после подтверждения значение allowance стало равно нулю.
Revoke.cash, согласно данным проекта, поддерживает более 100 сетей. К 2026 году через сервис было отменено более 20 миллионов токен-апрувов для более чем 2 миллионов пользователей. Эти показатели описывают объём обработанных операций, но не превращают любую отображаемую запись в автоматически доказанную угрозу. Адрес spender всё равно нужно сопоставлять с конкретным протоколом.
Похожую проверку можно выполнять через функции, встроенные в некоторые кошельки и обозреватели блокчейнов. Интерфейс отличается, но техническая операция та же: отправляется транзакция, которая изменяет allowance.
Что анализировать в списке разрешений
Список не следует сортировать только по дате. Более информативны следующие признаки:
- токен, для которого выдано разрешение;
- адрес spender;
- величина allowance;
- сеть;
- наличие официальной связи spender с известным протоколом;
- факт последнего использования;
- соответствие разрешения текущей стратегии пользователя;
- возможность установить лимит вместо полного отзыва.
Отдельно нужно смотреть на неиспользуемые разрешения старых мостов, агрегаторов, фарминговых платформ и NFT-маркетплейсов. Контракт может больше не использоваться пользователем, но запись allowance останется активной.
Если протокол используется регулярно, полное обнуление разрешения потребует нового апрува при следующей операции. Это не техническая ошибка. Это обычный компромисс между удобством и уменьшением поверхности риска.
Как отозвать апрувы токенов через специализированный сервис
Полный отзыв — это установка allowance = 0. Для этого подписывается и отправляется транзакция в сети, где существует соответствующее разрешение. Потребуется нативный актив для оплаты газа. Точная комиссия зависит от блокчейна, загрузки сети и текущей стоимости газа.
Порядок действий:
1. Выбрать сеть.
Начинать нужно не с токена, а с блокчейна. В каждой сети разрешения хранятся отдельно.
2. Проверить домен сервиса.
Фишинговые копии могут повторять интерфейс известных инструментов. Адрес сайта нельзя брать из случайного сообщения, рекламы или ответа в чате.
3. Подключить кошелёк.
Само подключение не списывает токены. Но окно кошелька нужно читать полностью. Особое внимание требуется к запрашиваемому типу подписи и адресу контракта.
4. Найти нужный апрув.
В карточке должны быть видны токен, spender и текущий лимит. Если сервис показывает неизвестный адрес, это повод остановить операцию и проверить контракт через обозреватель или официальный источник протокола.
5. Нажать на отзыв.
Сервис формирует транзакцию на изменение allowance. Кошелёк показывает сеть, контракт и комиссию.
6. Проверить данные в кошельке.
Для стандартного отзыва конечное значение разрешения должно быть равно нулю. Если вместо этого предлагается безлимитный апрув, подпись нужно отклонить.
7. Дождаться подтверждения.
Пока транзакция не включена в блок, состояние allowance может оставаться прежним.
8. Обновить список.
После подтверждения нужно проверить запись повторно. Отзыв в одной сети не меняет разрешения в других.
Нельзя считать успешным отзывом простое исчезновение записи из пользовательского интерфейса. Интерфейс может обновиться с задержкой или использовать кэш. Контрольный источник — состояние контракта в блокчейне.
Полный отзыв и уменьшение лимита
Есть два рабочих сценария:
- установить allowance в ноль;
- заменить большой лимит на сумму, необходимую для конкретного действия.
Полный отзыв безопаснее с точки зрения остаточного разрешения. Ограниченный лимит экономит одну последующую операцию, если протокол нужен в ближайшее время. Однако ограничение не устраняет риск полностью. Вредоносный spender сможет списать разрешённую сумму.
Некоторые токены имеют нестандартную реализацию approve(). Для них может потребоваться сначала установить allowance в ноль, а затем выдать новое значение. Это ограничение связано с логикой конкретного токена. Если кошелёк или сервис формирует две транзакции, это не обязательно признак атаки. Данные каждой транзакции всё равно нужно проверить.
Как отозвать апрувы в MetaMask
В MetaMask отмена лимитов расходов доступна через веб-интерфейс MetaMask Portfolio во вкладке Spending Caps. Пользователь выбирает разрешение и сбрасывает лимит до нуля. Для изменения состояния требуется on-chain транзакция с оплатой gas fee.
Последовательность:
1. Открыть MetaMask Portfolio через официальный интерфейс.
2. Перейти в раздел Spending Caps.
3. Выбрать нужную сеть и разрешение.
4. Найти токен и получателя лимита.
5. Проверить, что выбран именно тот spender, которому ранее выдавался доступ.
6. Инициировать сброс лимита.
7. Подтвердить транзакцию в MetaMask.
8. Дождаться включения транзакции в блок.
9. Проверить, что значение лимита стало нулевым.
Название Spending Caps относится к лимитам расходов, а не к отключённым сайтам. Если dApp просто удалён из списка подключённых ресурсов, это не означает, что его контрактные разрешения сброшены.
MetaMask и другие кошельки могут показывать операции в разных форматах. В одном случае пользователь видит разрешение на конкретное количество токенов. В другом — лимит, связанный с smart account или отдельным модулем. Нельзя переносить логику обычного внешнего аккаунта на smart account без проверки реализации.
Permit и безгазовые подписи
Стандарт EIP-2612 меняет последовательность выдачи разрешения. Пользователь подписывает структуру EIP-712 вне блокчейна. Затем протокол или другой участник передаёт эту подпись в контракт, который вызывает permit() и активирует разрешение on-chain.
На этапе подписи пользователь может не платить газ. Это и называют gasless approval. Но отсутствие комиссии не означает отсутствие риска.
Ключевые параметры Permit:
- адрес владельца;
- адрес spender;
- количество токенов;
- nonce;
- срок действия;
- домен подписи;
- идентификатор сети;
- адрес контракта токена.
Фишинговый сайт может предложить подписать Permit под видом входа, подтверждения операции или получения бонуса. Если подпись содержит вредоносный spender и большой лимит, злоумышленник сможет активировать её самостоятельно, пока не истёк срок действия или пока разрешение не было нейтрализовано предусмотренным механизмом.
Поэтому окно подписи EIP-712 нужно проверять так же строго, как обычную транзакцию. Формулировка о том, что подпись выполняется вне сети, не является основанием для автоматического подтверждения.
Gasless не означает riskless. Комиссия может быть нулевой, но разрешение всё равно может дать spender право на списание токенов.
У Permit есть дополнительные параметры, которых нет в привычной кнопке approve. Особое значение имеет deadline. Если срок действия длительный или фактически не ограничен, украденная подпись сохраняет ценность дольше. Nonce защищает от повторного использования одной и той же подписи, но не делает саму подпись безопасной, если пользователь подтвердил неверный spender.
Фишинговые атаки на сервисы отзыва
Отзыв апрува требует отдельной транзакции. Это создаёт возможность для атак на сам процесс очистки кошелька. Злоумышленнику не обязательно убеждать пользователя снова выдать большой апрув. Достаточно подменить контракт, функцию или токен в интерфейсе отзыва.
В июле 2023 года в BNB Chain фиксировалась схема с фальшивыми токенами DAI. Пользователям предлагалось отозвать разрешение через Revoke.cash или Rabby. Поддельный токен изменял логику approve(): вместо обычного отзыва операция могла минтить газовые токены вроде CHI, после чего средства в BNB списывались под видом оплаты комиссии.
Технический вывод из этого инцидента ограничен, но однозначен: сам факт, что операция называется revoke, не подтверждает её безопасность. Проверять нужно фактический контракт и calldata.
Признаки подозрительной операции:
1. Неверный адрес токена.
Название DAI или другого актива не доказывает подлинность контракта. В сети могут существовать токены с идентичными символами.
2. Неожиданный получатель.
Для отзыва разрешения spender должен соответствовать существующей записи allowance. Неизвестный адрес требует остановки.
3. Запрос на безлимитный апрув.
Сервис отзыва не должен требовать выдавать новый бесконечный доступ, чтобы отменить старый.
4. Несоответствующая сеть.
Транзакция в BNB Chain не отменяет allowance в Ethereum. Если интерфейс показывает одну сеть, а кошелёк просит подтвердить другую, операцию нужно отклонить.
5. Скрытое изменение баланса.
Для обычного отзыва токены не должны переводиться третьему лицу. Изменение allowance и перевод активов — разные типы действий.
6. Необычный gas limit или дополнительные вызовы.
Высокая комиссия сама по себе не доказывает атаку. Но лишние внутренние вызовы и незнакомые контракты требуют проверки.
7. Принуждение срочностью.
Формулировки о немедленной угрозе, ограниченном времени или обязательном подтверждении не являются техническим доказательством.
Нельзя подписывать транзакцию только потому, что на странице отображается знакомый логотип. Логотип находится вне консенсуса блокчейна. Адрес контракта и декодированные параметры находятся внутри проверяемой транзакции.
Что делать, если кошелёк уже взаимодействовал с подозрительным сайтом
Действия зависят от того, что именно было подписано:
- если сайт только подключался, нужно отключить соединение и проверить разрешения;
- если был выдан ERC-20-апрув, его нужно отозвать;
- если была подписана Permit-структура, нужно определить spender, лимит и срок действия;
- если активы уже списываются, отзыв может оказаться недостаточным;
- если скомпрометирован приватный ключ или seed-фраза, новый кошелёк создаётся отдельно, а не на том же устройстве с тем же секретом.
Отзыв разрешения не возвращает уже переведённые активы. Он также не отменяет другие разрешения, выданные тому же или другому контракту. Проверка должна охватывать все активы и сети, с которыми работал адрес.
Если на кошельке остался актив для оплаты газа, нельзя автоматически считать его защищённым. Вредоносный контракт может иметь отдельное разрешение на токены, но не на нативный актив. Однако при попытке отзыва пользователь всё равно должен следить, чтобы транзакция не содержала лишних действий.
Практический порядок обслуживания Web3-кошелька
Регулярный контроль не требует постоянного удаления всех разрешений. Рабочая схема состоит из нескольких операций:
- после завершения работы с протоколом закрывать ненужные разрешения;
- для краткосрочных операций выбирать ограниченный allowance;
- проверять разрешения во всех используемых сетях;
- не хранить значительные остатки на адресе, который регулярно подключается к новым dApp;
- разделять кошелёк для экспериментов и кошелёк для долгосрочного хранения;
- проверять адреса контрактов через официальную документацию и обозреватель;
- не подписывать EIP-712 без анализа домена, spender и лимита;
- сохранять нативный актив для комиссии только в необходимом объёме;
- после отзыва проверять on-chain состояние, а не только интерфейс сервиса.
Разделение кошельков не отменяет необходимость отзывать апрувы. Оно уменьшает последствия ошибки. Если экспериментальный адрес взаимодействует с неизвестным контрактом, долгосрочный баланс находится в другом контуре риска.
Не следует выдавать универсальный совет отзывать абсолютно всё. Такой подход увеличивает число транзакций и комиссий. Рациональная цель — убрать неиспользуемые и неподтверждённые разрешения, а рабочие лимиты сократить до необходимого уровня.
Итоговый вердикт
Апрув ERC-20 — это контрактное разрешение на вызов transferFrom(). Неограниченный allowance для взломанного или вредоносного spender создаёт прямой риск списания токенов.
Disconnect Site — не отзыв апрува. MetaMask Portfolio позволяет сбросить Spending Caps через транзакцию с оплатой газа. Revoke.cash поддерживает более 100 сетей и используется для проверки и отмены разрешений, но сам сервис необходимо открывать через проверенный домен. Permit по EIP-2612 снижает количество on-chain действий, но не устраняет фишинговые риски.
Бинарный вывод:
- хранить старые неограниченные апрувы без проверки — небезопасно;
- отзывать неиспользуемые разрешения и проверять новые подписи по адресу spender и лимиту — безопасно;
- считать кнопку Disconnect очисткой кошелька — небезопасно;
- подписывать транзакцию отзыва без проверки контракта и сети — небезопасно.