Аналіз використання вразливості Sentinel Value у движку Chrome V8
Sentinel value є спеціальним значенням в алгоритмах, яке зазвичай використовується як умова завершення в циклах або рекурсивних алгоритмах. У вихідному коді Chrome існує велика кількість Sentinel value. Раніше були дослідження, які показали, що через витік об'єкта TheHole можна реалізувати виконання будь-якого коду в пісочниці Chrome. Команда Google згодом виправила відповідні уразливості.
Однак у V8 також існують інші рідні об'єкти, які не повинні бути витікати в JS. У цій статті обговорюється об'єкт Uninitialized Oddball, витік якого може призвести до методів обходу пісочниці, які наразі все ще доступні в останній версії V8.
Слід звернути увагу на те, що цей метод має певну універсальність:
CVE-2021-30551 початковий PoC просто виток внутрішнього неініціалізованого дивного.
У PoC CVE-2022-1486 також безпосередньо витікає UninitializedOddball.
Issue1352549 ( детально описано методи експлуатації у CVE).
Ці випадки свідчать про те, що варто звернути увагу на можливість атак з використанням витоку Uninitialized Oddball.
Значення Sentinel у V8
Більшість вбудованих об'єктів V8 визначені у файлі v8/src/roots/roots.h, вони розташовані в пам'яті послідовно один за одним. Як тільки ці вбудовані об'єкти, які не повинні бути розкритими, потрапляють у JavaScript, може бути реалізовано виконання будь-якого коду в пісочниці.
Щоб це перевірити, можна змінити значення, яке повертає рідна функція V8 %TheHole() на Uninitialized Oddball.
Аналізуючи оптимізований асемблерний код функції read, можна помітити, що він лише перевіряє, чи є атрибут prop об'єкта obj правильним, але не перевіряє значення obj.prop як ключа. Це призводить до змішування типів під час обчислень, що дозволяє здійснювати довільне читання.
Коли передається uninitialized_oddball, розрахунок починається з команди obj, і в кінці команди vmovsd xmm0,[r9+r11*8+0x7] завершується довільне читання, дані зберігаються в регістрі xmm0.
Рекомендований спосіб виправлення полягає в тому, щоб під час повернення елементів масиву з оптимізованої функції додати перевірку масиву map, щоб уникнути безпосереднього обчислення зсуву для повернення значень масиву.
Під час перевірки програмного забезпечення, яке може мати PatchGap, було виявлено, що Skype досі не виправив цю уразливість. У архітектурі x86, через відсутність стиснення адрес, довільне читання та запис здійснюється безпосередньо відносно всього процесу.
Хоча Skype увімкнув ASLR, але через великий розмір файлу, який безпосередньо розміщено в 4 ГБ пам'яті, зловмиснику достатньо лише читати і писати за певною фіксованою адресою, щоб з великою ймовірністю отримати доступ до вмісту файлу Skype. Поєднуючи традиційні методи, такі як аналіз PE, можна реалізувати всю ланцюг експлуатації вразливості.
Цей PatchGap не тільки стосується Issue1352549, але й значно знижує складність використання, подібну до Issue1314616 та Issue1216437. Хакери практично не потребують додаткових досліджень, щоб реалізувати повне використання будь-якого витоку uninitialized_oddball.
Підсумок
Ця стаття описує метод реалізації довільного читання примітиву через витік uninitialized_Oddball у значенні Sentinel. У V8 також існують інші значення Sentinel, які можуть призвести до подібних проблем. Це дає нам такі висновки:
Інші uninitialized_Oddball витоки також можуть легко реалізувати RCE V8.
Чи слід ці питання розглядати як офіційні питання безпеки, все ще існує суперечка.
У fuzzer можна розглянути можливість додавання таких значень-сентинелів, як %TheHole/uninitialized_Oddball, як змінних для виявлення інших експлуатаційних примітивів.
В будь-якому випадку, такого роду проблеми значно скоротять період, за який хакери зможуть повністю скористатися можливістю.
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
9 лайків
Нагородити
9
5
Репост
Поділіться
Прокоментувати
0/400
CoffeeNFTrader
· 07-22 08:13
Ще одна уразливість безпеки, всі в паніці
Переглянути оригіналвідповісти на0
Hash_Bandit
· 07-21 21:23
майнінг на js-движку тільки що став реальністю...максимальна складність експлуатації досягнута
Переглянути оригіналвідповісти на0
ConsensusDissenter
· 07-20 00:25
Ще одна кодова чорна діра з'явилася. Це дуже страшно.
Переглянути оригіналвідповісти на0
Blockblind
· 07-20 00:19
v8 також має таку велику вразливість? Сміюся до сліз
Переглянути оригіналвідповісти на0
BlockchainTalker
· 07-20 00:12
насправді здивований, що V8 все ще має проблеми з цим... п.с. де моя ізоляція виконання сім'я?
Аналіз вразливості Sentinel Value в двигуні Chrome V8: реалізація RCE без додаткових досліджень
Аналіз використання вразливості Sentinel Value у движку Chrome V8
Sentinel value є спеціальним значенням в алгоритмах, яке зазвичай використовується як умова завершення в циклах або рекурсивних алгоритмах. У вихідному коді Chrome існує велика кількість Sentinel value. Раніше були дослідження, які показали, що через витік об'єкта TheHole можна реалізувати виконання будь-якого коду в пісочниці Chrome. Команда Google згодом виправила відповідні уразливості.
Однак у V8 також існують інші рідні об'єкти, які не повинні бути витікати в JS. У цій статті обговорюється об'єкт Uninitialized Oddball, витік якого може призвести до методів обходу пісочниці, які наразі все ще доступні в останній версії V8.
Слід звернути увагу на те, що цей метод має певну універсальність:
CVE-2021-30551 початковий PoC просто виток внутрішнього неініціалізованого дивного.
У PoC CVE-2022-1486 також безпосередньо витікає UninitializedOddball.
Issue1352549 ( детально описано методи експлуатації у CVE).
Ці випадки свідчать про те, що варто звернути увагу на можливість атак з використанням витоку Uninitialized Oddball.
Значення Sentinel у V8
Більшість вбудованих об'єктів V8 визначені у файлі v8/src/roots/roots.h, вони розташовані в пам'яті послідовно один за одним. Як тільки ці вбудовані об'єкти, які не повинні бути розкритими, потрапляють у JavaScript, може бути реалізовано виконання будь-якого коду в пісочниці.
Щоб це перевірити, можна змінити значення, яке повертає рідна функція V8 %TheHole() на Uninitialized Oddball.
! Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel
Обхід захисту HardenType
У випуску 1352549 наведено повний код обходу. Спрощена основна логіка виглядає наступним чином:
Javascript функція read(obj, idx) { повернути obj[idx]; }
let uninitialized = %TheHole(); нехай arr = [1.1]; нехай res = read(uninitialized, 0x12345); %DebugPrint(res);
Цей код все ще може реалізувати відносно довільне читання в останній версії V8 11.0.0.
! Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel
Аналізуючи оптимізований асемблерний код функції read, можна помітити, що він лише перевіряє, чи є атрибут prop об'єкта obj правильним, але не перевіряє значення obj.prop як ключа. Це призводить до змішування типів під час обчислень, що дозволяє здійснювати довільне читання.
! Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel
Коли передається uninitialized_oddball, розрахунок починається з команди obj, і в кінці команди vmovsd xmm0,[r9+r11*8+0x7] завершується довільне читання, дані зберігаються в регістрі xmm0.
! Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel
Рекомендований спосіб виправлення полягає в тому, щоб під час повернення елементів масиву з оптимізованої функції додати перевірку масиву map, щоб уникнути безпосереднього обчислення зсуву для повернення значень масиву.
! Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel
PatchGap попередження
Під час перевірки програмного забезпечення, яке може мати PatchGap, було виявлено, що Skype досі не виправив цю уразливість. У архітектурі x86, через відсутність стиснення адрес, довільне читання та запис здійснюється безпосередньо відносно всього процесу.
Хоча Skype увімкнув ASLR, але через великий розмір файлу, який безпосередньо розміщено в 4 ГБ пам'яті, зловмиснику достатньо лише читати і писати за певною фіксованою адресою, щоб з великою ймовірністю отримати доступ до вмісту файлу Skype. Поєднуючи традиційні методи, такі як аналіз PE, можна реалізувати всю ланцюг експлуатації вразливості.
! Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel
Цей PatchGap не тільки стосується Issue1352549, але й значно знижує складність використання, подібну до Issue1314616 та Issue1216437. Хакери практично не потребують додаткових досліджень, щоб реалізувати повне використання будь-якого витоку uninitialized_oddball.
Підсумок
Ця стаття описує метод реалізації довільного читання примітиву через витік uninitialized_Oddball у значенні Sentinel. У V8 також існують інші значення Sentinel, які можуть призвести до подібних проблем. Це дає нам такі висновки:
Інші uninitialized_Oddball витоки також можуть легко реалізувати RCE V8.
Чи слід ці питання розглядати як офіційні питання безпеки, все ще існує суперечка.
У fuzzer можна розглянути можливість додавання таких значень-сентинелів, як %TheHole/uninitialized_Oddball, як змінних для виявлення інших експлуатаційних примітивів.
В будь-якому випадку, такого роду проблеми значно скоротять період, за який хакери зможуть повністю скористатися можливістю.
! Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel
! Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel