Анализ уязвимости переполнения целых чисел в безопасной верификации ссылок Move
Недавно исследователи, углубляясь в анализ Aptos Moveevm, обнаружили новую уязвимость переполнения целого числа. Эта уязвимость существует в процессе проверки безопасности ссылок языка Move, в частности, касается шага reference_safety. В этой статье мы подробно рассмотрим эту уязвимость и объясним процесс её активации и потенциальные последствия.
Процесс верификации языка Move
Язык Move выполняет проверку единиц кода перед выполнением байт-кода, и этот процесс делится на 4 шага. Обнаруженная уязвимость возникла на этапе reference_safety. Этот этап в основном предназначен для проверки безопасности ссылок, включая проверку на наличие висячих ссылок, безопасность доступа к изменяемым ссылкам и безопасность доступа к глобальным ссылкам.
Процесс верификации сначала будет идентифицировать базовые блоки. В языке Move базовые блоки определяются путем обхода байт-кода и поиска всех последовательностей инструкций ветвления и циклов. Каждый базовый блок представляет собой последовательность кода, не имеющую инструкций ветвления, кроме входа и выхода.
Механизм проверки безопасности цитирования
Язык Move поддерживает два типа ссылок: неизменяемые ссылки (&) и изменяемые ссылки (&mut). Модуль проверки безопасности ссылок будет сканировать байт-код инструкций в каждом блоке базового кода функции, чтобы определить, являются ли все операции со ссылками законными.
В процессе верификации используется структура AbstractState для представления состояния, которая включает в себя два ключевых компонента: borrow graph и locals. Во время верификации сравниваются изменения состояния до и после выполнения базового блока, а результаты передаются в последующие блоки.
Подробности о уязвимостях
Уязвимость существует в функции join_. Эта функция используется для объединения состояний до и после выполнения базовых блоков. Проблема заключается в методе iter_locals(), который возвращает итератор типа u8. Когда сумма длины параметров функции и длины локальных переменных превышает 256, это приводит к переполнению целого числа.
Хотя в языке Move есть процесс проверки количества локальных переменных, он проверяет только количество локальных переменных и не включает длину параметров. Это может быть упущением разработчиков.
Использование уязвимостей и их влияние
Используя эту уязвимость переполнения целого числа, злоумышленник может создать специальные циклы кода, изменяющие состояние блока. Когда базовый блок выполняется снова, если индекс, к которому обращается команда, отсутствует в новой карте локальных переменных, это приведет к отказу в обслуживании (DoS).
Конкретно, в модуле reference safety операции MoveLoc/CopyLoc/FreeRef могут вызвать панику из-за доступа к несуществующему LocalIndex, что приведет к сбою всего узла.
Резюме и рекомендации
Этот уязвимость снова доказывает, что даже тщательно разработанные языки могут иметь проблемы с безопасностью. Для языка Move мы рекомендуем:
Усилить аудит кода, чтобы избежать подобных упущений.
Добавьте больше проверочного кода в среду выполнения Move, полагаясь не только на проверки безопасности на этапе верификации.
На этапе эксплуатации необходимо усилить меры безопасности, чтобы предотвратить более серьезные проблемы, вызванные обходом верификации.
Как пионеры в области исследований безопасности языка Move, мы будем продолжать углубленное изучение связанных вопросов безопасности и вносить свой вклад в здоровое развитие экосистемы Move.
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
21 Лайков
Награда
21
9
Поделиться
комментарий
0/400
LiquidationWatcher
· 07-07 17:46
омг еще одна эксплуатация defi... вызывает у меня сильные воспоминания о 2022 году сейчас
Посмотреть ОригиналОтветить0
BearMarketSunriser
· 07-07 02:16
move обречено啊,炒a还不如炒b
Посмотреть ОригиналОтветить0
SundayDegen
· 07-06 08:36
Тьфу, этот баг действительно немного примитивен.
Посмотреть ОригиналОтветить0
MoonRocketman
· 07-05 04:47
Высота перехвата Move 256 потеряна, будьте осторожны с риском падения ракеты.
Посмотреть ОригиналОтветить0
Web3ProductManager
· 07-05 04:47
смотря на данные конверсии, эта ошибка переполнения = серьезное трение в ux, если честно
Анализ уязвимости переполнения целых чисел в языке Move с использованием безопасных проверок
Анализ уязвимости переполнения целых чисел в безопасной верификации ссылок Move
Недавно исследователи, углубляясь в анализ Aptos Moveevm, обнаружили новую уязвимость переполнения целого числа. Эта уязвимость существует в процессе проверки безопасности ссылок языка Move, в частности, касается шага reference_safety. В этой статье мы подробно рассмотрим эту уязвимость и объясним процесс её активации и потенциальные последствия.
Процесс верификации языка Move
Язык Move выполняет проверку единиц кода перед выполнением байт-кода, и этот процесс делится на 4 шага. Обнаруженная уязвимость возникла на этапе reference_safety. Этот этап в основном предназначен для проверки безопасности ссылок, включая проверку на наличие висячих ссылок, безопасность доступа к изменяемым ссылкам и безопасность доступа к глобальным ссылкам.
Процесс верификации сначала будет идентифицировать базовые блоки. В языке Move базовые блоки определяются путем обхода байт-кода и поиска всех последовательностей инструкций ветвления и циклов. Каждый базовый блок представляет собой последовательность кода, не имеющую инструкций ветвления, кроме входа и выхода.
Механизм проверки безопасности цитирования
Язык Move поддерживает два типа ссылок: неизменяемые ссылки (&) и изменяемые ссылки (&mut). Модуль проверки безопасности ссылок будет сканировать байт-код инструкций в каждом блоке базового кода функции, чтобы определить, являются ли все операции со ссылками законными.
В процессе верификации используется структура AbstractState для представления состояния, которая включает в себя два ключевых компонента: borrow graph и locals. Во время верификации сравниваются изменения состояния до и после выполнения базового блока, а результаты передаются в последующие блоки.
Подробности о уязвимостях
Уязвимость существует в функции join_. Эта функция используется для объединения состояний до и после выполнения базовых блоков. Проблема заключается в методе iter_locals(), который возвращает итератор типа u8. Когда сумма длины параметров функции и длины локальных переменных превышает 256, это приводит к переполнению целого числа.
Хотя в языке Move есть процесс проверки количества локальных переменных, он проверяет только количество локальных переменных и не включает длину параметров. Это может быть упущением разработчиков.
Использование уязвимостей и их влияние
Используя эту уязвимость переполнения целого числа, злоумышленник может создать специальные циклы кода, изменяющие состояние блока. Когда базовый блок выполняется снова, если индекс, к которому обращается команда, отсутствует в новой карте локальных переменных, это приведет к отказу в обслуживании (DoS).
Конкретно, в модуле reference safety операции MoveLoc/CopyLoc/FreeRef могут вызвать панику из-за доступа к несуществующему LocalIndex, что приведет к сбою всего узла.
Резюме и рекомендации
Этот уязвимость снова доказывает, что даже тщательно разработанные языки могут иметь проблемы с безопасностью. Для языка Move мы рекомендуем:
Как пионеры в области исследований безопасности языка Move, мы будем продолжать углубленное изучение связанных вопросов безопасности и вносить свой вклад в здоровое развитие экосистемы Move.