February 11, 2023

0$ Транзакции?

Для начала поймем что происходит?

Возьмем обычный рандомный адрес

https://etherscan.io/address/0x4e0a4ce6d6340d7addd9169bcf6d0c35352113b5#tokentxns

И что мы тут видим?

Original - Оригинальная транзакция, которая была выполнена пользователем, отправка например 100k USDT.

На адрес - 0xc71A2A42a09F40B3BD7b289c51068AEFa560CABd

Fake - фишинговая транзакция, на 0 USDT.

С адресов:

1) 0xC7108500B4F02B84f1157F87786A29912650caBd

2) 0xc71a2A4218aD01b1064BAEb686c81ab8E260CaBd

Игра на внимательность

Как вы видите оригинальный адрес очень похож на "Фишинговые адреса". Точнее фишинговые адреса похожи на оригинальные.
Обычно первые 3 и последние 3 символа схожи. Так как очень легко спутать эти адреса и отправить деньги злоумышленникам

Окей, это поняли, но как эта транзакция в 0 USDT происходит, если ключи у меня?

Чтобы это объяснить это нам придется посмотреть "под капот" токена.

Например USDT - Контракт

Тут мы наблюдаем что есть функции transfer и transferFrom.

Но в чем же отличие

transfer - Трансфер

Перевести деньги с "Этого кошелька" на другой кошелек

_to - Кому, вставляете адрес получателя

_value - Количество токенов которые хотите перевести

Затем ВЫ её подписываете и отправляете транзакцию.

Обычная отправка токенов

transferFrom - ТрансферИз

Перевести токены с ТОГО кошелька на ДРУГОЙ кошелек

_from - От кого вы будете забирать токены. С какого адреса брать токены.

_to - куда эти токены переведутся, адрес получателя

_value - Количество токенов которые хотите перевести

Затем Отправляющий адрес подписывает и отправляет транзакцию.

transferFrom дословно переводиться как перевести токены с того адреса на другой адрес.

Давайте сразу на примере

Адрес А - Петя, хороший малый, который имеет 100 USDT

Адрес B - Антонио, тоже хороший, но пока бедный, 0 USDT

Наша задача, нужно перекинуть ОТ Пети -> Антонио 50 USDT

Метод 1

Петя заполняет форму для transfer (Комиссию платит Петя):

_to - Адрес B (Кому, адрес получателя)

_value - 50 (Количество токенов которые хотите перевести)

Затем Петя подписывает транзакцию и переводит 50USDT на адрес Антонио

Метод 2

Антонио заполняет форму для transferFrom (Комиссию платит Антонио):

_from - Адрес А Петя (От кого вы будете забирать токены)

_to - Адрес B Антонио (куда эти токены переведутся, адрес получателя)

_value - 50 (Количество токенов которые хотите перевести)

Затем Антонио подписывает транзакцию и переводит 50USDT к себе на адрес, взяв их у Пети.

НО! Получается Антонио может просто взять все 100 токенов Пети?

Не все так просто :) Allowance

Allowance - Это количество токенов которое Петя разрешил Антонио взять со своего кошелька. Без этого разрешения Антонио не может взять токены с адреса Пети

Чтобы выполить "Метод2", Петя сначала должен разрешить Антонио "взять"(потратить) свои токены. Это называется функция Approve(Апрув)

_spender - тратильщик, кому разрешаете тратить(брать) ваши USDT токены

_value - количество, сколько в общем количество токенов которые вы разрешите адресу взять у вас токенов

Распишем Метод 2 в деталях

  1. Петя заполняет форму Approve.
    _spender - Адрес B _value - 50
    Подписывает Петя и отправляет транзакцию
    Только что Петя разрешил Адресу B, Антонию взять 50 токенов USDT
  2. Антонио заполняет форму transferFrom как ранее и берет свои 50 токенов USDT
  3. Петя - 50usdt, Антонио - 50usdt.

В первом действии Петя сделал Allowance Адреса B = 50, Разрешил потратить токенов

После второго действия при transferFrom, Allowance Адреса B = 0.

Так как было разрешено взять Антонию 50 токенов, он взял 50, значит сейчас ему разрешено 0 шт токенов. 50-50 = 0

Еще примеры


Если бы при Allowance = 50, Антонио бы запросил 75 токенов, контракт USDT сказал бы Антонио, что "Запрашиваете выше разрешенного". И транзакция бы зафейлилась. Петя - 100usdt, Антонио - 0usdt.


Если бы Петя сделал бы Approve на 75 токенов, и Антонио сделал бы transferFrom на 50 токенов, то Allowance Антонио стал бы 75-50=25. Тоесть Антонио может взять еще 25 токенов Пети. Петя - 50usdt, Антонио - 50usdt.

Разобрались? А теперь как это относится к фишинговой атаке?

Схема атаки:

  1. Подбором подбирает приватник к адресу, похожий на оригинал
  2. Затем адрес_атакующий отправляет transferFrom, на Атакуемый адрес.
    А в поле _value = 0.
    Подписывает и отправляет транзу(Комиссию платит Атакер)
  3. Транзакция выполняется и появляется в истории, где ее мы уже видим и наивно ведемся :)

Но почему transferFrom выполняется, хотя мы не разрешали (Approve) адрес_атакующему тратить свои токены.
Потому что allowance = 0, это ставится автоматический, тоесть любому другому адресу разрешено взять 0 токенов. Сейф? Сейф.

А в функции transferFrom, проверяется что _value <= allowance.
0=0? Да, значит можно проводить транзакцию

Этим и пользуются злоумышленики, делают transferFrom с количеством 0. Тем самым засоряя историю вам, и надеясь на вашу не внимательность

А у них затраты это плата за газ при функции tranferFrom(_value = 0)


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

Будьте Сейф и не торопитесь!!!


https://t.me/Straus_loveYou
https://t.me/Straus_loveYou
https://t.me/Straus_loveYou