Офчейн-подпись стоимостью 84 000 USDC

Декабрь 2024. Пользователь из Владимира заходит на «новый DEX с нулевыми комиссиями», который рекламируют в Telegram-канале. Сайт просит подпись с меткой Permit — без транзакции, без газа, без предупреждений MetaMask. Он подписывает.

Через одиннадцать секунд 84 000 USDC исчезают. Подпись Permit дала чужому адресу право списать весь баланс USDC, и дрейнер вызвал transferFrom в ту же секунду, как сигнатура была передана.

Чем опасен EIP-2612 Permit

EIP-2612 придумали для экономии газа: вместо отдельной транзакции approve пользователь подписывает офчейн-сообщение, а спендер включает эту подпись при вызове контракта. Подпись без газа, выглядит безобидно — MetaMask показывает structured-data-промпт, а не транзакцию. Но по действию это тот же approve на сумму, указанную в сообщении, — а фишинговые страницы ставят туда максимум. Поскольку при подписи в блокчейн ничего не отправляется, revoke.cash этой угрозы не видит, а сам кошелёк жертвы так и не отправил ни одной транзакции одобрения, которую можно было бы заметить. Отменить уже подписанный Permit на практике трудно: нужно успеть израсходовать его nonce в сети раньше, чем атакующий отправит подпись.

Четыре метки подписи, на которых стоит замереть

  • Permit — EIP-2612, безгазовое одобрение ERC-20.
  • PermitSingle / PermitBatch — контракт Permit2 от Uniswap, одной подписью может охватить сразу несколько токенов.
  • setApprovalForAll — одобрение целой NFT-коллекции. Строго говоря, это транзакция, а не подпись, но место ей в том же списке.
  • Сырой hex вместо читаемых полей — кошелёк не может объяснить, что вы подписываете.

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

Легитимные применения

Честное применение у Permit тоже есть: Uniswap, 1inch, CoW Swap и несколько крупных кредитных протоколов экономят пользователям газ с помощью Permit и Permit2. Защита — не «никогда не подписывать Permit», а «подписывать Permit только по URL, который вы набрали сами, в протоколе, которым уже пользовались много раз».

Если подписали и средства ещё на месте

У вас минуты. Откройте тот же кошелёк, переведите весь баланс токена на свежий адрес. Подпись Permit даёт атакующему право перевести — но не мешает вам перевести первыми. Скорость решает.