Анализ новой уязвимости переполнения целых чисел в языке Move: от ссылочной безопасности до DoS-атаки

robot
Генерация тезисов в процессе

Глубина очередной высокоопасной уязвимости языка Move

Ранее мы обнаружили серьезную уязвимость Aptos Moveevm, а после глубокого исследования мы нашли новую уязвимость целочисленного переполнения. Процесс активации этой уязвимости оказался более интересным, ниже мы подробно проанализируем эту уязвимость и представим некоторые основные знания о языке Move. Мы уверены, что благодаря объяснению в этой статье, вы получите более глубокое понимание языка Move.

Как известно, язык Move проверяет кодовые единицы перед выполнением байт-кода. Процесс валидации делится на 4 этапа, и эта уязвимость возникает на этапе reference_safety.

Модуль reference_safety определяет функцию перемещения, используемую для проверки ссылочной безопасности主体 процесса. Его проверки включают в себя проверку на отсутствие висячих ссылок, безопасность доступа к изменяемым ссылкам, безопасность доступа к ссылкам на глобальное хранилище и т.д.

Функция входа, ссылающаяся на проверку безопасности, будет вызывать analyze_function. В analyze_function функция будет проверять каждый базовый блок. Базовый блок - это последовательность кода, которая не содержит переходных инструкций, кроме входа и выхода.

Язык Move определяет базовые блоки, проходя по байт-коду, ища все инструкции ветвления и последовательности циклов. Типичный пример базового блока кода Move IR может содержать 3 базовых блока, определяемых инструкциями BrTrue, Branch и Ret.

Numen Cyber эксклюзивно обнаружил ещё одну уязвимость высокого уровня в языке move

Безопасность ссылок в Move

Опираясь на идеи языка Rust, Move поддерживает два типа ссылок: неизменяемые ссылки ( и изменяемые ссылки )&mut(. Неизменяемые ссылки используются для чтения данных из структуры, изменяемые ссылки — для модификации данных. Разумное использование типов ссылок помогает поддерживать безопасность и определять модули чтения.

Модуль безопасности ссылок Move будет сканировать байт-код инструкций базовых блоков в функции, проверяя, законны ли все операции с ссылками. Процесс проверки в основном связан со структурой AbstractState, которая содержит граф заимствований и локальные переменные, чтобы обеспечить безопасность ссылок в функции.

Процесс проверки будет сравнивать состояние до и после выполнения базового блока и объединит результаты для обновления состояния блока, одновременно распространяя постусловия блока на последующие блоки. Этот процесс похож на идею Sea of Nodes в V8 turbofan.

Главный цикл будет выполнять блок кода, а затем пытаться объединить предшествующее состояние и последующее состояние. Если состояние изменилось и текущий блок имеет обратное ребро, указывающее на себя ), что указывает на наличие цикла (, то произойдет возврат к началу цикла и продолжится выполнение этого базового блока, пока последующее состояние не станет равным предшествующему состоянию или выполнение не будет прервано из-за ошибки.

![Numen Cyber эксклюзивно обнаружил еще одну уязвимость высокой опасности в языке move])https://img-cdn.gateio.im/webp-social/moments-eb6397a8a98b556071724d98a4837b59.webp(

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

Уязвимость возникает в процессе проверки, изменился ли результат join. Функция join_ используется для обновления локальных переменных и графа отношений заимствования. Когда длина параметров функции плюс длина локальных переменных превышает 256, происходит переполнение при обходе locals, поскольку локальные переменные имеют тип u8.

Хотя в Move есть процесс проверки количества locals, в модуле проверки границ проверяются только locals, без учета параметра length. Разработчики, похоже, осознали необходимость проверки суммы параметров и локальных значений, но код на самом деле проверяет только количество локальных переменных.

![Numen Cyber эксклюзивно обнаружил еще одну уязвимость в языке move])https://img-cdn.gateio.im/webp-social/moments-6952376046c901dfae2b19d5144746b5.webp(

![Numen Cyber эксклюзивно обнаружил еще одну высокую уязвимость языка move])https://img-cdn.gateio.im/webp-social/moments-92892f2a9dffea9f805f3a1952e82703.webp(

От переполнения целого числа до DoS-атаки

Главный цикл будет сканировать кодовые блоки и вызывать функцию execute_block, после чего объединит состояние до и после выполнения. Когда в коде есть цикл, произойдет переход к началу кодового блока для повторного выполнения.

Если мы создадим циклический кодовый блок и воспользуемся переполнением для изменения состояния блока, чтобы новая карта локальных переменных отличалась от предыдущей, то при повторном выполнении execute_block анализ последовательности инструкций в базовом блоке будет обращаться к новой карте локальных переменных. В этом случае, если индекс, который необходимо получить инструкции, отсутствует в новой карте, это приведет к DoS.

В модуле reference safety операции MoveLoc/CopyLoc/FreeRef могут достичь этой цели. На примере функции copy_loc, она попытается получить локальное значение через LocalIndex, если LocalIndex не существует, это приведет к панике, что вызовет сбой всего узла.

![Numen Cyber эксклюзивно обнаружил еще одну уязвимость в языке move])https://img-cdn.gateio.im/webp-social/moments-1347ef8b31983109babdf8ef29270c67.webp(

![Numen Cyber эксклюзивно обнаружил еще одну уязвимость в языке move])https://img-cdn.gateio.im/webp-social/moments-ac937ab4f426d30a476feb32520a95b4.webp(

![Numen Cyber эксклюзивно обнаружил еще одну уязвимость в языке move])https://img-cdn.gateio.im/webp-social/moments-a18dcf64108d1a75b728ffe8391100f1.webp(

![Numen Cyber эксклюзивно обнаружил еще одну уязвимость в языке move])https://img-cdn.gateio.im/webp-social/moments-7c8fe4e4cf376ad49d729a6f80df6f08.webp(

Демонстрация PoC

Мы можем построить basic block, содержащий инструкции безусловного перехода, чтобы многократно вызывать функции execute_block и join. Установив подходящие параметры и количество локальных переменных, можно сократить длину новой карты locals до 8 после первого выполнения.

При втором выполнении попытка доступа к несуществующему смещению приведет к панике, что вызовет DoS.

![Numen Cyber эксклюзивно обнаружил еще одну уязвимость в языке move])https://img-cdn.gateio.im/webp-social/moments-c598d61833550ec5494f9a5a4ee2a760.webp(

![Numen Cyber эксклюзивно обнаружил еще одну высокую уязвимость в языке move])https://img-cdn.gateio.im/webp-social/moments-12c60c225a5629f6d927982a7585fc5b.webp(

![Numen Cyber эксклюзивно обнаружил еще одну высокую уязвимость языка move])https://img-cdn.gateio.im/webp-social/moments-94b0c97bb9e287ed715cddb5165f129d.webp(

![Numen Cyber эксклюзивно обнаружил еще одну высокую уязвимость языка move])https://img-cdn.gateio.im/webp-social/moments-095e2b585c45a86b0a689214ca673619.webp(

![Numen Cyber эксклюзивно обнаружил еще одну уязвимость высокого уровня в языке move])https://img-cdn.gateio.im/webp-social/moments-5ebaa03263f7a87edd78d146c5beadd2.webp(

![Numen Cyber эксклюзивно обнаружил еще одну уязвимость высокой опасности в языке move])https://img-cdn.gateio.im/webp-social/moments-fe905356cbee596e8aba08ec14f5d508.webp(

Резюме

Этот уязвимость показывает, что даже язык Move, прошедший строгую статическую проверку, имеет потенциальные проблемы с безопасностью. Уязвимости переполнения могут обойти проверку границ, подчеркивая важность аудита кода.

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

Мы также обнаружили еще одну уязвимость языка Move, которую мы поделимся с вами позже.

![Numen Cyber эксклюзивно обнаружил еще одну уязвимость высокой опасности в языке move])https://img-cdn.gateio.im/webp-social/moments-ae25cc7d31726e2e1477e6d112b7aa75.webp(

MOVE4.24%
Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • 5
  • Поделиться
комментарий
0/400
ConsensusDissentervip
· 08-05 10:34
Действительно, это все еще небезопасно.
Посмотреть ОригиналОтветить0
DefiPlaybookvip
· 08-05 10:31
Шаги проверки требуют оптимизации
Посмотреть ОригиналОтветить0
MEVHunterWangvip
· 08-05 10:26
Кто понимает уязвимости, тот зарабатывает большие деньги
Посмотреть ОригиналОтветить0
tokenomics_truthervip
· 08-05 10:23
Чувствую, что это все равно ненадежно.
Посмотреть ОригиналОтветить0
staking_grampsvip
· 08-05 10:05
Move большой坑 ждет заполнения
Посмотреть ОригиналОтветить0
  • Закрепить