У механізмі безпеки посилань Move мови виявлено нову уразливість переповнення цілого числа
Нещодавно, під час глибокого дослідження мови Move, ми виявили нову вразливість переповнення цілого числа. Ця вразливість виникає під час процесу перевірки безпеки посилань і стосується деяких основних механізмів мови Move. Аналізуючи цю вразливість, ми можемо глибше зрозуміти дизайн і реалізацію мови Move.
Процес верифікації мови Move
Мова Move перевіряє одиниці коду перед виконанням байт-коду, цей процес складається з 4 етапів. Виявлена уразливість була знайдена на етапі reference_safety.
модуль reference_safety визначає основні функції для перевірки безпеки посилань. Він в основному перевіряє наявність висячих посилань, чи є доступ до змінних посилань безпечним, чи є доступ до глобальних посилань безпечним тощо.
Вхідна функція процесу перевірки викликає analyze_function для аналізу кожної функції. analyze_function перевіряє кожен базовий блок у функції. Базовий блок - це послідовність коду без розгалужуючих інструкцій, за винятком входу та виходу.
Безпека посилань у мові Move
Мова Move підтримує два типи посилань: незмінні посилання (&) та змінні посилання (&mut). Незмінні посилання використовуються для читання даних, змінні посилання - для зміни даних. Такий дизайн допомагає підвищити безпеку та читабельність коду.
Модуль безпечної перевірки посилань буде сканувати байт-код інструкцій кожного базового блоку в функції, визначаючи, чи є всі операції посиланнями законними. Процес перевірки в основному включає:
Виконати код основного блоку
Стан до та після об'єднання виконання
Оновлення стану блоку
Поширення пост умов на наступні блоки
Цей процес подібний до ідеї Sea of Nodes у V8 turbofan.
Аналіз вразливостей
Вразливість виникає під час процесу об'єднання виконання до та після стану. Коли довжина параметрів функції плюс довжина локальних змінних перевищує 256, використання типу u8 для представлення індексу локальної змінної може призвести до переповнення цілого числа.
Хоча в мові Move є процес перевірки кількості локальних змінних, ця перевірка не включає довжину параметрів. Здається, розробники усвідомлюють необхідність перевірки суми параметрів та локальних змінних, але в реальному коді перевіряється лише кількість локальних змінних.
Цей переповнення цілого числа може призвести до атаки відмови в обслуговуванні ( DoS ). Зловмисник може створити циклічний код, використовуючи переповнення для зміни стану блоку. Коли базовий блок виконується знову, якщо індекс, до якого потрібно звернутися в інструкції, не існує в новому стані, це призведе до аварії програми.
Використання вразливостей
Ми створили концептуальне підтвердження (PoC), щоб продемонструвати цю вразливість:
Створіть базовий блок, що містить умовні команди, щоб він виконувався кілька разів.
Встановіть загальну кількість параметрів і локальних змінних на 264, що призводить до переповнення довжини нового відображення локальних змінних на 8.
При повторному виконанні базового блоку спроба доступу до неіснуючого індексу локальної змінної викликає panic.
Висновок
Ця вразливість ще раз доводить, що не існує абсолютно безпечного коду. Хоча мова 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.
У мові Move виявлено нову вразливість переповнення цілого числа в перевірці безпеки.
У механізмі безпеки посилань Move мови виявлено нову уразливість переповнення цілого числа
Нещодавно, під час глибокого дослідження мови Move, ми виявили нову вразливість переповнення цілого числа. Ця вразливість виникає під час процесу перевірки безпеки посилань і стосується деяких основних механізмів мови Move. Аналізуючи цю вразливість, ми можемо глибше зрозуміти дизайн і реалізацію мови Move.
Процес верифікації мови Move
Мова Move перевіряє одиниці коду перед виконанням байт-коду, цей процес складається з 4 етапів. Виявлена уразливість була знайдена на етапі reference_safety.
модуль reference_safety визначає основні функції для перевірки безпеки посилань. Він в основному перевіряє наявність висячих посилань, чи є доступ до змінних посилань безпечним, чи є доступ до глобальних посилань безпечним тощо.
Вхідна функція процесу перевірки викликає analyze_function для аналізу кожної функції. analyze_function перевіряє кожен базовий блок у функції. Базовий блок - це послідовність коду без розгалужуючих інструкцій, за винятком входу та виходу.
Безпека посилань у мові Move
Мова Move підтримує два типи посилань: незмінні посилання (&) та змінні посилання (&mut). Незмінні посилання використовуються для читання даних, змінні посилання - для зміни даних. Такий дизайн допомагає підвищити безпеку та читабельність коду.
Модуль безпечної перевірки посилань буде сканувати байт-код інструкцій кожного базового блоку в функції, визначаючи, чи є всі операції посиланнями законними. Процес перевірки в основному включає:
Цей процес подібний до ідеї Sea of Nodes у V8 turbofan.
Аналіз вразливостей
Вразливість виникає під час процесу об'єднання виконання до та після стану. Коли довжина параметрів функції плюс довжина локальних змінних перевищує 256, використання типу u8 для представлення індексу локальної змінної може призвести до переповнення цілого числа.
Хоча в мові Move є процес перевірки кількості локальних змінних, ця перевірка не включає довжину параметрів. Здається, розробники усвідомлюють необхідність перевірки суми параметрів та локальних змінних, але в реальному коді перевіряється лише кількість локальних змінних.
Цей переповнення цілого числа може призвести до атаки відмови в обслуговуванні ( DoS ). Зловмисник може створити циклічний код, використовуючи переповнення для зміни стану блоку. Коли базовий блок виконується знову, якщо індекс, до якого потрібно звернутися в інструкції, не існує в новому стані, це призведе до аварії програми.
Використання вразливостей
Ми створили концептуальне підтвердження (PoC), щоб продемонструвати цю вразливість:
Висновок
Ця вразливість ще раз доводить, що не існує абсолютно безпечного коду. Хоча мова Move проходить статичну перевірку перед виконанням, її все ще можуть обійти через вразливість переповнення цілого числа.
Щодо майбутнього розвитку мови Move, ми рекомендуємо:
Як піонери у дослідженні безпеки мови Move, ми продовжимо поглиблене вивчення питань безпеки Move, щоб внести свій внесок у її розвиток.