Доступ к своим средствам выдают тремя разными способами, и отзываются они по-разному. Классическое разрешение записывает лимит в контракт токена, и снимается оно транзакцией с нулевым лимитом. Подпись permit лимита в сети не создаёт до предъявления, поэтому отозвать её можно лишь сдвинув счётчик подписей. Делегирование по стандарту EIP-7702 передаёт контракту управление самим адресом и снимается подписью на нулевой адрес. Путаница между тремя механизмами и приводит к потерям.
Как выглядит схема со стороны жертвы
Классический сюжет. Интерфейс просит разрешение на обмен, кошелёк показывает окно, человек подтверждает. Лимит неограниченный. Так предлагал интерфейс по умолчанию. Через четыре месяца адрес, получивший разрешение, переводит весь баланс токена, и права на это он получил не в день перевода, а в тот самый день, когда человек нажал подтверждение, и сохранял их всё время, пока разрешение никто не отзывал.
Второй сюжет тише и неприятнее. Окно кошелька просит не транзакцию, а подпись сообщения. Газ не тратится. Выглядит безобидно. Подписанное сообщение — это permit, и оно создаёт разрешение не в момент подписи, а в момент предъявления, который выбирает получатель подписи, а не вы. В истории адреса при этом не остаётся ни одной транзакции: подписи в сети нет, пока её не предъявили.
Третий сюжет появился после включения EIP-7702 в сети Ethereum. Одна подпись авторизации связывает адрес с контрактом, и дальше операции от имени адреса выполняет код этого контракта. Если контракт выбран неудачно, он распоряжается адресом почти полностью — об этом прямо сказано в самой спецификации стандарта. Разрешений на отдельные токены при таком сценарии не требуется вовсе, поскольку контракт действует уже не как получатель лимита по одному токену, а как сам адрес, от имени которого подписываются и отправляются операции.
Признаки, по которым распознаётся подмена
- Окно кошелька просит подпись сообщения, а не транзакцию, при операции, которая должна стоить газ.
- В разрешении выставлен неограниченный лимит там, где нужна конкретная сумма.
- Срок действия подписи permit указан с запасом на месяцы вместо минут.
- Получатель разрешения — адрес, не являющийся контрактом, или контракт без верифицированного исходника.
- Кошелёк предупреждает о смене кода у вашего собственного адреса.
- Запрос авторизации делегирования приходит от интерфейса, который его ничем не объясняет.
- Один запрос объединяет подпись разрешения и подпись перевода.
Проверка за 60 секунд: что открыть и на что смотреть
Нужны кошелёк и обозреватель сети. Порядок общий для трёх механизмов. Шесть пунктов.
- Прочитайте тип запроса: транзакция или подпись сообщения. Это первое, что различает механизмы.
- Если подпись — найдите в ней поля получателя, суммы и срока действия.
- Если транзакция — проверьте вызываемый метод и значение лимита в аргументах.
- Откройте адрес получателя в обозревателе: контракт с верифицированным исходником или нет.
- Проверьте по своему адресу, не записан ли у него код: признак действующего делегирования.
- Просмотрите список действующих разрешений по токенам и сопоставьте с тем, чем пользуетесь.

Пятый шаг стал обязательным недавно. Обычный адрес кода не имеет, и появление кода означает, что к нему привязан контракт-делегат. По тексту спецификации EIP-7702, признак делегирования занимает 23 байта и выглядит как последовательность 0xef0100 с адресом контракта вслед за ней, а начальный байт 0xef выбран намеренно: он запрещён к исполнению отдельным стандартом, поэтому такой код обрабатывается особым образом. Увидели у своего адреса код — выясняйте, когда и чем он там появился.
Три механизма делегирования и как отзывается каждый
Таблица сводит те различия, из-за которых отзыв одного механизма не отменяет другого: все три живут в сети независимо друг от друга, и снятое разрешение на конкретный токен не трогает ни уже подписанный permit, ни действующее делегирование самого адреса.
| Механизм | Где возникает право | Что видно до подтверждения | Как отзывается |
|---|---|---|---|
| Разрешение по стандарту ERC-20 | Запись лимита в контракте токена, созданная вашей транзакцией | Транзакция с указанием получателя и суммы лимита, оплачивается газом | Транзакция, выставляющая лимит этого получателя в ноль |
| Подпись permit по стандарту EIP-2612 | Запись лимита появляется при предъявлении подписи получателем | Подпись сообщения с полями получателя, суммы, счётчика и срока, газ не тратится | Сдвиг счётчика подписей: любая следующая проведённая подпись обнуляет прежнюю |
| Делегирование по стандарту EIP-7702 | Код контракта-делегата, привязанный к вашему адресу | Запрос авторизации с указанием сети, адреса контракта и счётчика | Новая авторизация на нулевой адрес: код адреса очищается |
| Разрешение, выданное контракту-посреднику | Лимит у посредника плюс его внутренние записи о сроках | Транзакция или подпись в адрес посредника, а не конечного приложения | Отзыв и у токена, и во внутреннем учёте посредника — два действия |
Из устройства стандарта следует практическое неудобство. Отзыв подписи permit, которую вы подписали, но которую ещё не предъявили, отдельной операцией не предусмотрен: счётчик сдвигается только проведением какой-нибудь подписи того же адреса для того же токена. Поэтому срок действия, указанный внутри самой подписи, остаётся единственным настоящим ограничителем, и разница между минутами и месяцами здесь определяет, сколько времени у подписи будет на то, чтобы сработать не вовремя. Что именно кошелёк показывает в окне подтверждения, разобрано в материале про вредоносную подпись транзакции.
Пошаговые действия, если деньги уже ушли
Возврат не гарантирован никем. Порядок ниже ограничивает ущерб. Начинайте с первого пункта.
- Снимите действующие разрешения по всем токенам, начиная с неограниченных по сумме.
- Проверьте свой адрес на наличие кода и при действующем делегировании подпишите авторизацию на нулевой адрес.
- Переведите остаток на адрес, ключ которого никогда не использовался для подписи разрешений.
- Выпишите хеши транзакций, адреса получателей и время по UTC.
- Подайте заявление через интернет-приёмную МВД или в отделение по месту жительства, приложив распечатку операций и расчёт суммы в рублях на дату события.
- Сохраните текст подписанного сообщения, если он остался в истории кошелька: это доказательство.
Как закрыть дыру, чтобы не повторилось
- Выставляйте лимит разрешения под конкретную операцию, а не неограниченный по умолчанию.
- Требуйте короткий срок действия в подписях permit: минуты вместо месяцев.
- Раз в месяц просматривайте список действующих разрешений и снимайте неиспользуемые.
- Проверяйте наличие кода у своего адреса после каждой работы с незнакомым интерфейсом.
- Делегирование оформляйте только на контракт с верифицированным исходником и известным происхождением.
- Держите операционный адрес отдельно от адреса хранения: разрешения выдаются с первого.
Чек-лист
- Тип запроса определён: транзакция или подпись сообщения.
- Поля получателя, суммы и срока действия прочитаны до подтверждения.
- Лимит разрешения ограничен суммой операции.
- Срок действия подписи permit измеряется минутами.
- Адрес получателя проверен в обозревателе на верифицированный исходник.
- Код у собственного адреса проверен, действующих делегирований нет.
- Список разрешений по токенам просмотрен за последний месяц.
- Как распознать вредоносную подпись транзакции — что кошелёк показывает в окне подтверждения и где читается подвох.
- Как распознать отравление истории адресов — почему адрес получателя сверяют целиком.
- Как выделить отдельное устройство под криптооперации — разделение операционного адреса и адреса хранения.
- Как проследить движение украденных средств — фиксация следов и оценка остаточного риска.
Частые вопросы
Чем подпись permit отличается от обычного разрешения?
Моментом, когда право возникает. Обычное разрешение записывается в контракт вашей транзакцией сразу. Permit — это подпись, которая лежит у получателя и превращается в разрешение лишь тогда, когда он сам решит её предъявить. До предъявления в истории адреса нет ничего. Проверить такую подпись по сети нельзя.
Можно ли отозвать подпись permit?
Отдельной операции для этого стандарт не предусматривает. Подпись привязана к счётчику, и обнулить её можно, проведя любую следующую подпись того же адреса для того же токена: прежнее значение счётчика после этого становится недействительным. Практичнее не отзывать, а изначально ставить короткий срок.
Делегирование по EIP-7702 опаснее разрешения?
Оно шире по объёму. Разрешение касается одного токена и одной суммы, делегирование передаёт контракту управление самим адресом. Спецификация предупреждает прямо: неудачно сделанный делегат способен получить почти полный контроль над адресом подписанта, и ограничить этот контроль значением лимита, как в разрешении, не получится.
Как снять делегирование?
Подписать новую авторизацию, указав в ней нулевой адрес. По спецификации это очищает код адреса: признак делегирования не записывается, а хеш кода возвращается к пустому значению. Операция требует транзакции и газа. После неё адрес снова ведёт себя как обычный, без привязанного контракта и без возможности исполнять чужой код от вашего имени.
Нужно ли снимать старые разрешения, если адрес пустой?
Да, если вы планируете пользоваться им дальше. Разрешение живёт в контракте токена и от нулевого баланса никуда не исчезает: оно сработает на любую сумму, которая поступит на этот адрес позже, хоть через год. Снимайте разрешения до того, как заводите новые средства.
Вердикт
Разрешения токенов, подписи permit и делегирование по EIP-7702 решают одну задачу — выдать доступ — и устроены тремя разными способами. Практический вывод короток по форме и неудобен по исполнению: снятое разрешение на токен не отменяет ни лежащую у кого-то подпись, ни привязанный к адресу контракт. Проверять нужно все три, а не одно. Короткий срок в подписи и конкретный лимит в разрешении стоят дешевле любой уборки последствий.
Разборы инцидентов и предупреждения публикуем в Telegram-канале Cryptium.
Обсуждение
Добавить комментарий