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