Виявлення нової уразливості переповнення цілого числа в модулі безпеки Move мови
Нещодавно дослідники в процесі глибокого аналізу мови Move виявили новий вразливість переповнення цілого числа. Ця вразливість існує в модулі безпеки посилань і може призвести до серйозної атаки відмови в обслуговуванні. У цій статті буде детально описано процес виявлення цієї вразливості та її технічні деталі.
Механізм безпеки посилань Move мови
Мова Move запозичила ідеї з Rust і підтримує два типи посилань: незмінне посилання (&) та змінне посилання (&mut). Модуль безпеки посилань перевіряє законність всіх операцій з посиланнями, скануючи базові блоки та байт-код інструкцій у функціях.
Процес перевірки переважно включає наступні етапи:
Аналізуйте кожен основний блок
Виконати код основного блоку для генерації пост-стану
Об'єднання pre state та post state
Оновіть стан блоку та розповсюдьте його на наступні блоки
Серед них state містить два ключові компоненти: locals і borrow graph, які забезпечують безпеку посилань у функції.
Деталі вразливості
Вразливість виникає в функції join_, що посилається на модуль безпеки. Коли сума довжини параметрів функції та довжини локальних змінних перевищує 256, використання типу u8 для ітерації locals призводить до переповнення цілого числа.
Конкретно кажучи:
iter_locals() повертає ітератор типу u8
Коли довжина параметра + довжина локальної змінної перевищує 256, відбудеться переповнення
Розробники, здається, усвідомлюють необхідність перевірки цього, але фактичний код перевіряє лише кількість локальних змінних.
Використання вразливостей
Використовуючи цю уразливість, можна створити циклічний кодовий блок:
Перший запуск призводить до переповнення, змінює карту locals
Під час другого виконання доступ до неіснуючого індексу locals викликав паніку
Це призведе до збоїв у вузлах, що призведе до атаки відмови в обслуговуванні.
Відтворення вразливості
Дослідники надали PoC для відтворення цього вразливості:
Встановіть parameters та locals обидва на SignatureIndex(0), щоб num_locals дорівнював 264.
Після першого виконання довжина нового локального мапи змінилася на 8
При другому виконанні, copyloc(57) доступ до неіснуючого offset призводить до паніки
Підсумок та рекомендації
Цей вразливість пояснює:
Немає абсолютно безпечного коду, статична перевірка може бути обійдена
Аудит коду дуже важливий, він може виявити недогляди розробників.
Мова 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.
14 лайків
Нагородити
14
7
Поділіться
Прокоментувати
0/400
SmartContractWorker
· 11год тому
Знову вийшло з каструлі, довелося повісити на ремонт.
Переглянути оригіналвідповісти на0
staking_gramps
· 07-06 05:24
Цей баг виглядає досить недосвідчено.
Переглянути оригіналвідповісти на0
ChainMaskedRider
· 07-06 05:22
Робота з кодом занадто неакуратна, чи не так?
Переглянути оригіналвідповісти на0
MissedTheBoat
· 07-06 05:20
Знову з'явився пролом, Move теж не дуже.
Переглянути оригіналвідповісти на0
GateUser-c799715c
· 07-06 05:19
Хто написав код? Чому він такий поганий?
Переглянути оригіналвідповісти на0
YieldChaser
· 07-06 05:17
знову виникли проблеми
Переглянути оригіналвідповісти на0
BridgeJumper
· 07-06 05:09
Розробка не відповідає стандартам, дві сльози під час виправлення помилок.
Модуль безпеки, посилений Move, виявив вразливість цілочисельного переповнення, що може призвести до атаки на відмову в обслуговуванні.
Виявлення нової уразливості переповнення цілого числа в модулі безпеки Move мови
Нещодавно дослідники в процесі глибокого аналізу мови Move виявили новий вразливість переповнення цілого числа. Ця вразливість існує в модулі безпеки посилань і може призвести до серйозної атаки відмови в обслуговуванні. У цій статті буде детально описано процес виявлення цієї вразливості та її технічні деталі.
Механізм безпеки посилань Move мови
Мова Move запозичила ідеї з Rust і підтримує два типи посилань: незмінне посилання (&) та змінне посилання (&mut). Модуль безпеки посилань перевіряє законність всіх операцій з посиланнями, скануючи базові блоки та байт-код інструкцій у функціях.
Процес перевірки переважно включає наступні етапи:
Серед них state містить два ключові компоненти: locals і borrow graph, які забезпечують безпеку посилань у функції.
Деталі вразливості
Вразливість виникає в функції join_, що посилається на модуль безпеки. Коли сума довжини параметрів функції та довжини локальних змінних перевищує 256, використання типу u8 для ітерації locals призводить до переповнення цілого числа.
Конкретно кажучи:
Використання вразливостей
Використовуючи цю уразливість, можна створити циклічний кодовий блок:
Це призведе до збоїв у вузлах, що призведе до атаки відмови в обслуговуванні.
Відтворення вразливості
Дослідники надали PoC для відтворення цього вразливості:
Підсумок та рекомендації
Цей вразливість пояснює:
Дослідники закликають дизайнерів мови Move посилити механізми безпеки під час виконання, щоб запобігти використанню подібних вразливостей, що може призвести до серйозніших проблем.