Обнаружена новая уязвимость переполнения целого числа в модуле безопасности Move языка
Недавно исследователи, углубляясь в анализ языка Move, обнаружили новую уязвимость переполнения целого числа. Эта уязвимость существует в модуле ссылочной безопасности и может привести к серьезной атаке типа "отказ в обслуживании". В этой статье будет подробно представлен процесс обнаружения этой уязвимости и технические детали.
Механизм безопасной ссылочной системы языка Move
Язык Move заимствовал идеи из Rust и поддерживает два типа ссылок: неизменяемая ссылка (&) и изменяемая ссылка (&mut). Модуль безопасности ссылок проверяет законность всех операций со ссылками, сканируя базовые блоки и байт-кодовые инструкции в функции.
Процесс верификации в основном включает в себя следующие шаги:
Проведите анализ каждого базового блока
Выполнение кода основного блока для генерации пост-состояния
Объединить pre state и post state
Обновить состояние блока и распространить его на последующие блоки
В данном случае, state содержит два ключевых компонента: locals и borrow graph, которые предназначены для обеспечения безопасности ссылок в функции.
Детали уязвимости
Уязвимость возникает в функции join_, которая ссылается на безопасный модуль. Когда сумма длины параметров функции и длины локальных переменных превышает 256, использование типа u8 для итерации по локальным переменным приводит к переполнению целого числа.
Конкретно говоря:
iter_locals() возвращает итератор типа u8
Переполнение произойдет, когда длина параметра + длина локальной переменной > 256
Разработчики, похоже, осознали необходимость проверки этого, но фактический код проверяет только количество локальных переменных.
Эксплуатация уязвимостей
Используя эту уязвимость, можно создать циклический блок кода:
При первом выполнении возникает переполнение, изменяется карта locals
При повторном выполнении доступ к несуществующему индексу locals приводит к панике
Это может привести к сбою узлов и вызвать атаку отказа в обслуживании.
Воспроизведение уязвимости
Исследователи предоставили PoC для воспроизведения этой уязвимости:
Установите параметры и локальные переменные как SignatureIndex(0), чтобы num_locals было равно 264
После первого выполнения длина новой карты locals становится 8
При втором выполнении, copyloc(57) доступ к несуществующему offset приводит к панике
Резюме и рекомендации
Этот уязвимость говорит о:
Нет абсолютно безопасного кода, статическая проверка может быть обойдена.
Аудит кода очень важен, он может выявить упущения разработчиков.
Язык Move должен добавить проверки во время выполнения, а не полагаться только на проверки безопасности на стадии валидации.
Исследователи призвали разработчиков языка Move усилить механизмы безопасности во время выполнения, чтобы предотвратить использование подобных уязвимостей и избежать более серьезных проблем.
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
14 Лайков
Награда
14
7
Поделиться
комментарий
0/400
SmartContractWorker
· 9ч назад
Снова на выходе! При ремонте придется повозиться.
Посмотреть ОригиналОтветить0
staking_gramps
· 07-06 05:24
Этот уязвимость слишком примитивна, не так ли?
Посмотреть ОригиналОтветить0
ChainMaskedRider
· 07-06 05:22
Наверное, мастерство написания кода слишком неаккуратно.
Посмотреть ОригиналОтветить0
MissedTheBoat
· 07-06 05:20
Снова обнаружена уязвимость, Move тоже не очень.
Посмотреть ОригиналОтветить0
GateUser-c799715c
· 07-06 05:19
Кто написал код? Какой он плохой.
Посмотреть ОригиналОтветить0
YieldChaser
· 07-06 05:17
u8 снова возникла проблема
Посмотреть ОригиналОтветить0
BridgeJumper
· 07-06 05:09
Нерациональная разработка, две слезы на исправление ошибок
Модуль безопасности ссылки языка Move обнаружил уязвимость переполнения целого числа, что может привести к атаке типа «отказ в обслуживании».
Обнаружена новая уязвимость переполнения целого числа в модуле безопасности Move языка
Недавно исследователи, углубляясь в анализ языка Move, обнаружили новую уязвимость переполнения целого числа. Эта уязвимость существует в модуле ссылочной безопасности и может привести к серьезной атаке типа "отказ в обслуживании". В этой статье будет подробно представлен процесс обнаружения этой уязвимости и технические детали.
Механизм безопасной ссылочной системы языка Move
Язык Move заимствовал идеи из Rust и поддерживает два типа ссылок: неизменяемая ссылка (&) и изменяемая ссылка (&mut). Модуль безопасности ссылок проверяет законность всех операций со ссылками, сканируя базовые блоки и байт-кодовые инструкции в функции.
Процесс верификации в основном включает в себя следующие шаги:
В данном случае, state содержит два ключевых компонента: locals и borrow graph, которые предназначены для обеспечения безопасности ссылок в функции.
Детали уязвимости
Уязвимость возникает в функции join_, которая ссылается на безопасный модуль. Когда сумма длины параметров функции и длины локальных переменных превышает 256, использование типа u8 для итерации по локальным переменным приводит к переполнению целого числа.
Конкретно говоря:
Эксплуатация уязвимостей
Используя эту уязвимость, можно создать циклический блок кода:
Это может привести к сбою узлов и вызвать атаку отказа в обслуживании.
Воспроизведение уязвимости
Исследователи предоставили PoC для воспроизведения этой уязвимости:
Резюме и рекомендации
Этот уязвимость говорит о:
Исследователи призвали разработчиков языка Move усилить механизмы безопасности во время выполнения, чтобы предотвратить использование подобных уязвимостей и избежать более серьезных проблем.