У механізмі безпеки посилань мови Move виявлено нову вразливість переповнення цілого числа
Нещодавно фахівці з безпеки виявили новий вразливість переповнення цілого числа під час глибокого аналізу Aptos MoveEVM. Ця вразливість існує в процесі перевірки безпеки посилань мови Move, зокрема на етапі reference_safety.
Перед виконанням байт-коду мова Move виконує перевірку одиниць коду, що складається з 4 етапів. Перевірка безпеки посилань є одним з важливих етапів, основна мета якого - забезпечити відсутність висячих посилань, безпечний доступ до змінних посилань, безпечний доступ до посилань на глобальне сховище тощо.
Основою перевірки безпеки є аналіз базових блоків у кожній функції. Базовий блок - це послідовність коду, яка не містить жодних інструкцій розгалуження, окрім вхідної та вихідної точок. Move визначає базові блоки, проходячи через байт-код і шукаючи всі інструкції розгалуження та циклічні інструкції.
Процес верифікації використовує структуру AbstractState для представлення стану, яка містить дві частини: borrow graph і locals. Під час верифікації виконується генерація коду блоку, що формує post state, а потім цей стан об'єднується з pre state для оновлення стану блоку та поширюється на наступні блоки. Цей процес подібний до концепції Sea of Nodes у V8 turbofan.
Вразливість виникає в функції join_. Коли сума довжини параметрів функції та довжини локальних змінних перевищує 256, використання типу u8 для ітерації локальних змінних може призвести до переповнення цілого числа. Хоча в Move є процес перевірки кількості локальних змінних, він перевіряє лише локальні змінні, не враховуючи довжину параметрів.
Використовуючи цю вразливість, зловмисник може створити циклічний кодовий блок, використовуючи переповнення для зміни стану блоку. Коли виконується знову, якщо індекс, до якого потрібно звернутися, не існує в новій карті локальних змінних, це призведе до DoS.
Ця уразливість ще раз підтверджує, що навіть такі мови, як Move, які приділяють велику увагу безпеці, можуть мати проблеми. Рекомендується розробникам мови Move додати більше перевірок під час виконання, а не лише покладатися на перевірки безпеки на етапі валідації. Також нагадуємо розробникам про важливість аудиту коду.
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
12 лайків
Нагородити
12
5
Поділіться
Прокоментувати
0/400
BoredWatcher
· 16год тому
Цей баг просто жахливий, як таке може бути таким примітивним?
Переглянути оригіналвідповісти на0
WalletInspector
· 16год тому
Га, використовувати Rust краще, ніж Move.
Переглянути оригіналвідповісти на0
MemecoinTrader
· 16год тому
лмао, ще один l1 отримав збитки... класичний витік альфа-цілочисельного переповнення
Механізм безпеки посилання мови Move виявив вразливість переповнення цілого числа, що впливає на AptosMoveEVM
У механізмі безпеки посилань мови Move виявлено нову вразливість переповнення цілого числа
Нещодавно фахівці з безпеки виявили новий вразливість переповнення цілого числа під час глибокого аналізу Aptos MoveEVM. Ця вразливість існує в процесі перевірки безпеки посилань мови Move, зокрема на етапі reference_safety.
Перед виконанням байт-коду мова Move виконує перевірку одиниць коду, що складається з 4 етапів. Перевірка безпеки посилань є одним з важливих етапів, основна мета якого - забезпечити відсутність висячих посилань, безпечний доступ до змінних посилань, безпечний доступ до посилань на глобальне сховище тощо.
Основою перевірки безпеки є аналіз базових блоків у кожній функції. Базовий блок - це послідовність коду, яка не містить жодних інструкцій розгалуження, окрім вхідної та вихідної точок. Move визначає базові блоки, проходячи через байт-код і шукаючи всі інструкції розгалуження та циклічні інструкції.
Процес верифікації використовує структуру AbstractState для представлення стану, яка містить дві частини: borrow graph і locals. Під час верифікації виконується генерація коду блоку, що формує post state, а потім цей стан об'єднується з pre state для оновлення стану блоку та поширюється на наступні блоки. Цей процес подібний до концепції Sea of Nodes у V8 turbofan.
Вразливість виникає в функції join_. Коли сума довжини параметрів функції та довжини локальних змінних перевищує 256, використання типу u8 для ітерації локальних змінних може призвести до переповнення цілого числа. Хоча в Move є процес перевірки кількості локальних змінних, він перевіряє лише локальні змінні, не враховуючи довжину параметрів.
Використовуючи цю вразливість, зловмисник може створити циклічний кодовий блок, використовуючи переповнення для зміни стану блоку. Коли виконується знову, якщо індекс, до якого потрібно звернутися, не існує в новій карті локальних змінних, це призведе до DoS.
Ця уразливість ще раз підтверджує, що навіть такі мови, як Move, які приділяють велику увагу безпеці, можуть мати проблеми. Рекомендується розробникам мови Move додати більше перевірок під час виконання, а не лише покладатися на перевірки безпеки на етапі валідації. Також нагадуємо розробникам про важливість аудиту коду.