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