March 20

Permit, или же как вас могут заскамить через подпись

Вас приветствует Roman, админ канала CryptoPlankton, ранее известный как CryptoAmeba

1. Содержание:

  1. Содержание
  2. Предыстория
  3. Отличие Approve от Permitа
  4. Баг UI Метамаска и Rabby wallet
  5. Защита от фишинга в контракте. MEMELAND
  6. Что делать ? Два случая
    5.1. Контракт токена известен
    5.2. Неизвестна монета, анализ и её поиск
  7. Отзываем Permit
  8. Заключение

2. Предыстория

19.03.2024 вечером я и еще один человек из общей приватки попались на скам-сайт. Как это вышло ? Другой участник чата увидел в твиттере пост, листал фото, в конце карусели находился скам, который он не признал с первого раза. Ситуация могла случиться с любым

На самом же деле проблема была даже не в скам-сайте, а в его работе. Была подпись после логина, вроде ничего необычного, но после подписи в Ethereum, начали предлагать сменить сеть и снова подписать. Тут я заподозрил неладное, до меня дошло, что это фишинг

Побежал я чекать баланс - все на месте. Зашел на Revoke cash - тоже чисто, нет никаких аппрувов. Думаю, в чем же проблема, как меня хотят заскамить ?

Обратился в чат cp0x, в котором мне и рассказали про Permit, а впоследствии один человек помог обезопаситься

3. Approve и Permit. В чем отличие ?

Думаю, все знакомы с классическим методом скама — обычным аппрувом транзакции на отправку средств после присоединения к сайту. Это самая база, после этого вы можете просто перейти на revoke.cash и ревокнуть его. Даже если ваши монетки уже сдрейнили, можно обезопасить себя в будущем

Однако с Пермитом такого сделать нельзя. Никакие интерфейсы не отображают его, в Revoke Cash они не показываются, т.к. не хранятся в блокчейне. Permit это та же самая подпись, которую вы ставите при логине, только содержит данные, позволяющие получить Approve монеты. Работает скам следующим образом — вы переходите на сайт, коннектите кошелек, подписываете permit, отдаете данные, которые необходимы для аппрува определенной монеты.

В итоге со следующей транзакцией Permit присоединяется к ней, как паразит, иначе говоря, батчится(Batch). И вы, отправив транзакцию, автоматически аппруваете монету скамеру
Проблема пермитов в том, что их нельзя никак отозвать руками самостоятельно, как это можно сделать с аппрувами. Т.е. выданный пермит до дедлайна предоставляет возможность бесконечно вас скамить. В моем случае дедлайн был на 10 лет вперед, т.е. в течение 10 лет меня могли бы дрейнить

Рекомендую также ознакомиться со статьей Ортомича по eip712

https://teletype.in/@ortomich/EIP_712_scam


Больше узнать можно тут

https://eips.ethereum.org/EIPS/eip-2612

4. Баг интерфейса Metamask

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

Когда выходит подпись, кошелек обязан показывать данные, которые передаются. В том числе и контракт монеты, которой делается Permit.
Однако по каким-то причинам, вероятно баг, Metamask не показывает монету, в отличие от Rabby

Как видите, в Rabby указывается и токен, и траст сайта, присутствуют предупреждения. Не нажав на "Игнорировать", вы не сможете ничего подписать


Человек, который мне помог, @ivigamberdiev, сказал, что свяжется с Тэйлор Монахан, девом Metamask и сообщит насчет бага в интерфейсе. Но я однозначно буду использовать Rabby после этого случая

5. Защита от фишинга на контрактах некоторых монет

К слову, на некоторых контрактах стоит защита от подобных фишинговых подписей

Например, выше на скрине Permit функция контракта монеты Meme. Spender, т.е. адрес того, на кого вы даете пермит, может быть только токенпул, иначе транза просто не пройдет

6. Что делать ? Два случая

Итак, вы уже подписали пермит и теперь не знаете, что делать ? Сейчас есть 2 основных случая:

  1. Какую-то монету у вас уже списали, вы побежали на Revoke.cash, ревокнули аппрув и думаете, что все в порядке(Это не так)
  2. У вас пока ничего не списывали, но все вполне может случиться в любой момент

В обоих случаях вам нужно будет самостоятельно делать Permit на монету с велью 0, таким образом старый станет неактуален

5.1. Если же у вас уже списали какую-то монету, то вы теперь точно знаете, что под угрозой именно она: переходите в пункт Отзываем Permit

5.2. Теперь разберем ситуацию, если вы не знаете, какая монета под угрозой, и разберемся, как ее вычислить

Если код у мошенников глупый, то обычно он подписывает одну и ту же монету, в которой лежит больше денег. В таком случае достаточно будет ее единственную и отозвать методом снизу

Однако, может быть такое, что монеты будут идти по очереди. Т.е. вы дали пермит на одну, а при попытке проверить через Rabby вам выдаст уже другой контракт, т.к. им незачем выдавать вам одну и ту же подпись дважды.

В таком случае вам не повезло, придется по очереди прогонять действия с каждой монетой, поддерживающей Permit. Начиная с тех, что есть на балансе, заканчивая теми, которые были когда-либо использованы и затронуты

Рекомендую начать с указанных в списке балансов Etherscan токенов, а потом пойти по последним своим транзакциям в истории и пройтись до начальных, если уж вообще паранойя не дает успокоиться

Однако не спешите прогонять абсолютно все монеты, не все из них поддерживают Permit, поэтому сначала выделите нужные


Теперь пройдемся по необходимым действиям для анализа монет под угрозой, если вас еще не успели сдрейнить:

1. Не все монеты поддерживают Permit. Зайдите в контракт токена, выберите вкладку Write и поищите функцию permit. Если ее нет, то переходим к следующему токену. Таким образом запишите все интересующие монетки

2. Я рекомендую вам начинать работать с монеты, в которой лежит бОльший баланс, чем в других, т.к. обычно бывает, что именно на нее делается ставка

7. Отзываем Permit

1. Теперь можно перейти к действиям. Сразу скажу, что вам потребуется Python. Скачиваем и устанавливаем, добавляя в PATH. С этим, думаю, разберетесь и сами

2. Скачиваем код отсюда: https://github.com/Soska512/permit

3. Теперь открываете CMD, переходите в папку со скриптом и вводите следующую команду

pip install -r requirements.txt

После завершения загрузки вы готовы к запуску, вводим команду ниже(Звездочки тоже убираете):

python permit.py --private_key *сюда приватник без 0х* --owner *адрес вашего кошеля* --spender *адрес вашего кошеля* --contract *контракт адрес монеты* --value 0 --deadline 2000000000 --provider_url *RPC ссылка сети* --chain_id *ID сети*

Для вас вся команда будет почти одинакова со всеми монетами. Нужно будет только менять контракты для каждого нового токена.

4. В результате вам выдаст данные в следующем формате

5. Избегаем фронтрана - ВАЖНО !

Сейчас необходимо поставить скрытую RPC в ваш кошелек, т.к. при попытке отозвать Permit может произойти так называемый фронтран. Иначе говоря, вы отправите транзакцию, а вперед нее уйдет транза, которая пройдет быстрее, чтобы вас задрейнить прямо перед отменой

Итак, заходим на сайт https://protect.flashbots.net/
Выбираем Custom RPC, ставим следующие настройки

Создаем RPC, копируем ссылку и вставляем в кошелек. ОТПРАВЛЯТЬ ТРАНЗАКЦИЮ ТОЛЬКО С НЕЁ !!! ИНАЧЕ ВЫ РИСКУЕТЕ ПОТЕРЯТЬ СРЕДСТВА

Если же у вас другие сети, не Ethereum. Найдите в интернете сервисы, предоставляющие Protected RPC. Могут называться MEV protection. Как сделаете себе RPC, переходите к следующему пункту.

6. Теперь переходим в контракт токена, который вы указывали в команде. Если сеть Ethereum, то в эзерскан, если bsc — bscscan и т.д.

Переходим во вкладку Write/write as proxy, подключаем кошелек, открываем функцию Permit, вводим туда полученные данные. Owner и Spender — ваш адрес, Value — 0, deadline 2000000000 и полученные v, r, s. Теперь кликаем write и подписываем транзакцию

7. Готово ! Вы выдали новый пермит, а старый, который был у мошенников, перестал работать

8. Заключение

Технологии развиваются, соответственно, подтягиваются и мошенники. Без этого никуда. Однако я надеюсь, что моя статья поможет кому-то обезопасить себя от подобного скама, а возможно, спасет чей-то баланс

Всем спасибо за прочтение !

Если узнали что-то новое, либо же просто благодарны за информацию, прошу подписаться на мой канал - ССЫЛКА