Анализ уязвимости переполнения целых чисел в проверке безопасности ссылок языка Move
Недавно, в ходе глубокого исследования языка Move, мы обнаружили новую уязвимость переполнения целого числа. Эта уязвимость существует в процессе проверки безопасности ссылок, и процесс ее срабатывания довольно интересен. В этой статье мы проведем глубокий анализ этой уязвимости и обсудим некоторые связанные с языком Move теоретические знания.
Перед выполнением байт-кода язык Move проходит проверку единиц кода, которая состоит из четырех этапов. Уязвимость возникает на этапе reference_safety.
Модуль проверки ссылочной безопасности определяет функцию переноса для проверки ссылочной безопасности субъекта процесса. Включенные проверки охватывают такие аспекты, как отсутствие висячих ссылок, безопасность доступа к изменяемым ссылкам и безопасность доступа к ссылкам на глобальное хранилище.
Функция входа для проверки безопасности вызывает analyze_function, чтобы проверить каждый базовый блок. Базовый блок - это последовательность кода, которая не содержит инструкций ветвления, кроме входа и выхода. Язык Move определяет базовые блоки, обходя байт-код и ищет все инструкции ветвления и последовательности циклов.
Язык Move поддерживает два типа ссылок: неизменяемые ссылки & и изменяемые ссылки &mut. Неизменяемые ссылки используются для чтения данных, изменяемые ссылки — для изменения данных. Рациональное использование типов ссылок помогает поддерживать безопасность и идентифицировать модули чтения.
Модуль проверки безопасности будет сканировать байт-кодовые инструкции базовых блоков функции по единицам функций, проверяя, легальны ли все операции ссылки. Процесс проверки в основном включает структуру AbstractState, которая содержит граф заимствований и локальные переменные, чтобы обеспечить безопасность ссылок в функции.
В процессе верификации будет сравниваться состояние до и после выполнения базового блока, и с помощью изменения join_result будет объединено предшествующее состояние и последующее состояние. Если произошло изменение и текущий блок имеет обратное ребро, указывающее на себя (что означает наличие цикла), то будет выполнен возврат к началу цикла и продолжится выполнение этого базового блока, пока последующее состояние не станет равно предшествующему состоянию или выполнение не будет прервано из-за ошибки.
Уязвимость возникает в процессе проверки изменения результата join. Когда сумма длины параметров и длины локальных переменных превышает 256, использование типа u8 для итерации по локальным переменным может привести к переполнению целого числа. Хотя в Move есть процесс проверки количества локальных переменных, модуль проверки границ проверяет только локальные переменные и не учитывает длину параметров.
Эта уязвимость переполнения целого числа может привести к атаке типа отказ в обслуживании (DoS). Злоумышленник может создать циклический код и использовать переполнение для изменения состояния блока, что приведет к тому, что новая карта локальных переменных будет отличаться от предыдущей. При повторном выполнении функции execute_block анализ последовательности байт-кода в базовом блоке будет обращаться к новой карте локальных переменных. Если индекс, который необходимо получить в инструкции, отсутствует в новой карте локальных переменных AbstractState, это приведет к DoS.
Чтобы подтвердить этот уязвимость, можно воспроизвести PoC в git. Код в PoC содержит безусловную инструкцию ветвления, которая при каждом выполнении последней инструкции возвращается к первой инструкции, что приводит к многократным вызовам функций execute_block и join.
Эта уязвимость показывает, что даже такие языки, как Move, ориентированные на безопасность, могут иметь проблемы с безопасностью. Это подчеркивает важность аудита кода и также рекомендует разработчикам языка Move добавить больше проверок кода во время выполнения, чтобы предотвратить неожиданные ситуации. В настоящее время безопасность в Move в основном проверяется на этапе верификации, но если верификация будет обойдена, недостаточная защита на этапе выполнения может привести к более серьезным проблемам.
В качестве лидера в области исследований безопасности языка Move мы будем продолжать углубленное изучение вопросов безопасности Move и в дальнейшем делиться новыми открытиями.
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
20 Лайков
Награда
20
6
Репост
Поделиться
комментарий
0/400
BagHolderTillRetire
· 07-22 09:41
Этот баг просто ужасен, переполнение приводит к сбою.
Посмотреть ОригиналОтветить0
MetaverseVagabond
· 07-21 19:40
Опять появилась уязвимость переполнения, ужасно
Посмотреть ОригиналОтветить0
HeavenAndEarthAreBle
· 07-20 02:27
На хуй ее мать
Посмотреть ОригиналОтветить0
MemeTokenGenius
· 07-20 00:50
Ай-яй, этот баг действительно взорвался.
Посмотреть ОригиналОтветить0
GamefiHarvester
· 07-20 00:43
Еще не исправили? Железные неудачники ждут, чтобы их разыграли как лохов.
В языке Move обнаружена новая уязвимость переполнения целого числа в проверке безопасности.
Анализ уязвимости переполнения целых чисел в проверке безопасности ссылок языка Move
Недавно, в ходе глубокого исследования языка Move, мы обнаружили новую уязвимость переполнения целого числа. Эта уязвимость существует в процессе проверки безопасности ссылок, и процесс ее срабатывания довольно интересен. В этой статье мы проведем глубокий анализ этой уязвимости и обсудим некоторые связанные с языком Move теоретические знания.
Перед выполнением байт-кода язык Move проходит проверку единиц кода, которая состоит из четырех этапов. Уязвимость возникает на этапе reference_safety.
Модуль проверки ссылочной безопасности определяет функцию переноса для проверки ссылочной безопасности субъекта процесса. Включенные проверки охватывают такие аспекты, как отсутствие висячих ссылок, безопасность доступа к изменяемым ссылкам и безопасность доступа к ссылкам на глобальное хранилище.
Функция входа для проверки безопасности вызывает analyze_function, чтобы проверить каждый базовый блок. Базовый блок - это последовательность кода, которая не содержит инструкций ветвления, кроме входа и выхода. Язык Move определяет базовые блоки, обходя байт-код и ищет все инструкции ветвления и последовательности циклов.
Язык Move поддерживает два типа ссылок: неизменяемые ссылки & и изменяемые ссылки &mut. Неизменяемые ссылки используются для чтения данных, изменяемые ссылки — для изменения данных. Рациональное использование типов ссылок помогает поддерживать безопасность и идентифицировать модули чтения.
Модуль проверки безопасности будет сканировать байт-кодовые инструкции базовых блоков функции по единицам функций, проверяя, легальны ли все операции ссылки. Процесс проверки в основном включает структуру AbstractState, которая содержит граф заимствований и локальные переменные, чтобы обеспечить безопасность ссылок в функции.
В процессе верификации будет сравниваться состояние до и после выполнения базового блока, и с помощью изменения join_result будет объединено предшествующее состояние и последующее состояние. Если произошло изменение и текущий блок имеет обратное ребро, указывающее на себя (что означает наличие цикла), то будет выполнен возврат к началу цикла и продолжится выполнение этого базового блока, пока последующее состояние не станет равно предшествующему состоянию или выполнение не будет прервано из-за ошибки.
Уязвимость возникает в процессе проверки изменения результата join. Когда сумма длины параметров и длины локальных переменных превышает 256, использование типа u8 для итерации по локальным переменным может привести к переполнению целого числа. Хотя в Move есть процесс проверки количества локальных переменных, модуль проверки границ проверяет только локальные переменные и не учитывает длину параметров.
Эта уязвимость переполнения целого числа может привести к атаке типа отказ в обслуживании (DoS). Злоумышленник может создать циклический код и использовать переполнение для изменения состояния блока, что приведет к тому, что новая карта локальных переменных будет отличаться от предыдущей. При повторном выполнении функции execute_block анализ последовательности байт-кода в базовом блоке будет обращаться к новой карте локальных переменных. Если индекс, который необходимо получить в инструкции, отсутствует в новой карте локальных переменных AbstractState, это приведет к DoS.
Чтобы подтвердить этот уязвимость, можно воспроизвести PoC в git. Код в PoC содержит безусловную инструкцию ветвления, которая при каждом выполнении последней инструкции возвращается к первой инструкции, что приводит к многократным вызовам функций execute_block и join.
Эта уязвимость показывает, что даже такие языки, как Move, ориентированные на безопасность, могут иметь проблемы с безопасностью. Это подчеркивает важность аудита кода и также рекомендует разработчикам языка Move добавить больше проверок кода во время выполнения, чтобы предотвратить неожиданные ситуации. В настоящее время безопасность в Move в основном проверяется на этапе верификации, но если верификация будет обойдена, недостаточная защита на этапе выполнения может привести к более серьезным проблемам.
В качестве лидера в области исследований безопасности языка Move мы будем продолжать углубленное изучение вопросов безопасности Move и в дальнейшем делиться новыми открытиями.