Анализ случая перемещения незаконных средств: Атака на LI.FI
Предыстория дела
16 июля 2024 года Li.Fi, кросс-чейн мост и DEX-агрегатор, столкнулся с серьезным нарушением безопасности, в ходе которого был использован уязвимый контракт Li.Fi Diamond. У пользователей было похищено различных стейблкоинов и других активов на сумму около 11,6 млн долларов США. Злоумышленник смог вывести средства тех пользователей, которые предоставили бесконечные разрешения (infinite approvals) атакованному контракту.
- Адрес взломщика: 0x8b3cb6bf982798fba233bca56749e22eec42dcf3
- Уязвимый контракт: 0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae
- Примеры транзакций атаки: 0xd82f, 0x86fe, 0x606a
Уязвимость находилась в функции depositToGasZipERC20() контракта GasZipFacet. Контракт GasZipFacet был развернут командой LI.FI за пять дней до атаки для обеспечения заправки газом в транзакциях моста. Функция depositToGasZipERC20() включала контролируемый пользователем аргумент _swapData, который затем передавался в вызов функции LibSwap.swap(). К сожалению, LibSwap.swap содержал низкоуровневый вызов, который может исполнять произвольные функции с адресом цели и данными вызова, указанными в аргументе _swapData, контролируемом атакующим. Злоумышленник воспользовался этой "уязвимостью произвольного вызова" для осуществления несанкционированных переводов от пользователей, предоставивших бесконечное разрешение контракту Li.Fi Diamond.
Анализ движения денежных средств
16 июля 2024 года злоумышленник инициировал почти сто транзакций, используя уязвимость произвольного вызова, и в течение 30 минут перевел стейблкоины (USDT, USDC, DAI) на сумму около 11 миллионов долларов на адрес 0x8b3c. Почти все украденные стейблкоины были быстро обменяны на нативный токен сети Ethereum — ETH. DEX, использованные хакером, включали Uniswap, Metamask Swap и другие. Примеры транзакций обмена: 0xdf9b, 0x11d, 0xb4a4.
Пример потока средств внутри транзакции обмена 0x8e27 при взаимодействии с Metamask Swap Spender. Злоумышленник обменял незаконно полученные 333 258 USDT на 97,16 ETH. Все пулы и прокси четко отображаются с помощью MetaSleuth.

В течение двух часов после атаки все украденные активы были переведены на последующие адреса, контролируемые хакером, и на исходном адресе атаки ничего не осталось. Всего существует 32 последующих адреса, напрямую связанных с адресом 0x8b3c (то есть в одном переходе от первоначального адреса атаки). Среди них 15 адресов получили только по 0,1 ETH с адреса атаки. По состоянию на 22 октября 2024 года, ETH, удерживаемый на этих 15 адресах, не был выведен. Остальные адреса обработали остальную часть крупных сумм незаконных средств.
Часть потоков средств от адресов жертв к последующим адресам, контролируемым злоумышленником:

После перевода незаконных средств на последующие адреса (в один переход от адреса 0x8b3c) злоумышленник начал дальнейшее перемещение средств траншами. Процесс перевода (отмывания) длился почти три месяца. Почти все незаконные средства в итоге были переведены в Tornado Cash (99,9%), а небольшая часть была отправлена на биржу eXch для прямого обналичивания. Всего было совершено 114 транзакций, с помощью которых злоумышленник взаимодействовал с Tornado Cash Router. Примеры транзакций, перемещающих незаконные доходы в Tornado Cash: 0x07de, 0xfe82, 0x6a47, 0x8ea6. Примеры транзакций, перемещающих незаконные доходы в eXch: 0xaa89, 0x7e65, 0x8572, 0x625c, 0x2dd2, 0xda71.
Часть потоков средств от адресов layer2 (в 2 переходах от исходного адреса атаки 0x8b3c) к адресам layer4:

Первая крупномасштабная серия переводов произошла в течение первой недели после атаки, в период с 16 по 22 июля. Злоумышленник перевел незаконные активы на сумму около 500 000 долларов США с адреса 0x6a6d в Tornado Cash. Переводы незаконных средств хакером имели отличительные характеристики: он перемещал средства на последующие адреса, которые находились далеко от адреса атаки (адрес с высоким риском), постепенно перенаправляя часть в Tornado Cash. В первой партии самый длинный путь перевода достигал 20 переходов. Злоумышленник использовал чрезвычайно глубокий путь отмывания, чтобы скрыть потоки незаконных денег. В период с августа по октябрь оставшиеся незаконные средства постепенно переводились в Tornado Cash партиями с теми же характеристиками.
Пример партии переводов, перемещающей средства с адреса 0x8e85 (один переход от 0x8b3c) к Tornado Cash Router:

Как показывает рисунок, в период с 13 по 16 августа 2024 года злоумышленник постепенно перевел 206 ETH в Tornado Cash по пути из 12 переходов. На адресе 0xe9f7 хакер разделил 204 ETH на две транзакции: 100 ETH было отправлено в Tornado Cash, а 104 ETH направлено на дальнейшие адреса отмывания. Эта модель дробления была последовательной на протяжении всего процесса переводов. То есть с каждым взаимодействием с Tornado Cash злоумышленник использовал новый, более глубокий адрес.
Меры противодействия
Через два дня после атаки LI.FI официально опубликовала отчет об инциденте, заявив, что они успешно отключили уязвимый фасет контракта во всех сетях и предотвратили любой дальнейший несанкционированный доступ. LI.FI инициировала план компенсации и полностью возместила средства пострадавшим пользователям. Что касается возврата похищенных активов, они заявили, что продолжат взаимодействовать с правоохранительными органами и соответствующими третьими сторонами, включая команды безопасности из индустрии, для отслеживания и попыток возврата выведенных средств. По состоянию на 22 октября 2024 года почти все незаконные средства были переведены в Tornado Cash, а Li.Fi еще не опубликовала отчеты об отслеживании.
Некоторые релевантные адреса и транзакции
| Адреса | Транзакции | Потоки незаконных средств |
|---|---|---|
| 0x8e85eace2fa757c1d97c5ebfb8b0622e5f23c5a1 | 0xe237, 0x0d23 | 206,49 ETH |
| 0xcb7c341dc6172b642dcf4a14015be70a27e5b31e | 0x050c, 0x37d4 | 873 568 USDT + 36,48 ETH |
| 0x7b93fa16c04cdcf91949d4f5f893f740992ae57e | 0x57ea, 0x52ac | 332,02 ETH |
| 0x3462d2523cded523ad47c14111aa1dcbe7773675 | 0xc66d, 0xc0ff | 120,55 ETH |
| 0xd0be9c4c84068a9964c3781f540f703c300db268 | 0x0c3b, 0x1670 | 275,38 ETH |
Обзор движения средств:

Подробнее в MetaSleuth: https://metasleuth.io/result/eth/0x14c1597cc833783ed8ac08ecc9b704b0a398201d?source=c8cd3609-0402-45eb-bb9e-2f710bd66554


