Язык Move повторяет уязвимость переполнения целого числа
Недавно была обнаружена серьезная уязвимость переполнения целого числа в языке Move. Эта уязвимость возникает на этапе проверки безопасности ссылок и может привести к атаке типа "отказ в обслуживании". Путем глубокого анализа этой уязвимости мы можем получить более глубокое понимание языка Move.
Язык Move выполняет проверку кода перед исполнением байт-кода, которая делится на четыре этапа. Уязвимость возникает на этапе reference_safety. Модуль reference_safety отвечает за проверку законности операций с ссылками, включая проверку наличия висячих ссылок и безопасность доступа к изменяемым ссылкам.
Процесс верификации осуществляется по единицам функции. Для каждой функции сначала определяются ее базовые блоки. Базовый блок представляет собой последовательность кода, в которой возможны разветвления только на входе и выходе. Затем каждый базовый блок анализируется, генерируются состояния до и после выполнения, и состояния передаются в последующие блоки.
Состояние включает в себя две части информации: locals и borrow graph. locals записывает информацию о локальных переменных, а borrow graph отображает отношения ссылок между переменными. Процесс анализа постоянно обновляет эту информацию о состоянии.
Уязвимость возникает в процессе слияния состояний. Когда общее количество параметров функции и локальных переменных превышает 256, из-за использования типа u8 для представления индексов происходит переполнение целого числа. Это приводит к ошибкам в объединенной информации о состоянии, что может вызвать атаку отказа в обслуживании.
Хотя язык Move имеет механизм проверки количества локальных переменных, он не учитывает количество параметров. Этот упущение привело к возникновению уязвимости.
Чтобы активировать эту уязвимость, злоумышленник может создать цикл кода, используя переполнение для изменения состояния блока. При повторном выполнении, из-за неправильной информации о состоянии, доступ к несуществующей переменной приведет к сбою программы.
Этот уязвимость еще раз подчеркивает, что даже тщательно разработанные языки могут иметь проблемы с безопасностью. Это напоминает нам о важности аудита кода и о том, что в дизайне языка необходимо учитывать более полные аспекты безопасности. Для языка Move добавление большего количества проверок во время выполнения может быть направлением для улучшения.
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
20 Лайков
Награда
20
5
Репост
Поделиться
комментарий
0/400
CryptoPhoenix
· 08-14 11:11
Не беспокойтесь о нижнем диапазоне, путь к восстановлению только начинается... Разве так плохо, как в 2018 году?
Обнаружена уязвимость переполнения целых чисел в языке Move: существует риск, связанный с проверкой безопасности.
Язык Move повторяет уязвимость переполнения целого числа
Недавно была обнаружена серьезная уязвимость переполнения целого числа в языке Move. Эта уязвимость возникает на этапе проверки безопасности ссылок и может привести к атаке типа "отказ в обслуживании". Путем глубокого анализа этой уязвимости мы можем получить более глубокое понимание языка Move.
Язык Move выполняет проверку кода перед исполнением байт-кода, которая делится на четыре этапа. Уязвимость возникает на этапе reference_safety. Модуль reference_safety отвечает за проверку законности операций с ссылками, включая проверку наличия висячих ссылок и безопасность доступа к изменяемым ссылкам.
Процесс верификации осуществляется по единицам функции. Для каждой функции сначала определяются ее базовые блоки. Базовый блок представляет собой последовательность кода, в которой возможны разветвления только на входе и выходе. Затем каждый базовый блок анализируется, генерируются состояния до и после выполнения, и состояния передаются в последующие блоки.
Состояние включает в себя две части информации: locals и borrow graph. locals записывает информацию о локальных переменных, а borrow graph отображает отношения ссылок между переменными. Процесс анализа постоянно обновляет эту информацию о состоянии.
Уязвимость возникает в процессе слияния состояний. Когда общее количество параметров функции и локальных переменных превышает 256, из-за использования типа u8 для представления индексов происходит переполнение целого числа. Это приводит к ошибкам в объединенной информации о состоянии, что может вызвать атаку отказа в обслуживании.
Хотя язык Move имеет механизм проверки количества локальных переменных, он не учитывает количество параметров. Этот упущение привело к возникновению уязвимости.
Чтобы активировать эту уязвимость, злоумышленник может создать цикл кода, используя переполнение для изменения состояния блока. При повторном выполнении, из-за неправильной информации о состоянии, доступ к несуществующей переменной приведет к сбою программы.
Этот уязвимость еще раз подчеркивает, что даже тщательно разработанные языки могут иметь проблемы с безопасностью. Это напоминает нам о важности аудита кода и о том, что в дизайне языка необходимо учитывать более полные аспекты безопасности. Для языка Move добавление большего количества проверок во время выполнения может быть направлением для улучшения.