Анализ уязвимости переполнения целых чисел в языке Move с использованием безопасных проверок

robot
Генерация тезисов в процессе

Анализ уязвимости переполнения целых чисел в безопасной верификации ссылок Move

Недавно исследователи, углубляясь в анализ Aptos Moveevm, обнаружили новую уязвимость переполнения целого числа. Эта уязвимость существует в процессе проверки безопасности ссылок языка Move, в частности, касается шага reference_safety. В этой статье мы подробно рассмотрим эту уязвимость и объясним процесс её активации и потенциальные последствия.

Numen Cyber эксклюзивно обнаружил еще одну уязвимость в языке move

Процесс верификации языка Move

Язык Move выполняет проверку единиц кода перед выполнением байт-кода, и этот процесс делится на 4 шага. Обнаруженная уязвимость возникла на этапе reference_safety. Этот этап в основном предназначен для проверки безопасности ссылок, включая проверку на наличие висячих ссылок, безопасность доступа к изменяемым ссылкам и безопасность доступа к глобальным ссылкам.

Процесс верификации сначала будет идентифицировать базовые блоки. В языке Move базовые блоки определяются путем обхода байт-кода и поиска всех последовательностей инструкций ветвления и циклов. Каждый базовый блок представляет собой последовательность кода, не имеющую инструкций ветвления, кроме входа и выхода.

Numen Cyber эксклюзивно обнаружили еще одну уязвимость в языке move

Механизм проверки безопасности цитирования

Язык Move поддерживает два типа ссылок: неизменяемые ссылки (&) и изменяемые ссылки (&mut). Модуль проверки безопасности ссылок будет сканировать байт-код инструкций в каждом блоке базового кода функции, чтобы определить, являются ли все операции со ссылками законными.

В процессе верификации используется структура AbstractState для представления состояния, которая включает в себя два ключевых компонента: borrow graph и locals. Во время верификации сравниваются изменения состояния до и после выполнения базового блока, а результаты передаются в последующие блоки.

Numen Cyber эксклюзивно обнаружил еще одну высокую уязвимость в языке move

Подробности о уязвимостях

Уязвимость существует в функции join_. Эта функция используется для объединения состояний до и после выполнения базовых блоков. Проблема заключается в методе iter_locals(), который возвращает итератор типа u8. Когда сумма длины параметров функции и длины локальных переменных превышает 256, это приводит к переполнению целого числа.

Хотя в языке Move есть процесс проверки количества локальных переменных, он проверяет только количество локальных переменных и не включает длину параметров. Это может быть упущением разработчиков.

Numen Cyber эксклюзивно обнаружил еще одну критическую уязвимость в языке move

Numen Cyber эксклюзивно обнаружил еще одну уязвимость в языке move

Numen Cyber эксклюзивно обнаружил еще одну уязвимость в языке move

Numen Cyber эксклюзивно обнаружил еще одну уязвимость в языке move

Numen Cyber эксклюзивно обнаружил еще одну уязвимость в языке move

Numen Cyber эксклюзивно обнаружил еще одну уязвимость в языке move

Numen Cyber эксклюзивно обнаружила еще одну уязвимость в языке move

Numen Cyber эксклюзивно обнаружил еще одну высокую уязвимость языка move

Numen Cyber эксклюзивно обнаружила еще одну высокоопасную уязвимость в языке move

Использование уязвимостей и их влияние

Используя эту уязвимость переполнения целого числа, злоумышленник может создать специальные циклы кода, изменяющие состояние блока. Когда базовый блок выполняется снова, если индекс, к которому обращается команда, отсутствует в новой карте локальных переменных, это приведет к отказу в обслуживании (DoS).

Конкретно, в модуле reference safety операции MoveLoc/CopyLoc/FreeRef могут вызвать панику из-за доступа к несуществующему LocalIndex, что приведет к сбою всего узла.

Numen Cyber эксклюзивно обнаружил еще одну уязвимость в языке move

Numen Cyber эксклюзивно обнаружил еще одну уязвимость в языке move

Резюме и рекомендации

Этот уязвимость снова доказывает, что даже тщательно разработанные языки могут иметь проблемы с безопасностью. Для языка Move мы рекомендуем:

  1. Усилить аудит кода, чтобы избежать подобных упущений.
  2. Добавьте больше проверочного кода в среду выполнения Move, полагаясь не только на проверки безопасности на этапе верификации.
  3. На этапе эксплуатации необходимо усилить меры безопасности, чтобы предотвратить более серьезные проблемы, вызванные обходом верификации.

Как пионеры в области исследований безопасности языка Move, мы будем продолжать углубленное изучение связанных вопросов безопасности и вносить свой вклад в здоровое развитие экосистемы Move.

Numen Cyber эксклюзивно обнаружил еще одну высокую уязвимость языка move

MOVE-5.85%
Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • 9
  • Поделиться
комментарий
0/400
LiquidationWatchervip
· 07-07 17:46
омг еще одна эксплуатация defi... вызывает у меня сильные воспоминания о 2022 году сейчас
Посмотреть ОригиналОтветить0
BearMarketSunriservip
· 07-07 02:16
move обречено啊,炒a还不如炒b
Посмотреть ОригиналОтветить0
SundayDegenvip
· 07-06 08:36
Тьфу, этот баг действительно немного примитивен.
Посмотреть ОригиналОтветить0
MoonRocketmanvip
· 07-05 04:47
Высота перехвата Move 256 потеряна, будьте осторожны с риском падения ракеты.
Посмотреть ОригиналОтветить0
Web3ProductManagervip
· 07-05 04:47
смотря на данные конверсии, эта ошибка переполнения = серьезное трение в ux, если честно
Посмотреть ОригиналОтветить0
PanicSeller69vip
· 07-05 04:47
Двигайтесь, это слишком хрустяще.
Посмотреть ОригиналОтветить0
WhaleMistakervip
· 07-05 04:46
движение собака хочет остыть?
Посмотреть ОригиналОтветить0
NeverVoteOnDAOvip
· 07-05 04:28
Aptos опять ошибка в коде???
Посмотреть ОригиналОтветить0
SignatureCollectorvip
· 07-05 04:18
Снова проблема переполнения, ползти.
Посмотреть ОригиналОтветить0
Подробнее
  • Закрепить