3 января 2024 года, по данным Beosin EagleEye, проект Radiant Capital стал жертвой атаки злоумышленника с использованием флэш-кредита. С помощью трех транзакций злоумышленник похитил более 1900 ETH на сумму более 4,5 миллионов долларов. Украденные средства в настоящее время хранятся по адресу злоумышленника, и команда безопасности Beosin оперативно проанализировала инцидент.

Анализ уязвимостей

Основная причина этого инцидента заключается в расчете количества токенов проектом Radiant Capital, который включает в себя точное расширение и округление. Злоумышленник воспользовался возможностью контролировать точность и в сочетании с округлением увеличил прибыль от атаки.

В наблюдаемом коде функция rayDiv принимает два данных uint256: a и b. Весь процесс можно упростить как (a RAY + b/2) / b, где RAY — данные расширения точности, равные 10²⁷. В результате получается RAY/b + 0,5, обеспечивающий функциональность округления. Основной источник ошибки в этом расчете связан с b. Если b значительно меньше a, ошибка становится незначительной. Однако если величина b аналогична величине a, ошибка может быть существенной.

Например, если RAY = 10000 и b = 3, вычисленный результат равен 3333, что на 1/10000 меньше фактического значения. Если a RAY = 10000 и b = 3000, вычисленный результат равен 3, что на 1/10 меньше фактического значения.

В этом инциденте злоумышленник манипулировал значением b, чтобы оно имело величину, аналогичную величине a, в результате чего вычисление было эквивалентно 3/2,0001 = 1. Рассчитанное значение на 1/3 меньше фактического значения.

Процесс атаки

  1. Первоначально злоумышленник занял 3 миллиона долларов США посредством срочного кредита AAVE в качестве стартового капитала для атаки.

2. 2 миллиона долларов США были заложены в контракт Radiant, и злоумышленник получил 2 миллиона сертификатов токенов rUSDCn.

3. Злоумышленник использовал мгновенный кредит по контракту Radiant, чтобы занять 2 миллиона долларов США. В функции обратного вызова было погашено 2 миллиона долларов США, одновременно извлекая заложенные доллары США со второго шага. Функция мгновенного кредита, называемая функцией Transferfrom, переводит USDC злоумышленника в контракт с комиссией 9/10000, взимаемой в качестве ликвидности для пула.

4. Повторив шаг 3, злоумышленник в значительной степени контролировал LiquidityIndex, достигнув LiquidityIndex=27180000000099999999999999998631966035920.

5. Впоследствии злоумышленник создал новый контракт и внес в него 543 600 долларов США. Эта сумма соответствует удвоенному значению LiquidityIndex из шага 4, что облегчает контроль округления.

6. Злоумышленник вложил все 543 600 долларов США в контракт Radiant, получив эквивалентную сумму в rUSDCn.

7. Злоумышленник вывел 407 700 долларов США. Хотя 407 700 rUSDCn должны были быть сожжены, как упоминалось выше, функция сжигания включала в себя точные вычисления расширения и округления. 40770000000000000000000000000000000000/2718000000009999999999999998631966035920 = 1,49999999, но округление приводит к 1, в результате чего результат оказывается на 1/3 меньше фактического значения. Как показано ниже, вместо 407 700 было сожжено только 271 800, что позволило злоумышленнику вывести 407 700 USDC.

8. Воспользовавшись уязвимостью из шага 7, злоумышленник повторил операции залога и вывода средств, последовательно выводя на 1/3 больше обещанной суммы, в конечном итоге обменивая все USDC из пула.

Отслеживание средств

На момент написания украденные 1902 ETH остаются на адресе хакера без движения. Beosin Trace продолжит мониторинг средств.

В начале 2024 года мы стали свидетелями двух случаев кражи крупных сумм. (Обзор вчерашнего инцидента с безопасностью: что произошло в первом случае в этом году — краже Orbit Chain на 80 миллионов долларов?) Эта серия событий служит напоминанием о том, что в экосистеме Web3 меры безопасности по-прежнему имеют решающее значение!

Контакт

Если вам нужны какие-либо услуги безопасности блокчейна, свяжитесь с нами:

Официальный сайт Beosin EagleEye Twitter Telegram Linkedin