Доступ к своим средствам выдают тремя разными способами, и отзываются они по-разному. Классическое разрешение записывает лимит в контракт токена, и снимается оно транзакцией с нулевым лимитом. Подпись permit лимита в сети не создаёт до предъявления, поэтому отозвать её можно лишь сдвинув счётчик подписей. Делегирование по стандарту EIP-7702 передаёт контракту управление самим адресом и снимается подписью на нулевой адрес. Путаница между тремя механизмами и приводит к потерям.

Разрешение на расходование токена — это записанный в контракте токена лимит, в пределах которого указанный адрес вправе переводить ваши токены без вашего дополнительного подтверждения.

Как выглядит схема со стороны жертвы

Классический сюжет. Интерфейс просит разрешение на обмен, кошелёк показывает окно, человек подтверждает. Лимит неограниченный. Так предлагал интерфейс по умолчанию. Через четыре месяца адрес, получивший разрешение, переводит весь баланс токена, и права на это он получил не в день перевода, а в тот самый день, когда человек нажал подтверждение, и сохранял их всё время, пока разрешение никто не отзывал.

Второй сюжет тише и неприятнее. Окно кошелька просит не транзакцию, а подпись сообщения. Газ не тратится. Выглядит безобидно. Подписанное сообщение — это permit, и оно создаёт разрешение не в момент подписи, а в момент предъявления, который выбирает получатель подписи, а не вы. В истории адреса при этом не остаётся ни одной транзакции: подписи в сети нет, пока её не предъявили.

Третий сюжет появился после включения EIP-7702 в сети Ethereum. Одна подпись авторизации связывает адрес с контрактом, и дальше операции от имени адреса выполняет код этого контракта. Если контракт выбран неудачно, он распоряжается адресом почти полностью — об этом прямо сказано в самой спецификации стандарта. Разрешений на отдельные токены при таком сценарии не требуется вовсе, поскольку контракт действует уже не как получатель лимита по одному токену, а как сам адрес, от имени которого подписываются и отправляются операции.

Признаки, по которым распознаётся подмена

  • Окно кошелька просит подпись сообщения, а не транзакцию, при операции, которая должна стоить газ.
  • В разрешении выставлен неограниченный лимит там, где нужна конкретная сумма.
  • Срок действия подписи permit указан с запасом на месяцы вместо минут.
  • Получатель разрешения — адрес, не являющийся контрактом, или контракт без верифицированного исходника.
  • Кошелёк предупреждает о смене кода у вашего собственного адреса.
  • Запрос авторизации делегирования приходит от интерфейса, который его ничем не объясняет.
  • Один запрос объединяет подпись разрешения и подпись перевода.
Подпись сообщения не стоит газа и не оставляет следа в истории адреса, но может создавать права на ваши средства. Бесплатность подписи ничего не говорит о её последствиях.

Проверка за 60 секунд: что открыть и на что смотреть

Нужны кошелёк и обозреватель сети. Порядок общий для трёх механизмов. Шесть пунктов.

  1. Прочитайте тип запроса: транзакция или подпись сообщения. Это первое, что различает механизмы.
  2. Если подпись — найдите в ней поля получателя, суммы и срока действия.
  3. Если транзакция — проверьте вызываемый метод и значение лимита в аргументах.
  4. Откройте адрес получателя в обозревателе: контракт с верифицированным исходником или нет.
  5. Проверьте по своему адресу, не записан ли у него код: признак действующего делегирования.
  6. Просмотрите список действующих разрешений по токенам и сопоставьте с тем, чем пользуетесь.
Схема из шести шагов: различаем транзакцию и подпись сообщения, читаем поля получателя, суммы и срока, проверяем метод и лимит в транзакции, проверяем адрес получателя в обозревателе, смотрим код у своего адреса, сверяем список действующих разрешений
Схема из шести шагов: различаем транзакцию и подпись сообщения, читаем поля получателя, суммы и срока, проверяем метод и лимит в транзакции, проверяем адрес получателя в обозревателе, смотрим код у своего адреса, сверяем список действующих разрешений

Пятый шаг стал обязательным недавно. Обычный адрес кода не имеет, и появление кода означает, что к нему привязан контракт-делегат. По тексту спецификации EIP-7702, признак делегирования занимает 23 байта и выглядит как последовательность 0xef0100 с адресом контракта вслед за ней, а начальный байт 0xef выбран намеренно: он запрещён к исполнению отдельным стандартом, поэтому такой код обрабатывается особым образом. Увидели у своего адреса код — выясняйте, когда и чем он там появился.

Три механизма делегирования и как отзывается каждый

Таблица сводит те различия, из-за которых отзыв одного механизма не отменяет другого: все три живут в сети независимо друг от друга, и снятое разрешение на конкретный токен не трогает ни уже подписанный permit, ни действующее делегирование самого адреса.

Механизм Где возникает право Что видно до подтверждения Как отзывается
Разрешение по стандарту ERC-20 Запись лимита в контракте токена, созданная вашей транзакцией Транзакция с указанием получателя и суммы лимита, оплачивается газом Транзакция, выставляющая лимит этого получателя в ноль
Подпись permit по стандарту EIP-2612 Запись лимита появляется при предъявлении подписи получателем Подпись сообщения с полями получателя, суммы, счётчика и срока, газ не тратится Сдвиг счётчика подписей: любая следующая проведённая подпись обнуляет прежнюю
Делегирование по стандарту EIP-7702 Код контракта-делегата, привязанный к вашему адресу Запрос авторизации с указанием сети, адреса контракта и счётчика Новая авторизация на нулевой адрес: код адреса очищается
Разрешение, выданное контракту-посреднику Лимит у посредника плюс его внутренние записи о сроках Транзакция или подпись в адрес посредника, а не конечного приложения Отзыв и у токена, и во внутреннем учёте посредника — два действия
На 14 октября 2026 года стандарт EIP-7702 действует в сети Ethereum с обновления Pectra, активированного 7 мая 2025 года. Он вводит тип транзакции 0x04 с перечнем авторизаций, каждая из которых состоит из идентификатора сети, адреса контракта, счётчика и трёх полей подписи. Проведённая авторизация увеличивает счётчик адреса на единицу.

Из устройства стандарта следует практическое неудобство. Отзыв подписи permit, которую вы подписали, но которую ещё не предъявили, отдельной операцией не предусмотрен: счётчик сдвигается только проведением какой-нибудь подписи того же адреса для того же токена. Поэтому срок действия, указанный внутри самой подписи, остаётся единственным настоящим ограничителем, и разница между минутами и месяцами здесь определяет, сколько времени у подписи будет на то, чтобы сработать не вовремя. Что именно кошелёк показывает в окне подтверждения, разобрано в материале про вредоносную подпись транзакции.

Пошаговые действия, если деньги уже ушли

Возврат не гарантирован никем. Порядок ниже ограничивает ущерб. Начинайте с первого пункта.

  1. Снимите действующие разрешения по всем токенам, начиная с неограниченных по сумме.
  2. Проверьте свой адрес на наличие кода и при действующем делегировании подпишите авторизацию на нулевой адрес.
  3. Переведите остаток на адрес, ключ которого никогда не использовался для подписи разрешений.
  4. Выпишите хеши транзакций, адреса получателей и время по UTC.
  5. Подайте заявление через интернет-приёмную МВД или в отделение по месту жительства, приложив распечатку операций и расчёт суммы в рублях на дату события.
  6. Сохраните текст подписанного сообщения, если он остался в истории кошелька: это доказательство.
Снятие разрешения не возвращает уже переведённое. Отзыв закрывает дальнейший доступ к остатку, и этим его польза исчерпывается. Сервисы, обещающие вернуть ушедшее за процент, в обращениях читателей заканчиваются второй потерей.

Как закрыть дыру, чтобы не повторилось

  1. Выставляйте лимит разрешения под конкретную операцию, а не неограниченный по умолчанию.
  2. Требуйте короткий срок действия в подписях permit: минуты вместо месяцев.
  3. Раз в месяц просматривайте список действующих разрешений и снимайте неиспользуемые.
  4. Проверяйте наличие кода у своего адреса после каждой работы с незнакомым интерфейсом.
  5. Делегирование оформляйте только на контракт с верифицированным исходником и известным происхождением.
  6. Держите операционный адрес отдельно от адреса хранения: разрешения выдаются с первого.

Чек-лист

  • Тип запроса определён: транзакция или подпись сообщения.
  • Поля получателя, суммы и срока действия прочитаны до подтверждения.
  • Лимит разрешения ограничен суммой операции.
  • Срок действия подписи permit измеряется минутами.
  • Адрес получателя проверен в обозревателе на верифицированный исходник.
  • Код у собственного адреса проверен, действующих делегирований нет.
  • Список разрешений по токенам просмотрен за последний месяц.

Частые вопросы

Чем подпись permit отличается от обычного разрешения?

Моментом, когда право возникает. Обычное разрешение записывается в контракт вашей транзакцией сразу. Permit — это подпись, которая лежит у получателя и превращается в разрешение лишь тогда, когда он сам решит её предъявить. До предъявления в истории адреса нет ничего. Проверить такую подпись по сети нельзя.

Можно ли отозвать подпись permit?

Отдельной операции для этого стандарт не предусматривает. Подпись привязана к счётчику, и обнулить её можно, проведя любую следующую подпись того же адреса для того же токена: прежнее значение счётчика после этого становится недействительным. Практичнее не отзывать, а изначально ставить короткий срок.

Делегирование по EIP-7702 опаснее разрешения?

Оно шире по объёму. Разрешение касается одного токена и одной суммы, делегирование передаёт контракту управление самим адресом. Спецификация предупреждает прямо: неудачно сделанный делегат способен получить почти полный контроль над адресом подписанта, и ограничить этот контроль значением лимита, как в разрешении, не получится.

Как снять делегирование?

Подписать новую авторизацию, указав в ней нулевой адрес. По спецификации это очищает код адреса: признак делегирования не записывается, а хеш кода возвращается к пустому значению. Операция требует транзакции и газа. После неё адрес снова ведёт себя как обычный, без привязанного контракта и без возможности исполнять чужой код от вашего имени.

Нужно ли снимать старые разрешения, если адрес пустой?

Да, если вы планируете пользоваться им дальше. Разрешение живёт в контракте токена и от нулевого баланса никуда не исчезает: оно сработает на любую сумму, которая поступит на этот адрес позже, хоть через год. Снимайте разрешения до того, как заводите новые средства.

Вердикт

Разрешения токенов, подписи permit и делегирование по EIP-7702 решают одну задачу — выдать доступ — и устроены тремя разными способами. Практический вывод короток по форме и неудобен по исполнению: снятое разрешение на токен не отменяет ни лежащую у кого-то подпись, ни привязанный к адресу контракт. Проверять нужно все три, а не одно. Короткий срок в подписи и конкретный лимит в разрешении стоят дешевле любой уборки последствий.

Разборы инцидентов и предупреждения публикуем в Telegram-канале Cryptium.