Автор: Victory & Lisa
Фон
22 мая, согласно сообщениям сообщества, провайдер ликвидности на SUI, Cetus, предположительно, подвергся атаке, глубина ликвидного пула значительно снизилась, и на нескольких торговых парах Cetus наблюдается падение, ожидаемые потери превышают 230 миллионов долларов. Затем Cetus выпустила объявление, в котором говорится: "В нашем протоколе было обнаружено событие, для безопасности смарт-контракт временно приостановлен. В настоящее время команда проводит расследование по этому инциденту. Мы вскоре выпустим дальнейшее заявление о ходе расследования."
После инцидента команда безопасности SlowMist немедленно вмешалась для анализа и выпустила предупреждение о безопасности. Ниже приведен детальный анализ методов атаки и ситуации с перемещением средств.

(https://x.com/CetusProtocol/status/1925515662346404024)
Связанная информация
Одна из атакующих транзакций:
https://suiscan.xyz/mainnet/tx/DVMG3B2kocLEnVMDuQzTYRgjwuuFSfciawPvXXheB3x
Адрес атакующего:
0xe28b50cef1d633ea43d3296a3f6b67ff0312a5f1a99f0af753c85b8b5de8ff06
Адрес атакованного пула:
0x871d8a227114f375170f149f7e9d45be822dd003eba225e83c05ac80828596bc
Задействованные токены:
haSUI / SUI
Анализ атаки
Суть этого инцидента заключается в том, что атакующий, тщательно конструируя параметры, заставил переполнение происходить, но смог обойти проверку, в конечном итоге обменяв крайне малое количество токенов на огромные активы ликвидности. Ниже приведен анализ конкретных шагов:

1. Сначала атакующий занял 10,024,321.28 haSUI через флеш-кредит, что привело к падению цены пула с 18,956,530,795,606,879,104 до 18,425,720,184762886, падение составило 99.90%.

2. Атакующий тщательно выбрал очень узкий ценовой диапазон для открытия ликвидной позиции:
Нижний предел тикера: 300000 (цена: 60,257,519,765,924,248,467,716,150)
Верхний предел тикера: 300200 (цена: 60,863,087,478,126,617,965,993,239)
Ширина ценового диапазона: всего 1.00496621%
3. Затем идет основная суть этой атаки, атакующий заявляет о добавлении огромной ликвидности в 10,365,647,984,364,446,732,462,244,378,333,008 единиц, но из-за уязвимости система взимает лишь 1 токен A.

Давайте проанализируем, почему атакующий смог обменять 1 токен на огромную ликвидность. Основная причина заключается в том, что в функции get_delta_a существует уязвимость, позволяющая обходить проверку переполнения. Атакующий воспользовался этим, что привело к серьезным отклонениям в вычислении того, сколько haSUI на самом деле нужно добавить. Поскольку переполнение не было обнаружено, система ошибочно оценила количество необходимого haSUI, что позволило атакующему обменять лишь малое количество токенов на большое количество активов ликвидности, что и привело к атаке.
Когда система вычисляет, сколько haSUI необходимо для добавления такой огромной ликвидности:

Ключевым моментом здесь является то, что в реализации функции checked_shlw существует серьезный дефект. Фактически, любые входные значения, меньшие 0xffffffffffffffff << 192, будут обходить проверку переполнения. Однако, когда эти значения смещаются влево на 64 бита, результат превышает диапазон представления u256, в этот момент верхние данные обрезаются, что приводит к получению результата, значительно меньшего теоретического значения. Таким образом, система в последующих вычислениях недооценит количество необходимого haSUI.

Неверная маска: 0xffffffffffffffff << 192= очень большое значение (примерно 2^256-2^192)
Практически все входные данные меньше этой маски, что обходит проверку переполнения
Настоящая проблема: когда n >= 2^192, n << 64 выйдет за пределы u256 и будет обрезан
Промежуточное значение, сконструированное атакующим, liquidity * sqrt_price_diff = 6277101735386680763835789423207666908085499738337898853712:
Меньше неверной маски, что обходит проверку переполнения
Но после смещения влево на 64 бита это превысит максимальное значение u256, что приведет к обрезанию превышающей части
Это приводит к тому, что итоговое вычисленное значение примерно меньше 1, но поскольку округление вверх, частное оказывается равным 1

4. В конце концов, атакующий удаляет ликвидность и получает огромные токеновые доходы:
Первое удаление: получение 10,024,321.28 haSUI
Второе удаление: получение 1 haSUI
Третье удаление: получение 10,024,321.28 haSUI

5. Атакующий возвращает флеш-кредит, чистая прибыль составляет примерно 10,024,321.28 haSUI и 5,765,124.79 SUI, атака завершена.
Состояние исправления проекта
После атаки Cetus выпустила патч для исправления. Конкретный код исправления можно найти по адресу: https://github.com/CetusProtocol/integer-mate/pull/7/files#diff-c04eb6ebebbabb80342cd953bc63925e1c1cdc7ae1fb572f4aad240288a69409.
Исправленная функция checked_shlw выглядит следующим образом:

Описание исправления:
Исправьте неверную маску 0xffffffffffffffff << 192 на правильное значение порога 1 << 192
Исправьте условие с n > маска на n >= маска
Убедитесь, что при смещении влево на 64 бита, которое может привести к переполнению, флаг переполнения правильно обнаруживается и возвращается
Анализ MistTrack
По анализу, атакующий 0xe28b50cef1d633ea43d3296a3f6b67ff0312a5f1a99f0af753c85b8b5de8ff06 получил прибыль примерно 230 миллионов долларов, включая SUI, vSUI, USDC и другие активы.

Мы обнаружили, что атакующий подготовил Gas Fee за два дня до атаки и затем попытался произвести атаку, но потерпел неудачу:

Получив прибыль, атакующий перевел часть средств, таких как
USDC, SOL, suiETH через кросс-цепочные мосты, такие как Sui Bridge, Circle, Wormhole, Mayan, на адрес EVM 0x89012a55cd6b88e407c9d4ae9b3425f55924919b:

Из которых 5.2341 WBNB кросс-цепочкой перешло на адрес BSC 0x89012a55cd6b88e407c9d4ae9b3425f55924919b:

Затем атакующий перевел активы на сумму
10 миллионов долларов активов были внесены в Suilend:

Атакующий также перевел 24,022,896 SUI на новый адрес 0xcd8962dad278d8b50fa0f9eb0186bfa4cbdecc6d59377214, в настоящее время не выведенные:

К счастью, по словам Cetus, при сотрудничестве с фондом SUI и другими участниками экосистемы, в настоящее время было успешно заморожено 162 миллиона долларов украденных средств на SUI.

(https://x.com/CetusProtocol/status/1925567348586815622)
Далее мы используем инструмент для анализа противодействия отмыванию денег и отслеживания MistTrack для анализа адреса 0x89012a55cd6b88e407c9d4ae9b3425f55924919b, получившего кросс-цепочные средства.
Этот адрес получил 5.2319 BNB на BSC, еще не выведенные:

Этот адрес получил 3,000 USDT, 40,880,000 USDC, 1,771 SOL и 8,130.4 ETH на Ethereum.
Из которых USDT, USDC и SOL были обменены на ETH через CoW Swap, ParaSwap:


Затем этот адрес перевел 20,000 ETH на адрес 0x0251536bfcf144b88e1afa8fe60184ffdb4caf16, еще не выведенные:

В настоящее время баланс этого адреса на Ethereum составляет 3,244 ETH:

MistTrack добавила вышеупомянутые адреса в черный список, и мы продолжим мониторинг баланса адресов.
Резюме
Эта атака продемонстрировала мощь уязвимостей переполнения в математике. Атакующий, точно рассчитавав, выбирал определенные параметры, используя дефект функции checked_shlw, чтобы получить ликвидность на сумму в миллиарды за стоимость одного токена. Это была чрезвычайно точная математическая атака, и команда безопасности SlowMist советует разработчикам строго проверять все граничные условия математических функций при разработке смарт-контрактов.
