Аналіз вразливості переповнення цілого числа мови Move
Після глибокого дослідження мови Move ми виявили нову уразливість переповнення цілого числа. Ця уразливість виникає на етапі перевірки безпеки посилань у процесі верифікації байт-коду мови Move. У цій статті ми детально проаналізуємо процес спрацьовування цієї уразливості та обговоримо деякі основні концепції мови Move.
Процес верифікації байт-коду Move мови
Перед виконанням байт-коду мова Move проводить перевірку коду, яка ділиться на 4 етапи. Ця вразливість виникла на етапі reference_safety. Цей етап в основному відповідає за перевірку безпеки посилань, включаючи перевірку на наявність висячих посилань, чи безпечний доступ до змінних посилань тощо.
Процес верифікації спочатку визначає основні блоки в коді. Основний блок - це послідовність коду, яка не містить інструкцій розгалуження, крім входу та виходу. Move визначає основні блоки шляхом обходу байт-коду, шукаючи всі інструкції розгалуження та циклічні інструкції.
Безпека посилань у Move
Move підтримує два типи посилань: незмінне посилання (&) та змінне посилання (&mut). Модуль безпеки посилань перевіряє байт-код інструкцій кожного базового блоку у функції, щоб підтвердити, що всі операції з посиланнями є законними.
Процес верифікації використовує структуру AbstractState для представлення стану, яка містить граф позик та локальні змінні. Під час верифікації буде порівнюватися стан до та після виконання, а також об'єднуватися оновлені стани блоку.
Аналіз вразливостей
Уразливість виникає у функції join_. Ця функція використовується для об'єднання станів до та після виконання, оновлюючи карту locals та граф запозичень. Проблема полягає в тому, що ітератор locals повертає тип u8, і коли сума довжини параметрів та довжини локальних змінних перевищує 256, відбувається переповнення.
Хоча у Move є процес перевірки кількості локальних змінних, він перевіряє лише кількість локальних змінних, а не довжину параметрів.
Використання вразливостей
Використовуючи цей переповненість, можна змінити стан базового блоку. У циклі код виконується, після чого стан змінюється. Коли його виконують знову, якщо індекс, який доступний інструкцією, не існує в новій карті локальних змінних, це призведе до паніки, що реалізує DoS-атаку.
Демонстрація PoC
Надано відтворюваний код PoC, який викликає переповнення цілих чисел, спричиняючи збій програми, шляхом налаштування певних параметрів і кількості локальних змінних.
Підсумок
Ця уразливість ще раз підтверджує важливість аудитів коду. Для мови Move рекомендується додати більше перевірок безпеки під час виконання, а не лише покладатися на перевірки на етапі верифікації. Ми будемо продовжувати глибше досліджувати проблеми безпеки мови Move та вносити свій внесок у її розвиток.
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
25 лайків
Нагородити
25
7
Поділіться
Прокоментувати
0/400
RektButStillHere
· 07-11 04:35
Знову переповнено, тьфу-тьфу.
Переглянути оригіналвідповісти на0
consensus_failure
· 07-11 01:01
Виявляється, є ще цей баг
Переглянути оригіналвідповісти на0
SchrodingersPaper
· 07-09 07:32
move знову відправив? Погрався і програв, погрався і програв
Переглянути оригіналвідповісти на0
DevChive
· 07-08 16:28
菜鸟被 обдурювати людей, як лохів
Переглянути оригіналвідповісти на0
ProposalManiac
· 07-08 06:09
Раніше говорили, що перевірка параметрів не може бути лише в документації.
Розкриття вразливості переповнення цілих чисел у мові Move: небезпеки верифікації байт-коду
Аналіз вразливості переповнення цілого числа мови Move
Після глибокого дослідження мови Move ми виявили нову уразливість переповнення цілого числа. Ця уразливість виникає на етапі перевірки безпеки посилань у процесі верифікації байт-коду мови Move. У цій статті ми детально проаналізуємо процес спрацьовування цієї уразливості та обговоримо деякі основні концепції мови Move.
Процес верифікації байт-коду Move мови
Перед виконанням байт-коду мова Move проводить перевірку коду, яка ділиться на 4 етапи. Ця вразливість виникла на етапі reference_safety. Цей етап в основному відповідає за перевірку безпеки посилань, включаючи перевірку на наявність висячих посилань, чи безпечний доступ до змінних посилань тощо.
Процес верифікації спочатку визначає основні блоки в коді. Основний блок - це послідовність коду, яка не містить інструкцій розгалуження, крім входу та виходу. Move визначає основні блоки шляхом обходу байт-коду, шукаючи всі інструкції розгалуження та циклічні інструкції.
Безпека посилань у Move
Move підтримує два типи посилань: незмінне посилання (&) та змінне посилання (&mut). Модуль безпеки посилань перевіряє байт-код інструкцій кожного базового блоку у функції, щоб підтвердити, що всі операції з посиланнями є законними.
Процес верифікації використовує структуру AbstractState для представлення стану, яка містить граф позик та локальні змінні. Під час верифікації буде порівнюватися стан до та після виконання, а також об'єднуватися оновлені стани блоку.
Аналіз вразливостей
Уразливість виникає у функції join_. Ця функція використовується для об'єднання станів до та після виконання, оновлюючи карту locals та граф запозичень. Проблема полягає в тому, що ітератор locals повертає тип u8, і коли сума довжини параметрів та довжини локальних змінних перевищує 256, відбувається переповнення.
Хоча у Move є процес перевірки кількості локальних змінних, він перевіряє лише кількість локальних змінних, а не довжину параметрів.
Використання вразливостей
Використовуючи цей переповненість, можна змінити стан базового блоку. У циклі код виконується, після чого стан змінюється. Коли його виконують знову, якщо індекс, який доступний інструкцією, не існує в новій карті локальних змінних, це призведе до паніки, що реалізує DoS-атаку.
Демонстрація PoC
Надано відтворюваний код PoC, який викликає переповнення цілих чисел, спричиняючи збій програми, шляхом налаштування певних параметрів і кількості локальних змінних.
Підсумок
Ця уразливість ще раз підтверджує важливість аудитів коду. Для мови Move рекомендується додати більше перевірок безпеки під час виконання, а не лише покладатися на перевірки на етапі верифікації. Ми будемо продовжувати глибше досліджувати проблеми безпеки мови Move та вносити свій внесок у її розвиток.