У модулі безпеки Move мови виявлено новий дефект переповнення цілого числа
Нещодавно, під час поглибленого вивчення мови Move, ми виявили новий вразливість переповнення цілого числа. Ця вразливість існує в процесі перевірки безпеки посилань, а процес її спрацьовування є досить цікавим. У цій статті ми детально проаналізуємо цю вразливість та обговоримо деякі фонові знання про мову Move.
Мова Move перед виконанням байт-коду проходить перевірку кодових одиниць, що складається з чотирьох етапів. Ця уразливість виникає на етапі reference_safety. Цей етап відповідає за перевірку безпеки посилань, включаючи перевірку на наявність висячих посилань, безпечність доступу до змінних посилань, безпечність доступу до глобальних зберігань тощо.
Функція входу, що викликає безпечну верифікацію, викликає analyze_function для перевірки кожного базового блоку. Базовий блок - це послідовність коду, що не має інструкцій розгалуження, крім входу та виходу. Мова Move ідентифікує базові блоки, перебираючи байт-код та шукаючи всі інструкції розгалуження та циклів.
Мова Move підтримує два типи посилань: незмінні посилання (&) та змінні посилання (&mut). Модуль безпеки посилань перевіряє законність усіх операцій з посиланнями, скануючи байт-код інструкцій базових блоків у функції. Процес перевірки використовує структуру AbstractState, яка містить граф запозичень та локальні змінні, щоб забезпечити безпеку посилань у функції.
Уразливість виникає у функції join_. Коли довжина параметрів плюс довжина локальних змінних перевищує 256, через те, що функція iter_locals() повертає ітератор типу u8, це може призвести до переповнення цілого числа. Хоча в Move є перевірка кількості локальних змінних, в модулі перевірки меж лише перевіряються локальні змінні, без включення довжини параметрів.
Цей переповнення цілим числом може призвести до атаки відмови в обслуговуванні (DoS). Коли існує циклічний блок коду і використовується переповнення для зміни стану блоку, нова карта локальних змінних відрізняється від попередньої. Під час повторного виконання функції execute_block, якщо індекс, до якого потрібно звернутися в інструкції, не існує в новій карті локальних змінних AbstractState, це призведе до DoS.
Ми надали PoC, який можна відтворити в git. Код у цьому PoC містить інструкцію безумовного переходу, яка щоразу, коли виконується остання інструкція, повертається до першої інструкції, що призводить до багаторазового виклику функцій execute_block та join.
Ця уразливість показує, що навіть такі мови, як Move, які акцентують увагу на безпеці, можуть мати потенційні загрози безпеці. Важливість аудиту коду важко переоцінити, адже програмісти не застраховані від недбалості. Як лідери у дослідженнях безпеки мови Move, ми будемо продовжувати поглиблене вивчення питань безпеки Move.
Ми рекомендуємо розробникам мови Move додати більше перевірок під час виконання, щоб запобігти випадковим ситуаціям. В даний час Move переважно проводить перевірки безпеки на стадії перевірки, але цього може бути недостатньо. Як тільки верифікацію буде обійдено, недостатня безпека під час виконання може призвести до більш серйозних проблем.
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
У Move мові виявлено вразливість цілочисельного переповнення в модулі безпеки, що може призвести до атаки типу DoS.
У модулі безпеки Move мови виявлено новий дефект переповнення цілого числа
Нещодавно, під час поглибленого вивчення мови Move, ми виявили новий вразливість переповнення цілого числа. Ця вразливість існує в процесі перевірки безпеки посилань, а процес її спрацьовування є досить цікавим. У цій статті ми детально проаналізуємо цю вразливість та обговоримо деякі фонові знання про мову Move.
Мова Move перед виконанням байт-коду проходить перевірку кодових одиниць, що складається з чотирьох етапів. Ця уразливість виникає на етапі reference_safety. Цей етап відповідає за перевірку безпеки посилань, включаючи перевірку на наявність висячих посилань, безпечність доступу до змінних посилань, безпечність доступу до глобальних зберігань тощо.
Функція входу, що викликає безпечну верифікацію, викликає analyze_function для перевірки кожного базового блоку. Базовий блок - це послідовність коду, що не має інструкцій розгалуження, крім входу та виходу. Мова Move ідентифікує базові блоки, перебираючи байт-код та шукаючи всі інструкції розгалуження та циклів.
Мова Move підтримує два типи посилань: незмінні посилання (&) та змінні посилання (&mut). Модуль безпеки посилань перевіряє законність усіх операцій з посиланнями, скануючи байт-код інструкцій базових блоків у функції. Процес перевірки використовує структуру AbstractState, яка містить граф запозичень та локальні змінні, щоб забезпечити безпеку посилань у функції.
Уразливість виникає у функції join_. Коли довжина параметрів плюс довжина локальних змінних перевищує 256, через те, що функція iter_locals() повертає ітератор типу u8, це може призвести до переповнення цілого числа. Хоча в Move є перевірка кількості локальних змінних, в модулі перевірки меж лише перевіряються локальні змінні, без включення довжини параметрів.
Цей переповнення цілим числом може призвести до атаки відмови в обслуговуванні (DoS). Коли існує циклічний блок коду і використовується переповнення для зміни стану блоку, нова карта локальних змінних відрізняється від попередньої. Під час повторного виконання функції execute_block, якщо індекс, до якого потрібно звернутися в інструкції, не існує в новій карті локальних змінних AbstractState, це призведе до DoS.
Ми надали PoC, який можна відтворити в git. Код у цьому PoC містить інструкцію безумовного переходу, яка щоразу, коли виконується остання інструкція, повертається до першої інструкції, що призводить до багаторазового виклику функцій execute_block та join.
Ця уразливість показує, що навіть такі мови, як Move, які акцентують увагу на безпеці, можуть мати потенційні загрози безпеці. Важливість аудиту коду важко переоцінити, адже програмісти не застраховані від недбалості. Як лідери у дослідженнях безпеки мови Move, ми будемо продовжувати поглиблене вивчення питань безпеки Move.
Ми рекомендуємо розробникам мови Move додати більше перевірок під час виконання, щоб запобігти випадковим ситуаціям. В даний час Move переважно проводить перевірки безпеки на стадії перевірки, але цього може бути недостатньо. Як тільки верифікацію буде обійдено, недостатня безпека під час виконання може призвести до більш серйозних проблем.