В модуле безопасности Move языка обнаружена новая уязвимость переполнения целого числа
В последнее время, проводя глубокое исследование языка Move, мы обнаружили новую уязвимость переполнения целого числа. Эта уязвимость существует в процессе проверки безопасности ссылок, и ее активация довольно интересна. В этой статье мы подробно проанализируем эту уязвимость и обсудим некоторые фоновые знания о языке Move.
Язык Move выполняет проверку единиц кода перед выполнением байт-кода, которая делится на четыре этапа. Уязвимость возникает на этапе reference_safety. Этот этап отвечает за проверку безопасности ссылок, включая проверки наличия висячих ссылок, безопасности доступа к изменяемым ссылкам, безопасности доступа к ссылкам глобального хранилища и т.д.
Функция входа, вызывающая проверку безопасности, будет вызывать analyze_function для валидации каждого базового блока. Базовый блок - это последовательность кода, не содержащая ветвящих инструкций, кроме входа и выхода. Язык Move идентифицирует базовые блоки, перебирая байт-код и находя все ветвящие инструкции и последовательности циклов.
Язык Move поддерживает два типа ссылок: неизменяемую ссылку (&) и изменяемую ссылку (&mut). Модуль безопасности ссылок проверяет законность всех операций со ссылками, сканируя байт-кодовые инструкции базовых блоков в функции. Процесс проверки использует структуру AbstractState, которая включает в себя граф заимствований и локальные переменные, чтобы гарантировать безопасность ссылок в функции.
Уязвимость возникает в функции join_. Когда сумма длины параметров и длины локальных переменных превышает 256, функция iter_locals() возвращает итератор типа u8, что приводит к переполнению целого числа. Хотя в Move есть процесс проверки количества локальных переменных, в модуле проверки границ проверяются только локальные переменные, без учета длины параметров.
Это переполнение целого числа может привести к атаке типа "отказ в обслуживании" (DoS). Когда существует циклический блок кода и используется переполнение для изменения состояния блока, новая карта локальных переменных отличается от предыдущей. При повторном выполнении функции execute_block, если индекс, к которому требуется доступ, отсутствует в новой карте локальных переменных AbstractState, это приведет к DoS.
Мы предоставили воспроизводимый PoC в git. Код в этом PoC содержит безусловную инструкцию перехода, которая каждый раз, когда выполняется последняя инструкция, возвращается к первой инструкции, что многократно вызывает функции execute_block и join.
Этот уязвимость говорит о том, что даже такие языки, как Move, ориентированные на безопасность, могут иметь уязвимости. Важность аудита кода очевидна, программисты не застрахованы от ошибок. В качестве лидеров в области исследований безопасности языка Move, мы продолжим углубленное изучение проблем безопасности Move.
Мы рекомендуем разработчикам языка Move добавить больше проверочного кода во время выполнения, чтобы предотвратить неожиданные ситуации. В настоящее время безопасность в основном проверяется на этапе верификации, но этого может быть недостаточно. Если верификация будет обойдена, недостаточная защита на этапе выполнения может привести к более серьезным проблемам.
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
В языке Move модуль безопасности обнаружил уязвимость переполнения целого числа, что может привести к атаке DoS.
В модуле безопасности Move языка обнаружена новая уязвимость переполнения целого числа
В последнее время, проводя глубокое исследование языка Move, мы обнаружили новую уязвимость переполнения целого числа. Эта уязвимость существует в процессе проверки безопасности ссылок, и ее активация довольно интересна. В этой статье мы подробно проанализируем эту уязвимость и обсудим некоторые фоновые знания о языке Move.
Язык Move выполняет проверку единиц кода перед выполнением байт-кода, которая делится на четыре этапа. Уязвимость возникает на этапе reference_safety. Этот этап отвечает за проверку безопасности ссылок, включая проверки наличия висячих ссылок, безопасности доступа к изменяемым ссылкам, безопасности доступа к ссылкам глобального хранилища и т.д.
Функция входа, вызывающая проверку безопасности, будет вызывать analyze_function для валидации каждого базового блока. Базовый блок - это последовательность кода, не содержащая ветвящих инструкций, кроме входа и выхода. Язык Move идентифицирует базовые блоки, перебирая байт-код и находя все ветвящие инструкции и последовательности циклов.
Язык Move поддерживает два типа ссылок: неизменяемую ссылку (&) и изменяемую ссылку (&mut). Модуль безопасности ссылок проверяет законность всех операций со ссылками, сканируя байт-кодовые инструкции базовых блоков в функции. Процесс проверки использует структуру AbstractState, которая включает в себя граф заимствований и локальные переменные, чтобы гарантировать безопасность ссылок в функции.
Уязвимость возникает в функции join_. Когда сумма длины параметров и длины локальных переменных превышает 256, функция iter_locals() возвращает итератор типа u8, что приводит к переполнению целого числа. Хотя в Move есть процесс проверки количества локальных переменных, в модуле проверки границ проверяются только локальные переменные, без учета длины параметров.
Это переполнение целого числа может привести к атаке типа "отказ в обслуживании" (DoS). Когда существует циклический блок кода и используется переполнение для изменения состояния блока, новая карта локальных переменных отличается от предыдущей. При повторном выполнении функции execute_block, если индекс, к которому требуется доступ, отсутствует в новой карте локальных переменных AbstractState, это приведет к DoS.
Мы предоставили воспроизводимый PoC в git. Код в этом PoC содержит безусловную инструкцию перехода, которая каждый раз, когда выполняется последняя инструкция, возвращается к первой инструкции, что многократно вызывает функции execute_block и join.
Этот уязвимость говорит о том, что даже такие языки, как Move, ориентированные на безопасность, могут иметь уязвимости. Важность аудита кода очевидна, программисты не застрахованы от ошибок. В качестве лидеров в области исследований безопасности языка Move, мы продолжим углубленное изучение проблем безопасности Move.
Мы рекомендуем разработчикам языка Move добавить больше проверочного кода во время выполнения, чтобы предотвратить неожиданные ситуации. В настоящее время безопасность в основном проверяется на этапе верификации, но этого может быть недостаточно. Если верификация будет обойдена, недостаточная защита на этапе выполнения может привести к более серьезным проблемам.