В механизме безопасного обращения с ссылками языка Move обнаружена новая уязвимость переполнения целого числа
Недавно исследователи по безопасности обнаружили новую уязвимость переполнения целого числа при глубоком анализе Aptos MoveEVM. Эта уязвимость существует в процессе проверки безопасности ссылок языка Move, конкретно на этапе reference_safety.
Язык Move выполняет проверку единиц кода перед выполнением байт-кода, что состоит из 4 этапов. Проверка безопасности ссылок является одним из важных этапов, который в основном используется для обеспечения того, чтобы не было висячих ссылок, доступ к изменяемым ссылкам был безопасным, а доступ к ссылкам глобального хранилища был безопасным и т. д.
Основой безопасной проверки является анализ базовых блоков в каждой функции. Базовый блок - это последовательность кода, которая не содержит ветвящих инструкций, кроме входа и выхода. Move определяет базовые блоки, обходя байт-код и находя все ветвящие и циклические инструкции.
Процесс верификации использует структуру AbstractState для представления состояния, которая включает в себя две части: граф заимствований и локальные переменные. Во время верификации выполняется генерация кода базового блока для постсостояния, которое затем объединяется с предшествующим состоянием для обновления состояния блока и распространения на последующие блоки. Этот процесс похож на концепцию Sea of Nodes в V8 turbofan.
Уязвимость возникает в функции join_. Когда сумма длины параметров функции и длины локальных переменных превышает 256, использование типа u8 для итерации по local приводит к переполнению целого числа. Хотя в Move есть процесс проверки количества locals, он проверяет только locals и не включает длину параметров.
Используя эту уязвимость, злоумышленник может создать циклический блок кода, используя переполнение для изменения состояния блока. При повторном выполнении, если индекс, который требуется для доступа в инструкции, отсутствует в новой карте локальных переменных, это приведет к DoS.
Этот уязвимость снова подчеркивает, что даже такие языки, как Move, которые придают большое значение безопасности, могут иметь проблемы. Рекомендуется разработчикам языка Move добавить больше проверок во время выполнения, а не полагаться только на проверки безопасности на этапе валидации. Также напоминается разработчикам о важности аудита кода.
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
13 Лайков
Награда
13
5
Поделиться
комментарий
0/400
BoredWatcher
· 07-20 18:00
Этот баг просто ужасен, как можно быть таким примитивным?
Посмотреть ОригиналОтветить0
WalletInspector
· 07-20 17:59
Эх, лучше использовать Rust, чем Move.
Посмотреть ОригиналОтветить0
MemecoinTrader
· 07-20 17:58
лmao еще один l1 получает рект... классическая утечка альфа из-за переполнения целого числа
Посмотреть ОригиналОтветить0
LidoStakeAddict
· 07-20 17:56
Move снова возникли проблемы. Тьфу-тьфу.
Посмотреть ОригиналОтветить0
BuyHighSellLow
· 07-20 17:53
Снова все разваливается. Уничтожь это. Начнем все с начала.
Обнаружена уязвимость переполнения целого числа в механизме безопасности ссылок языка Move, затрагивающая AptosMoveEVM.
В механизме безопасного обращения с ссылками языка Move обнаружена новая уязвимость переполнения целого числа
Недавно исследователи по безопасности обнаружили новую уязвимость переполнения целого числа при глубоком анализе Aptos MoveEVM. Эта уязвимость существует в процессе проверки безопасности ссылок языка Move, конкретно на этапе reference_safety.
Язык Move выполняет проверку единиц кода перед выполнением байт-кода, что состоит из 4 этапов. Проверка безопасности ссылок является одним из важных этапов, который в основном используется для обеспечения того, чтобы не было висячих ссылок, доступ к изменяемым ссылкам был безопасным, а доступ к ссылкам глобального хранилища был безопасным и т. д.
Основой безопасной проверки является анализ базовых блоков в каждой функции. Базовый блок - это последовательность кода, которая не содержит ветвящих инструкций, кроме входа и выхода. Move определяет базовые блоки, обходя байт-код и находя все ветвящие и циклические инструкции.
Процесс верификации использует структуру AbstractState для представления состояния, которая включает в себя две части: граф заимствований и локальные переменные. Во время верификации выполняется генерация кода базового блока для постсостояния, которое затем объединяется с предшествующим состоянием для обновления состояния блока и распространения на последующие блоки. Этот процесс похож на концепцию Sea of Nodes в V8 turbofan.
Уязвимость возникает в функции join_. Когда сумма длины параметров функции и длины локальных переменных превышает 256, использование типа u8 для итерации по local приводит к переполнению целого числа. Хотя в Move есть процесс проверки количества locals, он проверяет только locals и не включает длину параметров.
Используя эту уязвимость, злоумышленник может создать циклический блок кода, используя переполнение для изменения состояния блока. При повторном выполнении, если индекс, который требуется для доступа в инструкции, отсутствует в новой карте локальных переменных, это приведет к DoS.
Этот уязвимость снова подчеркивает, что даже такие языки, как Move, которые придают большое значение безопасности, могут иметь проблемы. Рекомендуется разработчикам языка Move добавить больше проверок во время выполнения, а не полагаться только на проверки безопасности на этапе валидации. Также напоминается разработчикам о важности аудита кода.