Язык Move снова обнаружил уязвимость высокой опасности: переполнение целого числа может привести к сбою узла
Недавно исследователи в области безопасности провели глубокий анализ языка Move и обнаружили новую уязвимость переполнения целого числа. Эта уязвимость возникает в процессе проверки безопасности ссылок языка Move и может привести к сбою узла.
Язык Move перед выполнением байт-кода проходит проверку кода, которая делится на четыре этапа. Обнаруженная уязвимость присутствует на этапе reference_safety. Этот этап в основном предназначен для проверки безопасности ссылок, включая проверку наличия висячих ссылок и безопасность доступа к изменяемым ссылкам и т.д.
Срабатывание уязвимости связано с концепцией базового блока в языке Move. Базовый блок — это последовательность кода, не содержащая инструкций ветвления, за исключением входа и выхода. Move определяет базовые блоки, обходя байт-код и ища инструкции ветвления.
В процессе проверки безопасности система сканирует байт-кодовые инструкции в каждом основном блоке, чтобы определить, являются ли все операции ссылками законными. Этот процесс использует структуру AbstractState, которая включает в себя два важных компонента: borrow graph и locals.
Уязвимость возникает в функции join_. Когда сумма длины параметров и длины локальных переменных превышает 256, из-за использования типа u8 для представления локального индекса может произойти переполнение целого числа. Хотя в Move существует механизм проверки количества локальных переменных, длина параметров не включена в это.
Используя этот переполнение уязвимость, злоумышленник может создать циклический блок кода, изменяющий состояние блока. Когда базовый блок выполняется снова, если индекс, к которому требуется доступ в инструкции, отсутствует в новой карте локальных переменных, это приведет к сбою программы.
Исследователи предоставили прототип (PoC), демонстрирующий, как активировать этот уязвимость. Установив определенные параметры и количество локальных переменных, можно уменьшить длину locals map до 8. При следующем выполнении, попытка доступа к несуществующему индексу 57 приведет к панике.
Этот уязвимость снова доказывает, что нет абсолютно безопасного кода. Хотя язык Move выполняет статическую проверку перед выполнением, его все же можно обойти с помощью переполнения целого числа. Исследователи рекомендуют разработчикам языка Move добавить больше проверок кода во время выполнения, чтобы предотвратить подобные проблемы.
В настоящее время исследовательская группа обнаружила еще одну уязвимость языка Move, о которой будет сообщено позже. Эти открытия имеют важное значение для улучшения безопасности языка Move.
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
12 Лайков
Награда
12
4
Поделиться
комментарий
0/400
PositionPhobia
· 15ч назад
Сколько же тут подводных камней, сколько сможешь пройти, столько и пройдешь.
Уязвимость переполнения целых чисел в языке Move: ссылка на безопасность несет риски
Язык Move снова обнаружил уязвимость высокой опасности: переполнение целого числа может привести к сбою узла
Недавно исследователи в области безопасности провели глубокий анализ языка Move и обнаружили новую уязвимость переполнения целого числа. Эта уязвимость возникает в процессе проверки безопасности ссылок языка Move и может привести к сбою узла.
Язык Move перед выполнением байт-кода проходит проверку кода, которая делится на четыре этапа. Обнаруженная уязвимость присутствует на этапе reference_safety. Этот этап в основном предназначен для проверки безопасности ссылок, включая проверку наличия висячих ссылок и безопасность доступа к изменяемым ссылкам и т.д.
Срабатывание уязвимости связано с концепцией базового блока в языке Move. Базовый блок — это последовательность кода, не содержащая инструкций ветвления, за исключением входа и выхода. Move определяет базовые блоки, обходя байт-код и ища инструкции ветвления.
В процессе проверки безопасности система сканирует байт-кодовые инструкции в каждом основном блоке, чтобы определить, являются ли все операции ссылками законными. Этот процесс использует структуру AbstractState, которая включает в себя два важных компонента: borrow graph и locals.
Уязвимость возникает в функции join_. Когда сумма длины параметров и длины локальных переменных превышает 256, из-за использования типа u8 для представления локального индекса может произойти переполнение целого числа. Хотя в Move существует механизм проверки количества локальных переменных, длина параметров не включена в это.
Используя этот переполнение уязвимость, злоумышленник может создать циклический блок кода, изменяющий состояние блока. Когда базовый блок выполняется снова, если индекс, к которому требуется доступ в инструкции, отсутствует в новой карте локальных переменных, это приведет к сбою программы.
Исследователи предоставили прототип (PoC), демонстрирующий, как активировать этот уязвимость. Установив определенные параметры и количество локальных переменных, можно уменьшить длину locals map до 8. При следующем выполнении, попытка доступа к несуществующему индексу 57 приведет к панике.
Этот уязвимость снова доказывает, что нет абсолютно безопасного кода. Хотя язык Move выполняет статическую проверку перед выполнением, его все же можно обойти с помощью переполнения целого числа. Исследователи рекомендуют разработчикам языка Move добавить больше проверок кода во время выполнения, чтобы предотвратить подобные проблемы.
В настоящее время исследовательская группа обнаружила еще одну уязвимость языка Move, о которой будет сообщено позже. Эти открытия имеют важное значение для улучшения безопасности языка Move.