Аналіз вразливості переповнення цілого числа в безпечній перевірці посилань Move
Нещодавно дослідники під час глибокого аналізу Aptos Moveevm виявили нову вразливість переповнення цілого числа. Ця вразливість існує в процесі перевірки безпеки посилань мови Move, зокрема стосується кроку reference_safety. У цій статті ми глибоко розглянемо цю вразливість і пояснимо процес її активації та потенційні наслідки.
Процес валідації мови Move
Мова Move перед виконанням байт-коду проходить верифікацію кодових одиниць, цей процес складається з 4 етапів. Виявлена уразливість відбулася на етапі reference_safety. Цей етап головним чином використовується для перевірки безпеки посилань, включаючи перевірку на наявність висячих посилань, безпечність доступу до змінних посилань, безпечність доступу до глобальних посилань тощо.
Процес перевірки спочатку визначить базовий блок. У мові Move базовий блок визначається шляхом обходу байт-коду, пошуку всіх інструкцій гілкування та послідовностей інструкцій циклу. Кожен базовий блок є послідовністю коду, що не містить інструкцій гілкування, окрім входу та виходу.
Механізм безпечної перевірки посилань
Мова Move підтримує два типи: незмінні посилання (&) та змінні посилання (&mut). Модуль перевірки безпеки посилань сканує байт-код інструкцій у кожному базовому блоці функцій, визначаючи, чи є всі операції з посиланнями законними.
Процес верифікації використовує структуру AbstractState для представлення стану, яка містить два ключові компоненти: borrow graph та locals. Під час верифікації порівнюються зміни стану до та після виконання базового блоку, а результати поширюються на наступні блоки.
Деталі вразливості
Вразливість існує у функції join_. Ця функція використовується для об'єднання станів до і після виконання основних блоків. Проблема полягає у методі iter_locals(), який повертає ітератор типу u8. Коли сума довжини параметрів функції та довжини локальних змінних перевищує 256, це викликає переповнення цілого числа.
Хоча мова Move має процес перевірки кількості локальних змінних, вона перевіряє лише кількість локальних змінних, не враховуючи довжину параметрів. Це може бути недоглядом розробників.
Використання вразливостей та їх вплив
Використовуючи цей вразливість переповнення цілого числа, зловмисник може створити спеціальні циклічні кодові блоки, які змінюють стан блоку. Коли базовий блок виконується знову, якщо індекс, до якого звертається команда, не існує в новій карті локальних змінних, це призведе до відмови в обслуговуванні (DoS).
Конкретно, в модулі reference safety, операційні коди MoveLoc/CopyLoc/FreeRef можуть спричинити паніку через доступ до неіснуючого LocalIndex, що призведе до збоїв у всьому вузлі.
Підсумок та рекомендації
Ця вразливість ще раз доводить, що навіть ретельно спроектовані мови можуть мати проблеми з безпекою. Щодо мови Move, ми рекомендуємо:
Посилити аудит коду, щоб уникнути подібних недоглядів.
Додати більше перевірок у час виконання Move, не покладаючись лише на перевірки безпеки на етапі валідації.
На етапі виконання додати заходи безпеки для запобігання серйознішим проблемам у разі обходу верифікації.
Як піонери досліджень безпеки мови Move, ми продовжимо глибоко вивчати відповідні проблеми безпеки, щоб сприяти здоровому розвитку екосистеми Move.
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
21 лайків
Нагородити
21
9
Поділіться
Прокоментувати
0/400
LiquidationWatcher
· 07-07 17:46
боже, ще одна експлуатація defi... викликає у мене великі спогади 2022 року
Переглянути оригіналвідповісти на0
BearMarketSunriser
· 07-07 02:16
move приречений а,炒a ще гірше ніж炒b
Переглянути оригіналвідповісти на0
SundayDegen
· 07-06 08:36
Ех, цей баг справді трохи примітивний.
Переглянути оригіналвідповісти на0
MoonRocketman
· 07-05 04:47
Висота перехоплення Move знизилася до 256, будьте обережні, ризик падіння ракети.
Переглянути оригіналвідповісти на0
Web3ProductManager
· 07-05 04:47
дивлячись на дані конверсійної воронки, цей переповнювальний баг = велика фрикція ux, чесно кажучи
Аналіз вразливості переповнення цілого числа в перевірці безпеки мови Move
Аналіз вразливості переповнення цілого числа в безпечній перевірці посилань Move
Нещодавно дослідники під час глибокого аналізу Aptos Moveevm виявили нову вразливість переповнення цілого числа. Ця вразливість існує в процесі перевірки безпеки посилань мови Move, зокрема стосується кроку reference_safety. У цій статті ми глибоко розглянемо цю вразливість і пояснимо процес її активації та потенційні наслідки.
Процес валідації мови Move
Мова Move перед виконанням байт-коду проходить верифікацію кодових одиниць, цей процес складається з 4 етапів. Виявлена уразливість відбулася на етапі reference_safety. Цей етап головним чином використовується для перевірки безпеки посилань, включаючи перевірку на наявність висячих посилань, безпечність доступу до змінних посилань, безпечність доступу до глобальних посилань тощо.
Процес перевірки спочатку визначить базовий блок. У мові Move базовий блок визначається шляхом обходу байт-коду, пошуку всіх інструкцій гілкування та послідовностей інструкцій циклу. Кожен базовий блок є послідовністю коду, що не містить інструкцій гілкування, окрім входу та виходу.
Механізм безпечної перевірки посилань
Мова Move підтримує два типи: незмінні посилання (&) та змінні посилання (&mut). Модуль перевірки безпеки посилань сканує байт-код інструкцій у кожному базовому блоці функцій, визначаючи, чи є всі операції з посиланнями законними.
Процес верифікації використовує структуру AbstractState для представлення стану, яка містить два ключові компоненти: borrow graph та locals. Під час верифікації порівнюються зміни стану до та після виконання базового блоку, а результати поширюються на наступні блоки.
Деталі вразливості
Вразливість існує у функції join_. Ця функція використовується для об'єднання станів до і після виконання основних блоків. Проблема полягає у методі iter_locals(), який повертає ітератор типу u8. Коли сума довжини параметрів функції та довжини локальних змінних перевищує 256, це викликає переповнення цілого числа.
Хоча мова Move має процес перевірки кількості локальних змінних, вона перевіряє лише кількість локальних змінних, не враховуючи довжину параметрів. Це може бути недоглядом розробників.
Використання вразливостей та їх вплив
Використовуючи цей вразливість переповнення цілого числа, зловмисник може створити спеціальні циклічні кодові блоки, які змінюють стан блоку. Коли базовий блок виконується знову, якщо індекс, до якого звертається команда, не існує в новій карті локальних змінних, це призведе до відмови в обслуговуванні (DoS).
Конкретно, в модулі reference safety, операційні коди MoveLoc/CopyLoc/FreeRef можуть спричинити паніку через доступ до неіснуючого LocalIndex, що призведе до збоїв у всьому вузлі.
Підсумок та рекомендації
Ця вразливість ще раз доводить, що навіть ретельно спроектовані мови можуть мати проблеми з безпекою. Щодо мови Move, ми рекомендуємо:
Як піонери досліджень безпеки мови Move, ми продовжимо глибоко вивчати відповідні проблеми безпеки, щоб сприяти здоровому розвитку екосистеми Move.