Анализ уязвимости переполнения целых чисел в языке Move
После глубокого изучения языка Move мы обнаружили новую уязвимость переполнения целого числа. Эта уязвимость возникает на этапе проверки безопасности ссылок в процессе верификации байт-кода языка Move. В данной статье будет подробно проанализирован процесс срабатывания этой уязвимости и рассмотрены некоторые ключевые концепции языка Move.
Процесс верификации байт-кода языка Move
Язык Move проводит проверку кода перед выполнением байт-кода, которая делится на 4 этапа. Уязвимость в этот раз возникла на этапе reference_safety. Этот этап отвечает за проверку безопасности ссылок, включая проверку на наличие висячих ссылок и безопасность доступа к изменяемым ссылкам.
Процесс верификации сначала будет идентифицировать основные блоки в коде. Основной блок — это последовательность кода, которая не содержит управляющих инструкций, кроме входных и выходных. Move определяет основные блоки, обходя байт-код и ищя все управляющие инструкции и циклы.
Безопасность ссылок в Move
Move поддерживает два типа ссылок: неизменяемые ссылки (&) и изменяемые ссылки (&mut). Модуль безопасности ссылок будет сканировать байт-код инструкций каждого базового блока в функции и проверять, законны ли все операции со ссылками.
Процесс проверки использует структуру AbstractState для представления состояния, содержащую граф заимствований и локальные переменные. Во время проверки будет сравниваться состояние до и после выполнения, и обновленное состояние блока будет объединено.
Анализ уязвимостей
Уязвимость возникает в функции join_. Эта функция используется для объединения состояния до и после выполнения, обновляя карту locals и граф заимствований. Проблема заключается в том, что итератор locals возвращает тип u8, и переполнение происходит, когда сумма длины параметров и длины локальных переменных превышает 256.
Хотя в Move есть процесс проверки количества локальных переменных, он проверяет только количество локальных переменных, не включая длину параметров.
Эксплуатация уязвимостей
Используя этот переполнение, можно изменить состояние базового блока. В цикле кода состояние изменяется после выполнения базового блока. При следующем выполнении, если индекс, к которому обращается инструкция, не существует в новой локальной карте, это приведет к панике, что позволит осуществить DoS-атаку.
Демонстрация PoC
Предоставлен воспроизводимый код PoC, который вызывает переполнение целого числа и приводит к сбою программы при установке определенных параметров и количества локальных переменных.
Резюме
Этот уязвимость снова подтверждает важность аудита кода. Для языка Move рекомендуется добавить больше проверок безопасности во время выполнения, а не полагаться только на проверки на этапе валидации. Мы продолжим углубленно изучать проблемы безопасности языка Move, чтобы способствовать его развитию.
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
25 Лайков
Награда
25
7
Поделиться
комментарий
0/400
RektButStillHere
· 07-11 04:35
Снова переполнение, тьфу-тьфу.
Посмотреть ОригиналОтветить0
consensus_failure
· 07-11 01:01
Какой же это баг!
Посмотреть ОригиналОтветить0
SchrodingersPaper
· 07-09 07:32
move снова отправил? Все пошло не так, все пошло не так.
Посмотреть ОригиналОтветить0
DevChive
· 07-08 16:28
菜鸟被 разыгрывайте людей как лохов
Посмотреть ОригиналОтветить0
ProposalManiac
· 07-08 06:09
Ранее говорилось, что проверка параметров не должна быть только в документации.
Разоблачение уязвимости переполнения целых чисел в языке Move: опасности валидации байт-кода
Анализ уязвимости переполнения целых чисел в языке Move
После глубокого изучения языка Move мы обнаружили новую уязвимость переполнения целого числа. Эта уязвимость возникает на этапе проверки безопасности ссылок в процессе верификации байт-кода языка Move. В данной статье будет подробно проанализирован процесс срабатывания этой уязвимости и рассмотрены некоторые ключевые концепции языка Move.
Процесс верификации байт-кода языка Move
Язык Move проводит проверку кода перед выполнением байт-кода, которая делится на 4 этапа. Уязвимость в этот раз возникла на этапе reference_safety. Этот этап отвечает за проверку безопасности ссылок, включая проверку на наличие висячих ссылок и безопасность доступа к изменяемым ссылкам.
Процесс верификации сначала будет идентифицировать основные блоки в коде. Основной блок — это последовательность кода, которая не содержит управляющих инструкций, кроме входных и выходных. Move определяет основные блоки, обходя байт-код и ищя все управляющие инструкции и циклы.
Безопасность ссылок в Move
Move поддерживает два типа ссылок: неизменяемые ссылки (&) и изменяемые ссылки (&mut). Модуль безопасности ссылок будет сканировать байт-код инструкций каждого базового блока в функции и проверять, законны ли все операции со ссылками.
Процесс проверки использует структуру AbstractState для представления состояния, содержащую граф заимствований и локальные переменные. Во время проверки будет сравниваться состояние до и после выполнения, и обновленное состояние блока будет объединено.
Анализ уязвимостей
Уязвимость возникает в функции join_. Эта функция используется для объединения состояния до и после выполнения, обновляя карту locals и граф заимствований. Проблема заключается в том, что итератор locals возвращает тип u8, и переполнение происходит, когда сумма длины параметров и длины локальных переменных превышает 256.
Хотя в Move есть процесс проверки количества локальных переменных, он проверяет только количество локальных переменных, не включая длину параметров.
Эксплуатация уязвимостей
Используя этот переполнение, можно изменить состояние базового блока. В цикле кода состояние изменяется после выполнения базового блока. При следующем выполнении, если индекс, к которому обращается инструкция, не существует в новой локальной карте, это приведет к панике, что позволит осуществить DoS-атаку.
Демонстрация PoC
Предоставлен воспроизводимый код PoC, который вызывает переполнение целого числа и приводит к сбою программы при установке определенных параметров и количества локальных переменных.
Резюме
Этот уязвимость снова подтверждает важность аудита кода. Для языка Move рекомендуется добавить больше проверок безопасности во время выполнения, а не полагаться только на проверки на этапе валидации. Мы продолжим углубленно изучать проблемы безопасности языка Move, чтобы способствовать его развитию.