У модулі безпеки Move мови виявлено нову вразливість переповнення цілого числа
Нещодавно, під час поглибленого вивчення мови Move, було виявлено нову уразливість переповнення цілого числа. Ця уразливість існує в модулі перевірки безпеки посилань, а процес її активації є досить цікавим. У цій статті буде проведено глибокий аналіз цієї уразливості, а також представлені відповідні знання про мову Move.
Мова Move перед виконанням байт-коду перевіряє одиниці коду, і весь процес перевірки ділиться на 4 етапи. Виявлена уразливість виникла на етапі reference_safety.
Модуль перевірки безпеки посилань відповідає за перевірку наявності висячих посилань, чи є доступ до змінних посилань безпечним, чи є доступ до глобальних зберігань безпечним тощо. Процес перевірки починається з функції analyze_function і перевіряє кожен базовий блок.
У мові Move базовий блок означає послідовність коду без команд гілкування, за винятком входу та виходу. Система визначає базовий блок, проходячи байт-код і шукаючи всі команди гілкування та послідовності циклів.
Мова Move підтримує два типи посилань: незмінні посилання (&) та змінні посилання (&mut). Модуль безпеки посилань сканує байт-код інструкцій в кожному базовому блоці функції, щоб визначити, чи є всі операції з посиланнями легітимними. Процес верифікації використовує структуру AbstractState, яка містить два компоненти: borrow graph та locals, для забезпечення безпеки посилань у функції.
Під час процесу перевірки система виконує базовий блок коду, генеруючи пост-стан, а потім об'єднує попередній стан та пост-стан для оновлення стану блоку. Якщо стан змінюється і існує цикл, базовий блок буде виконуватись повторно, поки пост-стан не стане рівним попередньому стану або не виникне помилка.
Уразливість виникає в функції join_. Коли довжина параметра разом із довжиною локальних змінних перевищує 256, через використання типу u8 для ітерації локальних змінних може статися переповнення цілого числа. Хоча у мові Move є процес перевірки кількості локальних змінних, він перевіряє лише кількість локальних змінних, не включаючи довжину параметра.
Цей переповнення цілого числа може призвести до атаки відмови в обслуговуванні. Зловмисник може створити циклічний кодовий блок, використовуючи переповнення для зміни стану блоку. Коли функція execute_block виконується знову, якщо індекс, до якого потрібен доступ в інструкції, не існує в новій карті локальних змінних AbstractState, це призведе до збою системи.
Щоб продемонструвати цю вразливість, ми можемо створити базовий блок, що містить інструкцію безумовного переходу. Встановивши відповідні параметри та кількість локальних змінних, можна змусити довжину locals map переповнитися до 8. При другому виконанні спроба доступу до неіснуючого offset призведе до паніки.
Ця уразливість нагадує нам, що навіть найретельно спроектовані мови можуть мати проблеми з безпекою. Для мови Move рекомендується додати більше перевірок під час виконання, щоб запобігти неочікуваним ситуаціям. Наразі Move виконує основні перевірки безпеки на етапі верифікації, але якщо верифікацію обійти, це може призвести до більш серйозних проблем.
Як піонери у дослідженні безпеки мови Move, ми будемо продовжувати глибоке вивчення відповідних проблем безпеки, щоб сприяти здоровому розвитку екосистеми Move.
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
Виявлено новий вразливість переповнення цілого числа в модулі безпеки Move.
У модулі безпеки Move мови виявлено нову вразливість переповнення цілого числа
Нещодавно, під час поглибленого вивчення мови Move, було виявлено нову уразливість переповнення цілого числа. Ця уразливість існує в модулі перевірки безпеки посилань, а процес її активації є досить цікавим. У цій статті буде проведено глибокий аналіз цієї уразливості, а також представлені відповідні знання про мову Move.
Мова Move перед виконанням байт-коду перевіряє одиниці коду, і весь процес перевірки ділиться на 4 етапи. Виявлена уразливість виникла на етапі reference_safety.
Модуль перевірки безпеки посилань відповідає за перевірку наявності висячих посилань, чи є доступ до змінних посилань безпечним, чи є доступ до глобальних зберігань безпечним тощо. Процес перевірки починається з функції analyze_function і перевіряє кожен базовий блок.
У мові Move базовий блок означає послідовність коду без команд гілкування, за винятком входу та виходу. Система визначає базовий блок, проходячи байт-код і шукаючи всі команди гілкування та послідовності циклів.
Мова Move підтримує два типи посилань: незмінні посилання (&) та змінні посилання (&mut). Модуль безпеки посилань сканує байт-код інструкцій в кожному базовому блоці функції, щоб визначити, чи є всі операції з посиланнями легітимними. Процес верифікації використовує структуру AbstractState, яка містить два компоненти: borrow graph та locals, для забезпечення безпеки посилань у функції.
Під час процесу перевірки система виконує базовий блок коду, генеруючи пост-стан, а потім об'єднує попередній стан та пост-стан для оновлення стану блоку. Якщо стан змінюється і існує цикл, базовий блок буде виконуватись повторно, поки пост-стан не стане рівним попередньому стану або не виникне помилка.
Уразливість виникає в функції join_. Коли довжина параметра разом із довжиною локальних змінних перевищує 256, через використання типу u8 для ітерації локальних змінних може статися переповнення цілого числа. Хоча у мові Move є процес перевірки кількості локальних змінних, він перевіряє лише кількість локальних змінних, не включаючи довжину параметра.
Цей переповнення цілого числа може призвести до атаки відмови в обслуговуванні. Зловмисник може створити циклічний кодовий блок, використовуючи переповнення для зміни стану блоку. Коли функція execute_block виконується знову, якщо індекс, до якого потрібен доступ в інструкції, не існує в новій карті локальних змінних AbstractState, це призведе до збою системи.
Щоб продемонструвати цю вразливість, ми можемо створити базовий блок, що містить інструкцію безумовного переходу. Встановивши відповідні параметри та кількість локальних змінних, можна змусити довжину locals map переповнитися до 8. При другому виконанні спроба доступу до неіснуючого offset призведе до паніки.
Ця уразливість нагадує нам, що навіть найретельно спроектовані мови можуть мати проблеми з безпекою. Для мови Move рекомендується додати більше перевірок під час виконання, щоб запобігти неочікуваним ситуаціям. Наразі Move виконує основні перевірки безпеки на етапі верифікації, але якщо верифікацію обійти, це може призвести до більш серйозних проблем.
Як піонери у дослідженні безпеки мови Move, ми будемо продовжувати глибоке вивчення відповідних проблем безпеки, щоб сприяти здоровому розвитку екосистеми Move.