В механизме безопасности ссылок языка Move существует уязвимость переполнения целого числа
Недавно исследователи в области безопасности обнаружили новую уязвимость переполнения целого числа при глубокем анализе языка Move. Эта уязвимость возникает в процессе проверки безопасности ссылок языка Move и может привести к атакам отказа в обслуживании.
Язык Move выполняет проверку кода перед выполнением байт-кода, которая делится на 4 этапа. Эта уязвимость присутствует на этапе проверки безопасности ссылок (reference_safety). Основная цель проверки безопасности ссылок заключается в том, чтобы убедиться, что нет висячих ссылок, доступ к изменяемым ссылкам безопасен, доступ к глобальным хранилищам ссылок безопасен и т.д.
Процесс верификации будет проходить через каждую инструкцию байт-кода базового блока. Базовый блок относится к последовательности кода, которая не имеет инструкций ветвления, кроме входа и выхода. Язык Move идентифицирует базовые блоки, анализируя инструкции ветвления и циклы.
Безопасная проверка ссылок использует структуру AbstractState для отслеживания локальных переменных и отношений ссылок. Она состоит из двух частей: locals и borrow graph. При валидации будут сравниваться состояния до и после выполнения, и обновления будут объединены.
Уязвимость возникает в функции join_, находящейся в состоянии слияния. Эта функция использует тип u8 для итерации по locals, но если количество параметров и локальных переменных превышает 256, это приведет к переполнению целого числа. Хотя есть логика проверки количества locals, длина параметров не учитывается.
Атакующий может создать базовый блок с циклом, используя этот переполнение для изменения состояния. Повторное выполнение с доступом к несуществующему индексу locals приведет к панике, что вызовет отказ в обслуживании.
Этот уязвимость показывает, что даже языки с статической типизацией могут иметь проблемы с безопасностью. Рекомендуется, чтобы язык Move добавил больше проверок безопасности во время выполнения, а не полагался только на этап верификации. Также это подчеркивает важность аудита кода.
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
Уязвимость переполнения целого числа в механизме безопасности ссылок языка Move может привести к атаке типа «отказ в обслуживании»
В механизме безопасности ссылок языка Move существует уязвимость переполнения целого числа
Недавно исследователи в области безопасности обнаружили новую уязвимость переполнения целого числа при глубокем анализе языка Move. Эта уязвимость возникает в процессе проверки безопасности ссылок языка Move и может привести к атакам отказа в обслуживании.
Язык Move выполняет проверку кода перед выполнением байт-кода, которая делится на 4 этапа. Эта уязвимость присутствует на этапе проверки безопасности ссылок (reference_safety). Основная цель проверки безопасности ссылок заключается в том, чтобы убедиться, что нет висячих ссылок, доступ к изменяемым ссылкам безопасен, доступ к глобальным хранилищам ссылок безопасен и т.д.
Процесс верификации будет проходить через каждую инструкцию байт-кода базового блока. Базовый блок относится к последовательности кода, которая не имеет инструкций ветвления, кроме входа и выхода. Язык Move идентифицирует базовые блоки, анализируя инструкции ветвления и циклы.
Безопасная проверка ссылок использует структуру AbstractState для отслеживания локальных переменных и отношений ссылок. Она состоит из двух частей: locals и borrow graph. При валидации будут сравниваться состояния до и после выполнения, и обновления будут объединены.
Уязвимость возникает в функции join_, находящейся в состоянии слияния. Эта функция использует тип u8 для итерации по locals, но если количество параметров и локальных переменных превышает 256, это приведет к переполнению целого числа. Хотя есть логика проверки количества locals, длина параметров не учитывается.
Атакующий может создать базовый блок с циклом, используя этот переполнение для изменения состояния. Повторное выполнение с доступом к несуществующему индексу locals приведет к панике, что вызовет отказ в обслуживании.
Этот уязвимость показывает, что даже языки с статической типизацией могут иметь проблемы с безопасностью. Рекомендуется, чтобы язык Move добавил больше проверок безопасности во время выполнения, а не полагался только на этап верификации. Также это подчеркивает важность аудита кода.