В механизме безопасности ссылок языка Move обнаружена новая уязвимость переполнения целого числа
Недавно, во время глубокого исследования языка Move, мы обнаружили новую уязвимость переполнения целого числа. Эта уязвимость возникает в процессе проверки безопасности ссылок и затрагивает некоторые основные механизмы языка Move. Анализируя эту уязвимость, мы можем глубже понять проектирование и реализацию языка Move.
Процесс проверки языка Move
Язык Move выполняет проверку единиц кода перед выполнением байт-кода, и этот процесс состоит из 4 этапов. Обнаруженная уязвимость возникла на этапе reference_safety.
Модуль reference_safety определяет основные функции для проверки безопасности ссылок. Он в основном проверяет наличие висячих ссылок, безопасность доступа к изменяемым ссылкам, безопасность доступа к глобальным хранилищам и другие проблемы.
Входная функция процесса проверки вызывает analyze_function для анализа каждой функции. analyze_function будет проверять каждый базовый блок в функции. Базовый блок - это последовательность кода, в которой нет инструкций ветвления, кроме входа и выхода.
Безопасность ссылок в языке Move
Язык Move поддерживает два типа ссылок: неизменяемые ссылки ( и изменяемые ссылки )&mut(. Неизменяемые ссылки используются для чтения данных, изменяемые ссылки — для модификации данных. Такой подход способствует повышению безопасности и читаемости кода.
Модуль проверки безопасности будет сканировать байт-кодовые инструкции каждого базового блока в функции, устанавливая, являются ли все операции ссылками законными. Процесс проверки в основном включает в себя:
Выполнение кода основного блока
Состояние до и после объединения выполнения
Обновить состояние блока
Распространение постусловий на последующие блоки
Этот процесс похож на идею Sea of Nodes в V8 turbofan.
![Numen Cyber эксклюзивно обнаружила еще одну уязвимость в языке move])https://img-cdn.gateio.im/webp-social/moments-eb6397a8a98b556071724d98a4837b59.webp(
Анализ уязвимостей
Уязвимость возникает в процессе обработки состояния до и после выполнения объединения. Когда длина параметров функции плюс длина локальных переменных превышает 256, из-за использования типа u8 для представления индексов локальных переменных это может привести к переполнению целого числа.
Хотя язык Move имеет процесс проверки количества локальных переменных, эта проверка не включает длину параметров. Разработчики, похоже, осознали необходимость проверки общей суммы параметров и локальных переменных, но в фактическом коде проверялось только количество локальных переменных.
Это переполнение целого числа может привести к атаке типа "отказ в обслуживании" ) DoS (. Злоумышленник может создать циклический кодовый блок, используя переполнение для изменения состояния блока. При повторном выполнении базового блока, если индекс, к которому требуется доступ в инструкции, не существует в новом состоянии, это приведет к сбою программы.
![Numen Cyber эксклюзивно обнаружил еще одну высокую уязвимость языка move])https://img-cdn.gateio.im/webp-social/moments-6952376046c901dfae2b19d5144746b5.webp(
![Numen Cyber эксклюзивно обнаружил еще одну высокую уязвимость языка move])https://img-cdn.gateio.im/webp-social/moments-92892f2a9dffea9f805f3a1952e82703.webp(
![Numen Cyber эксклюзивно обнаружил еще одну высокую уязвимость языка move])https://img-cdn.gateio.im/webp-social/moments-1347ef8b31983109babdf8ef29270c67.webp(
![Numen Cyber эксклюзивно обнаружил еще одну уязвимость в языке move])https://img-cdn.gateio.im/webp-social/moments-ac937ab4f426d30a476feb32520a95b4.webp(
![Numen Cyber эксклюзивно обнаружил еще одну уязвимость в языке move])https://img-cdn.gateio.im/webp-social/moments-a18dcf64108d1a75b728ffe8391100f1.webp(
![Numen Cyber эксклюзивно обнаружил еще одну уязвимость в языке move])https://img-cdn.gateio.im/webp-social/moments-7c8fe4e4cf376ad49d729a6f80df6f08.webp(
![Numen Cyber обнаружил еще одну высокоопасную уязвимость языка move])https://img-cdn.gateio.im/webp-social/moments-c598d61833550ec5494f9a5a4ee2a760.webp(
![Numen Cyber эксклюзивно обнаружил еще одну серьезную уязвимость в языке move])https://img-cdn.gateio.im/webp-social/moments-12c60c225a5629f6d927982a7585fc5b.webp(
![Numen Cyber эксклюзивно обнаружил еще одну уязвимость в языке move])https://img-cdn.gateio.im/webp-social/moments-94b0c97bb9e287ed715cddb5165f129d.webp(
Эксплуатация уязвимостей
Мы создали прототип )PoC(, чтобы продемонстрировать этот уязвимость:
Создайте базовый блок с инструкциями безусловного перехода, чтобы он выполнялся несколько раз.
Установите общее количество параметров и локальных переменных на 264, что приведет к переполнению длины новой локальной переменной в 8.
При повторном выполнении базового блока попытка доступа к несуществующему индексу локальной переменной вызывает панику.
![Numen Cyber эксклюзивно обнаружил еще одну уязвимость в языке move])https://img-cdn.gateio.im/webp-social/moments-095e2b585c45a86b0a689214ca673619.webp(
![Numen Cyber эксклюзивно обнаружил еще одну уязвимость высокого риска в языке move])https://img-cdn.gateio.im/webp-social/moments-5ebaa03263f7a87edd78d146c5beadd2.webp(
![Numen Cyber эксклюзивно обнаружил еще одну уязвимость в языке move])https://img-cdn.gateio.im/webp-social/moments-fe905356cbee596e8aba08ec14f5d508.webp(
![Numen Cyber эксклюзивно обнаружил ещё одну уязвимость в языке move])https://img-cdn.gateio.im/webp-social/moments-ae25cc7d31726e2e1477e6d112b7aa75.webp(
Вывод
Этот уязвимость снова доказывает, что нет абсолютно безопасного кода. Хотя язык Move проходит статическую проверку перед выполнением, его все еще можно обойти с помощью уязвимости переполнения целого числа.
Что касается будущего языка Move, мы предлагаем:
Увеличьте количество проверочных кодов во время выполнения, чтобы предотвратить неожиданности.
Не полагайтесь только на проверки безопасности на этапе валидации, также необходимо проводить усиление безопасности на этапе эксплуатации.
Будучи пионерами в области исследований безопасности языка 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.
16 Лайков
Награда
16
3
Поделиться
комментарий
0/400
SnapshotLaborer
· 10ч назад
Ты уже пошел сообщить об ошибках после пяти минут обучения?
В языке Move обнаружена новая уязвимость переполнения целого числа при проверке безопасности.
В механизме безопасности ссылок языка Move обнаружена новая уязвимость переполнения целого числа
Недавно, во время глубокого исследования языка Move, мы обнаружили новую уязвимость переполнения целого числа. Эта уязвимость возникает в процессе проверки безопасности ссылок и затрагивает некоторые основные механизмы языка Move. Анализируя эту уязвимость, мы можем глубже понять проектирование и реализацию языка Move.
Процесс проверки языка Move
Язык Move выполняет проверку единиц кода перед выполнением байт-кода, и этот процесс состоит из 4 этапов. Обнаруженная уязвимость возникла на этапе reference_safety.
Модуль reference_safety определяет основные функции для проверки безопасности ссылок. Он в основном проверяет наличие висячих ссылок, безопасность доступа к изменяемым ссылкам, безопасность доступа к глобальным хранилищам и другие проблемы.
Входная функция процесса проверки вызывает analyze_function для анализа каждой функции. analyze_function будет проверять каждый базовый блок в функции. Базовый блок - это последовательность кода, в которой нет инструкций ветвления, кроме входа и выхода.
Безопасность ссылок в языке Move
Язык Move поддерживает два типа ссылок: неизменяемые ссылки ( и изменяемые ссылки )&mut(. Неизменяемые ссылки используются для чтения данных, изменяемые ссылки — для модификации данных. Такой подход способствует повышению безопасности и читаемости кода.
Модуль проверки безопасности будет сканировать байт-кодовые инструкции каждого базового блока в функции, устанавливая, являются ли все операции ссылками законными. Процесс проверки в основном включает в себя:
Этот процесс похож на идею Sea of Nodes в V8 turbofan.
![Numen Cyber эксклюзивно обнаружила еще одну уязвимость в языке move])https://img-cdn.gateio.im/webp-social/moments-eb6397a8a98b556071724d98a4837b59.webp(
Анализ уязвимостей
Уязвимость возникает в процессе обработки состояния до и после выполнения объединения. Когда длина параметров функции плюс длина локальных переменных превышает 256, из-за использования типа u8 для представления индексов локальных переменных это может привести к переполнению целого числа.
Хотя язык Move имеет процесс проверки количества локальных переменных, эта проверка не включает длину параметров. Разработчики, похоже, осознали необходимость проверки общей суммы параметров и локальных переменных, но в фактическом коде проверялось только количество локальных переменных.
Это переполнение целого числа может привести к атаке типа "отказ в обслуживании" ) DoS (. Злоумышленник может создать циклический кодовый блок, используя переполнение для изменения состояния блока. При повторном выполнении базового блока, если индекс, к которому требуется доступ в инструкции, не существует в новом состоянии, это приведет к сбою программы.
![Numen Cyber эксклюзивно обнаружил еще одну высокую уязвимость языка move])https://img-cdn.gateio.im/webp-social/moments-6952376046c901dfae2b19d5144746b5.webp(
![Numen Cyber эксклюзивно обнаружил еще одну высокую уязвимость языка move])https://img-cdn.gateio.im/webp-social/moments-92892f2a9dffea9f805f3a1952e82703.webp(
![Numen Cyber эксклюзивно обнаружил еще одну высокую уязвимость языка move])https://img-cdn.gateio.im/webp-social/moments-1347ef8b31983109babdf8ef29270c67.webp(
![Numen Cyber эксклюзивно обнаружил еще одну уязвимость в языке move])https://img-cdn.gateio.im/webp-social/moments-ac937ab4f426d30a476feb32520a95b4.webp(
![Numen Cyber эксклюзивно обнаружил еще одну уязвимость в языке move])https://img-cdn.gateio.im/webp-social/moments-a18dcf64108d1a75b728ffe8391100f1.webp(
![Numen Cyber эксклюзивно обнаружил еще одну уязвимость в языке move])https://img-cdn.gateio.im/webp-social/moments-7c8fe4e4cf376ad49d729a6f80df6f08.webp(
![Numen Cyber обнаружил еще одну высокоопасную уязвимость языка move])https://img-cdn.gateio.im/webp-social/moments-c598d61833550ec5494f9a5a4ee2a760.webp(
![Numen Cyber эксклюзивно обнаружил еще одну серьезную уязвимость в языке move])https://img-cdn.gateio.im/webp-social/moments-12c60c225a5629f6d927982a7585fc5b.webp(
![Numen Cyber эксклюзивно обнаружил еще одну уязвимость в языке move])https://img-cdn.gateio.im/webp-social/moments-94b0c97bb9e287ed715cddb5165f129d.webp(
Эксплуатация уязвимостей
Мы создали прототип )PoC(, чтобы продемонстрировать этот уязвимость:
![Numen Cyber эксклюзивно обнаружил еще одну уязвимость в языке move])https://img-cdn.gateio.im/webp-social/moments-095e2b585c45a86b0a689214ca673619.webp(
![Numen Cyber эксклюзивно обнаружил еще одну уязвимость высокого риска в языке move])https://img-cdn.gateio.im/webp-social/moments-5ebaa03263f7a87edd78d146c5beadd2.webp(
![Numen Cyber эксклюзивно обнаружил еще одну уязвимость в языке move])https://img-cdn.gateio.im/webp-social/moments-fe905356cbee596e8aba08ec14f5d508.webp(
![Numen Cyber эксклюзивно обнаружил ещё одну уязвимость в языке move])https://img-cdn.gateio.im/webp-social/moments-ae25cc7d31726e2e1477e6d112b7aa75.webp(
Вывод
Этот уязвимость снова доказывает, что нет абсолютно безопасного кода. Хотя язык Move проходит статическую проверку перед выполнением, его все еще можно обойти с помощью уязвимости переполнения целого числа.
Что касается будущего языка Move, мы предлагаем:
Будучи пионерами в области исследований безопасности языка Move, мы будем продолжать углубленное изучение вопросов безопасности Move и вносить свой вклад в его развитие.