Язык Move вновь обнаружил уязвимость: переполнение целого числа может привести к сбою узла
Недавно исследователи безопасности обнаружили новую уязвимость переполнения целого числа при глубоком анализе Aptos Moveevm. Эта уязвимость существует в процессе проверки безопасности ссылок языка Move и может привести к сбою узла.
Язык Move выполняет проверку кода перед выполнением байт-кода, которая состоит из 4 этапов. Уязвимость возникает на этапе reference_safety. Этот этап в основном используется для проверки безопасности ссылок, включая проверку на наличие висячих ссылок и безопасность доступа к изменяемым ссылкам и т.д.
Процесс верификации будет проходить через каждый базовый блок и проводить его анализ. Базовый блок - это последовательность кода, не содержащая управляющих инструкций, кроме входа и выхода. Язык Move идентифицирует базовые блоки, ищя управляющие и циклические инструкции.
При проверке безопасности ссылок поддерживается структура AbstractState, содержащая информацию о графе заимствований и локальных переменных. Процесс проверки выполняет код базового блока, генерируя состояние после выполнения, затем объединяет его с состоянием до выполнения, обновляет состояние блока и распространяет его на последующие блоки.
Уязвимость возникает в функции join_. Эта функция используется для объединения состояний до и после выполнения, обновления локальных переменных и графа заимствований. Когда сумма длины параметров и длины локальных переменных превышает 256, использование типа u8 для итерации по локальным переменным может привести к переполнению целого числа.
Используя этот переполнение, можно изменить состояние базового блока. В присутствии циклического кода, при многократном выполнении одного и того же базового блока, может произойти доступ к несуществующему индексу locals, что приведет к панике и краху узла.
Исследователи предоставили код PoC, который вызывает переполнение целого числа и в конечном итоге приводит к панике, установив определенные параметры и количество локальных переменных.
Этот уязвимость показывает, что даже такие языки, как Move, которые придают большое значение безопасности, могут иметь уязвимости. Рекомендуется, чтобы разработчики языка Move добавили больше проверок безопасности во время выполнения, а не полагались только на проверки на этапе верификации. Это также подчеркивает важность аудита кода.
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
10 Лайков
Награда
10
1
Поделиться
комментарий
0/400
Hash_Bandit
· 08-06 01:22
Вопросы безопасности должны быть в центре внимания
Уязвимость переполнения целых чисел в языке Move: риск безопасности при ссылочной проверке
Язык Move вновь обнаружил уязвимость: переполнение целого числа может привести к сбою узла
Недавно исследователи безопасности обнаружили новую уязвимость переполнения целого числа при глубоком анализе Aptos Moveevm. Эта уязвимость существует в процессе проверки безопасности ссылок языка Move и может привести к сбою узла.
Язык Move выполняет проверку кода перед выполнением байт-кода, которая состоит из 4 этапов. Уязвимость возникает на этапе reference_safety. Этот этап в основном используется для проверки безопасности ссылок, включая проверку на наличие висячих ссылок и безопасность доступа к изменяемым ссылкам и т.д.
Процесс верификации будет проходить через каждый базовый блок и проводить его анализ. Базовый блок - это последовательность кода, не содержащая управляющих инструкций, кроме входа и выхода. Язык Move идентифицирует базовые блоки, ищя управляющие и циклические инструкции.
При проверке безопасности ссылок поддерживается структура AbstractState, содержащая информацию о графе заимствований и локальных переменных. Процесс проверки выполняет код базового блока, генерируя состояние после выполнения, затем объединяет его с состоянием до выполнения, обновляет состояние блока и распространяет его на последующие блоки.
Уязвимость возникает в функции join_. Эта функция используется для объединения состояний до и после выполнения, обновления локальных переменных и графа заимствований. Когда сумма длины параметров и длины локальных переменных превышает 256, использование типа u8 для итерации по локальным переменным может привести к переполнению целого числа.
Используя этот переполнение, можно изменить состояние базового блока. В присутствии циклического кода, при многократном выполнении одного и того же базового блока, может произойти доступ к несуществующему индексу locals, что приведет к панике и краху узла.
Исследователи предоставили код PoC, который вызывает переполнение целого числа и в конечном итоге приводит к панике, установив определенные параметры и количество локальных переменных.
Этот уязвимость показывает, что даже такие языки, как Move, которые придают большое значение безопасности, могут иметь уязвимости. Рекомендуется, чтобы разработчики языка Move добавили больше проверок безопасности во время выполнения, а не полагались только на проверки на этапе верификации. Это также подчеркивает важность аудита кода.