Аналіз Sentinel Value в движку Google Chrome V8 та його безпекові ризики
Sentinel value є особливим значенням в алгоритмах, яке часто використовується як умова завершення циклів або рекурсії. У вихідному коді Chrome міститься кілька Sentinel value, деякі з яких, якщо потраплять в середовище JavaScript, можуть призвести до проблем з безпекою. У цій статті буде розглянуто метод обходу механізму HardenProtect Chrome V8, використовуючи витік об'єкта Uninitialized Oddball.
Значення Sentinel у V8
Файл roots.h виходу V8 визначає велику кількість рідних об'єктів, які розташовані в пам'яті послідовно. Якщо ці рідні об'єкти, які не повинні бути відкритими для JavaScript, будуть витікати, це може призвести до втечі з пісочниці. Витік об'єкта TheHole в минулому є типовим прикладом.
Для перевірки проблеми у останній версії V8 можна змінити функцію %TheHole(), щоб вона повертала об'єкт Uninitialized Oddball:
Javascript
print(%DebugPrint(%TheHole()));
// Вивід:Невизначене значення
Оптимізована функція read після дизасемблювання показує, що вона не проводить сувору перевірку типу Value obj.prop, а безпосередньо обчислює зміщення відповідно до семантики JavaScript і повертає елементи масиву, що призводить до змішування типів та реалізації довільного читання.
Рекомендується виправлення, яке полягає в додаванні перевірки масиву map під час повернення елементів масиву з оптимізованої функції, щоб уникнути прямих обчислень зсуву поверненого значення.
Аналіз показав, що деяке програмне забезпечення, таке як Skype, може мати проблему PatchGap, яка ще не була виправлена. Хакери можуть використати цю уразливість для швидкого завершення повного експлуатаційного ланцюга.
Крім того, після публікації нового методу обходу, використання деяких історичних вразливостей (, таких як Issue1314616 та Issue1216437), значно спростилося. Рекомендується виробникам повторно оцінити пов'язані з вразливостями ризики безпеки.
У V8 є ще багато інших значень Sentinel, які варто дослідити. Рекомендується розглянути можливість додавання таких змінних, як %TheHole/Uninitialized_Oddball, до Fuzzer для виявлення нових експлуатаційних примітивів. Незалежно від того, чи буде ця проблема офіційно визнана проблемою безпеки, вона може значно скоротити повний цикл експлуатації для зловмисників.
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
Аналіз та використання вразливостей безпеки значення Sentinel у движку Chrome V8
Аналіз Sentinel Value в движку Google Chrome V8 та його безпекові ризики
Sentinel value є особливим значенням в алгоритмах, яке часто використовується як умова завершення циклів або рекурсії. У вихідному коді Chrome міститься кілька Sentinel value, деякі з яких, якщо потраплять в середовище JavaScript, можуть призвести до проблем з безпекою. У цій статті буде розглянуто метод обходу механізму HardenProtect Chrome V8, використовуючи витік об'єкта Uninitialized Oddball.
Значення Sentinel у V8
Файл roots.h виходу V8 визначає велику кількість рідних об'єктів, які розташовані в пам'яті послідовно. Якщо ці рідні об'єкти, які не повинні бути відкритими для JavaScript, будуть витікати, це може призвести до втечі з пісочниці. Витік об'єкта TheHole в минулому є типовим прикладом.
Для перевірки проблеми у останній версії V8 можна змінити функцію %TheHole(), щоб вона повертала об'єкт Uninitialized Oddball:
Javascript print(%DebugPrint(%TheHole())); // Вивід:Невизначене значення
! Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel
Обхід захисту HardenType
Використовуючи Uninitialized Oddball, можна побудувати наступний PoC код для реалізації довільного читання:
Javascript function read(obj, idx) { повернути obj[idx]; }
let uninitialized = %TheHole(); нехай arr = [1.1]; %ПідготуватиФункціюДляОптимізації(читати); read(arr, 0); read(arr, 0); %ОптимізуватиФункціюНаНаступномуВиклику(читати); read(arr, 0);
print(read(некоректно 0x1234n));
! Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel
Оптимізована функція read після дизасемблювання показує, що вона не проводить сувору перевірку типу Value obj.prop, а безпосередньо обчислює зміщення відповідно до семантики JavaScript і повертає елементи масиву, що призводить до змішування типів та реалізації довільного читання.
Рекомендується виправлення, яке полягає в додаванні перевірки масиву map під час повернення елементів масиву з оптимізованої функції, щоб уникнути прямих обчислень зсуву поверненого значення.
! Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel
Попередження про ризики PatchGap
Аналіз показав, що деяке програмне забезпечення, таке як Skype, може мати проблему PatchGap, яка ще не була виправлена. Хакери можуть використати цю уразливість для швидкого завершення повного експлуатаційного ланцюга.
! Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel
Крім того, після публікації нового методу обходу, використання деяких історичних вразливостей (, таких як Issue1314616 та Issue1216437), значно спростилося. Рекомендується виробникам повторно оцінити пов'язані з вразливостями ризики безпеки.
! Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel
! Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel
Підсумок
У V8 є ще багато інших значень Sentinel, які варто дослідити. Рекомендується розглянути можливість додавання таких змінних, як %TheHole/Uninitialized_Oddball, до Fuzzer для виявлення нових експлуатаційних примітивів. Незалежно від того, чи буде ця проблема офіційно визнана проблемою безпеки, вона може значно скоротити повний цикл експлуатації для зловмисників.
! Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel
! Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel