У Move знову виявлено небезпечну уразливість: переповнення цілого числа може призвести до краху Ноди
Нещодавно, дослідники безпеки під час глибокого аналізу Aptos Moveevm виявили нову уразливість переповнення цілого числа. Ця уразливість існує в процесі верифікації безпеки посилань мови Move і може призвести до краху ноди.
Мова Move перед виконанням байт-коду проходить перевірку коду, що складається з 4 етапів. Ця вразливість виникає на етапі reference_safety. Цей етап в основному призначений для перевірки безпеки посилань, включаючи перевірку на наявність висячих посилань, чи є доступ до змінних посилань безпечним тощо.
Процес верифікації проходитиме через кожен базовий блок і виконуватиме його аналіз. Базовий блок – це послідовність коду, яка не має інструкцій розгалуження, окрім входу та виходу. Мова Move визначає базові блоки, шукаючи інструкції розгалуження та циклів.
Під час перевірки безпеки посилань підтримується структура AbstractState, яка містить інформацію про граф позик і локальні змінні. Процес перевірки виконує код базового блоку, генерує стан після виконання, а потім об'єднує його з попереднім станом, оновлює стан блоку та поширює його на наступні блоки.
Вразливість виникла в функції join_. Ця функція використовується для об'єднання стану до і після виконання, оновлення locals і графа позик. Коли сума довжини параметрів і довжини локальних змінних перевищує 256, використання типу u8 для ітерації locals призводить до переповнення цілих чисел.
Використовуючи цей переповнення, можна змінити стан основного блоку. У випадку циклічного коду, багаторазове виконання одного й того ж основного блоку може призвести до доступу до неіснуючих індексів locals, що може викликати panic і призвести до збоїв ноди.
Дослідники надали код PoC, який викликає переповнення цілого числа, налаштувавши певні параметри та кількість локальних змінних, що врешті-решт призводить до паніки.
Ця вразливість демонструє, що навіть такі мови, як Move, які приділяють увагу безпеці, можуть мати вразливості. Рекомендується, щоб розробники мови Move додали більше перевірок безпеки під час виконання, а не просто покладалися на перевірки на етапі валідації. Це також підкреслює важливість аудиту коду.
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
Уразливість переповнення цілих чисел мови Move: ризики безпечної перевірки посилань
У Move знову виявлено небезпечну уразливість: переповнення цілого числа може призвести до краху Ноди
Нещодавно, дослідники безпеки під час глибокого аналізу Aptos Moveevm виявили нову уразливість переповнення цілого числа. Ця уразливість існує в процесі верифікації безпеки посилань мови Move і може призвести до краху ноди.
Мова Move перед виконанням байт-коду проходить перевірку коду, що складається з 4 етапів. Ця вразливість виникає на етапі reference_safety. Цей етап в основному призначений для перевірки безпеки посилань, включаючи перевірку на наявність висячих посилань, чи є доступ до змінних посилань безпечним тощо.
Процес верифікації проходитиме через кожен базовий блок і виконуватиме його аналіз. Базовий блок – це послідовність коду, яка не має інструкцій розгалуження, окрім входу та виходу. Мова Move визначає базові блоки, шукаючи інструкції розгалуження та циклів.
Під час перевірки безпеки посилань підтримується структура AbstractState, яка містить інформацію про граф позик і локальні змінні. Процес перевірки виконує код базового блоку, генерує стан після виконання, а потім об'єднує його з попереднім станом, оновлює стан блоку та поширює його на наступні блоки.
Вразливість виникла в функції join_. Ця функція використовується для об'єднання стану до і після виконання, оновлення locals і графа позик. Коли сума довжини параметрів і довжини локальних змінних перевищує 256, використання типу u8 для ітерації locals призводить до переповнення цілих чисел.
Використовуючи цей переповнення, можна змінити стан основного блоку. У випадку циклічного коду, багаторазове виконання одного й того ж основного блоку може призвести до доступу до неіснуючих індексів locals, що може викликати panic і призвести до збоїв ноди.
Дослідники надали код PoC, який викликає переповнення цілого числа, налаштувавши певні параметри та кількість локальних змінних, що врешті-решт призводить до паніки.
Ця вразливість демонструє, що навіть такі мови, як Move, які приділяють увагу безпеці, можуть мати вразливості. Рекомендується, щоб розробники мови Move додали більше перевірок безпеки під час виконання, а не просто покладалися на перевірки на етапі валідації. Це також підкреслює важливість аудиту коду.