Глубина очередной высокоопасной уязвимости языка Move
Ранее мы обнаружили серьезную уязвимость Aptos Moveevm, а после глубокого исследования мы нашли новую уязвимость целочисленного переполнения. Процесс активации этой уязвимости оказался более интересным, ниже мы подробно проанализируем эту уязвимость и представим некоторые основные знания о языке Move. Мы уверены, что благодаря объяснению в этой статье, вы получите более глубокое понимание языка Move.
Как известно, язык Move проверяет кодовые единицы перед выполнением байт-кода. Процесс валидации делится на 4 этапа, и эта уязвимость возникает на этапе reference_safety.
Модуль reference_safety определяет функцию перемещения, используемую для проверки ссылочной безопасности主体 процесса. Его проверки включают в себя проверку на отсутствие висячих ссылок, безопасность доступа к изменяемым ссылкам, безопасность доступа к ссылкам на глобальное хранилище и т.д.
Функция входа, ссылающаяся на проверку безопасности, будет вызывать analyze_function. В analyze_function функция будет проверять каждый базовый блок. Базовый блок - это последовательность кода, которая не содержит переходных инструкций, кроме входа и выхода.
Язык Move определяет базовые блоки, проходя по байт-коду, ища все инструкции ветвления и последовательности циклов. Типичный пример базового блока кода Move IR может содержать 3 базовых блока, определяемых инструкциями BrTrue, Branch и Ret.
Безопасность ссылок в 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(
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
19 Лайков
Награда
19
5
Поделиться
комментарий
0/400
ConsensusDissenter
· 08-05 10:34
Действительно, это все еще небезопасно.
Посмотреть ОригиналОтветить0
DefiPlaybook
· 08-05 10:31
Шаги проверки требуют оптимизации
Посмотреть ОригиналОтветить0
MEVHunterWang
· 08-05 10:26
Кто понимает уязвимости, тот зарабатывает большие деньги
Анализ новой уязвимости переполнения целых чисел в языке Move: от ссылочной безопасности до DoS-атаки
Глубина очередной высокоопасной уязвимости языка Move
Ранее мы обнаружили серьезную уязвимость Aptos Moveevm, а после глубокого исследования мы нашли новую уязвимость целочисленного переполнения. Процесс активации этой уязвимости оказался более интересным, ниже мы подробно проанализируем эту уязвимость и представим некоторые основные знания о языке Move. Мы уверены, что благодаря объяснению в этой статье, вы получите более глубокое понимание языка Move.
Как известно, язык Move проверяет кодовые единицы перед выполнением байт-кода. Процесс валидации делится на 4 этапа, и эта уязвимость возникает на этапе reference_safety.
Модуль reference_safety определяет функцию перемещения, используемую для проверки ссылочной безопасности主体 процесса. Его проверки включают в себя проверку на отсутствие висячих ссылок, безопасность доступа к изменяемым ссылкам, безопасность доступа к ссылкам на глобальное хранилище и т.д.
Функция входа, ссылающаяся на проверку безопасности, будет вызывать analyze_function. В analyze_function функция будет проверять каждый базовый блок. Базовый блок - это последовательность кода, которая не содержит переходных инструкций, кроме входа и выхода.
Язык Move определяет базовые блоки, проходя по байт-коду, ища все инструкции ветвления и последовательности циклов. Типичный пример базового блока кода Move IR может содержать 3 базовых блока, определяемых инструкциями BrTrue, Branch и Ret.
Безопасность ссылок в 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(