Дослідження використання Sentinel Value для обходу механізмів захисту Chrome V8
Sentinel value є спеціальним значенням в алгоритмах, яке зазвичай використовується як умова завершення циклів або рекурсивних алгоритмів. У вихідному коді Chrome існує кілька видів Sentinel value. Раніше були дослідження, які показали, що через витік об'єкта TheHole можна реалізувати виконання довільного коду в пісочниці для певних CVE. Команда Google швидко оновила відповідні CVE на GitHub приблизно через тиждень після публікації нашого пояснення щодо обходу цього пом'якшення.
Виходячи з вихідного коду Chrome, можна побачити виправлення, спрямоване на пом'якшення виконання довільного коду, пов'язаного з об'єктом TheHole. Але насправді в V8 є багато інших рідних об'єктів, які не повинні бути розкриті в JS. У цій статті буде обговорюватися об'єкт Uninitialized Oddball, який обійшов цей метод вперше в Issue1352549. Варто зазначити, що в даний час цей метод все ще можна використовувати в останній версії V8, і Google ще не виправив це.
Цей метод має високу універсальність:
Issue1216437(CVE-2021-30551), що вперше було представлено в POC, є витоком internal uninitialized oddball.
Issue1314616(CVE-2022-1486) POC також безпосередньо розкриває UninitializedOddball.
Вплив Issue1352549(NoCVE) не можна ігнорувати.
Це все яскраво демонструє необхідність повторно переглянути програмне забезпечення, яке може бути під впливом PatchGap.
Більшість рідних об'єктів V8 визначені у файлі v8/src/roots/roots.h, вони розташовані в пам'яті сусідньо. Як тільки ці рідні об'єкти, які не повинні бути вивчені, будуть вивчені в JavaScript, це може призвести до виконання будь-якого коду в пісочниці.
Щоб перевірити ефективність цього методу в останній версії V8, ми можемо змінити рідну функцію V8 %TheHole(), щоб вона повертала Uninitialized Oddball.
У Issue1352549 надано повний код, ми його витягли та спростили, після чого протестували в V8 11.0.0, і він все ще може реалізувати відносно довільне читання.
В оптимізованій асемблерній версії функції JavaScript read видно, що під час перевірки obj.prop не перевіряється значення, яке є ключем obj.prop, а безпосередньо обчислюється зсув для отримання значення з масиву відповідно до семантики JavaScript. Це призвело до змішування типів під час обчислення та реалізації довільного зчитування.
Коли передається uninitialized_oddball, обчислення починається з obj, в результаті чого в інструкції vmovsd xmm0,[r9+r11*8+0x7] виконується довільне читання, дані зберігаються в регістрі xmm0.
Оскільки uninitialized_oddball знаходиться на початку пам'яті V8 і є більш первісним, його легше підробити, тому він є переважним методом для обходу. Для довільного запису див. аналіз конструкцій Issue1352549.
Рекомендація щодо виправлення полягає в тому, щоб при поверненні елементів масиву з оптимізованої функції додати перевірку масиву map, щоб уникнути прямого обчислення зсуву для повернення значення масиву.
PatchGap попередження
Аналізуючи Issue1352549, ми перевірили програмне забезпечення, в якому може існувати PatchGap, і виявили, що Skype досі не виправив цю вразливість. Деякі можливості читання та запису на x86 трохи відрізняються, оскільки немає стиснення адрес, і вони безпосередньо відносяться до всього процесу.
Використовуючи Skype, хоча ASLR був увімкнений, але через великий розмір файлу, хакер може просто читати та записувати за певною фіксованою адресою, що може призвести до читання та запису вмісту файлу Skype. Поєднуючи традиційні підходи, такі як аналіз PE, не важко завершити всю ланцюг експлуатації вразливостей.
Цей PatchGap не лише стосується Issue1352549, а й публікація нового методу обходу значно знизила складність використання таких уразливостей, як Issue1314616 та Issue1216437. Хакери майже без витрат на дослідження можуть здійснити повне використання будь-якої попередньої уразливості uninitialized_oddball.
Цей документ коротко обговорює реалізацію довільного читання примітиву через витік uninitialized_Oddball. У V8 також є багато інших Sentinel значень, під час тестування також легко зустріти крахи, які не є int3. Оскільки Uninitialized_Oddball і TheHole можуть обійти захист V8, інші Sentinel значення також можуть мати подібні проблеми.
Це дає нам деякі натяки:
Чи можна також легко реалізувати RCE V8 через інші uninitialized_Oddball витоки?
Google швидко виправила обход TheHole, але проблема обхід ASLR за допомогою збору сміття залишається невирішеною тривалий час, що свідчить про те, що подібні питання все ще мають неясні межі щодо того, чи вважаються вони офіційними проблемами безпеки.
Якщо розглядати це як офіційну проблему безпеки, чи є необхідність у fuzzer враховувати додавання таких Sentinel значень, як %TheHole/uninitialized_Oddball у вигляді змінних, щоб виявити інші експлуатаційні примітиви.
Незалежно від того, чи вважаються ці проблеми формально проблемами безпеки, вони значно скорочують час, необхідний хакерам для повного використання.
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.
16 лайків
Нагородити
16
6
Поділіться
Прокоментувати
0/400
OptionWhisperer
· 3год тому
Ця уразливість серйозна, дрібниці можуть бути фатальними.
Дослідження вразливості Sentinel Value у V8-движку: обхід захисту для виконання довільного коду
Дослідження використання Sentinel Value для обходу механізмів захисту Chrome V8
Sentinel value є спеціальним значенням в алгоритмах, яке зазвичай використовується як умова завершення циклів або рекурсивних алгоритмів. У вихідному коді Chrome існує кілька видів Sentinel value. Раніше були дослідження, які показали, що через витік об'єкта TheHole можна реалізувати виконання довільного коду в пісочниці для певних CVE. Команда Google швидко оновила відповідні CVE на GitHub приблизно через тиждень після публікації нашого пояснення щодо обходу цього пом'якшення.
Виходячи з вихідного коду Chrome, можна побачити виправлення, спрямоване на пом'якшення виконання довільного коду, пов'язаного з об'єктом TheHole. Але насправді в V8 є багато інших рідних об'єктів, які не повинні бути розкриті в JS. У цій статті буде обговорюватися об'єкт Uninitialized Oddball, який обійшов цей метод вперше в Issue1352549. Варто зазначити, що в даний час цей метод все ще можна використовувати в останній версії V8, і Google ще не виправив це.
Цей метод має високу універсальність:
Issue1216437(CVE-2021-30551), що вперше було представлено в POC, є витоком internal uninitialized oddball.
Issue1314616(CVE-2022-1486) POC також безпосередньо розкриває UninitializedOddball.
Вплив Issue1352549(NoCVE) не можна ігнорувати.
Це все яскраво демонструє необхідність повторно переглянути програмне забезпечення, яке може бути під впливом PatchGap.
! Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel
Значення Sentinel у V8
Більшість рідних об'єктів V8 визначені у файлі v8/src/roots/roots.h, вони розташовані в пам'яті сусідньо. Як тільки ці рідні об'єкти, які не повинні бути вивчені, будуть вивчені в JavaScript, це може призвести до виконання будь-якого коду в пісочниці.
Щоб перевірити ефективність цього методу в останній версії V8, ми можемо змінити рідну функцію V8 %TheHole(), щоб вона повертала Uninitialized Oddball.
! Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel
Обхід HardenType
У Issue1352549 надано повний код, ми його витягли та спростили, після чого протестували в V8 11.0.0, і він все ще може реалізувати відносно довільне читання.
В оптимізованій асемблерній версії функції JavaScript read видно, що під час перевірки obj.prop не перевіряється значення, яке є ключем obj.prop, а безпосередньо обчислюється зсув для отримання значення з масиву відповідно до семантики JavaScript. Це призвело до змішування типів під час обчислення та реалізації довільного зчитування.
Коли передається uninitialized_oddball, обчислення починається з obj, в результаті чого в інструкції vmovsd xmm0,[r9+r11*8+0x7] виконується довільне читання, дані зберігаються в регістрі xmm0.
Оскільки uninitialized_oddball знаходиться на початку пам'яті V8 і є більш первісним, його легше підробити, тому він є переважним методом для обходу. Для довільного запису див. аналіз конструкцій Issue1352549.
! Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel
Рекомендація щодо виправлення полягає в тому, щоб при поверненні елементів масиву з оптимізованої функції додати перевірку масиву map, щоб уникнути прямого обчислення зсуву для повернення значення масиву.
PatchGap попередження
Аналізуючи Issue1352549, ми перевірили програмне забезпечення, в якому може існувати PatchGap, і виявили, що Skype досі не виправив цю вразливість. Деякі можливості читання та запису на x86 трохи відрізняються, оскільки немає стиснення адрес, і вони безпосередньо відносяться до всього процесу.
Використовуючи Skype, хоча ASLR був увімкнений, але через великий розмір файлу, хакер може просто читати та записувати за певною фіксованою адресою, що може призвести до читання та запису вмісту файлу Skype. Поєднуючи традиційні підходи, такі як аналіз PE, не важко завершити всю ланцюг експлуатації вразливостей.
! Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel
Цей PatchGap не лише стосується Issue1352549, а й публікація нового методу обходу значно знизила складність використання таких уразливостей, як Issue1314616 та Issue1216437. Хакери майже без витрат на дослідження можуть здійснити повне використання будь-якої попередньої уразливості uninitialized_oddball.
! Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel
Підсумок
Цей документ коротко обговорює реалізацію довільного читання примітиву через витік uninitialized_Oddball. У V8 також є багато інших Sentinel значень, під час тестування також легко зустріти крахи, які не є int3. Оскільки Uninitialized_Oddball і TheHole можуть обійти захист V8, інші Sentinel значення також можуть мати подібні проблеми.
Це дає нам деякі натяки:
Чи можна також легко реалізувати RCE V8 через інші uninitialized_Oddball витоки?
Google швидко виправила обход TheHole, але проблема обхід ASLR за допомогою збору сміття залишається невирішеною тривалий час, що свідчить про те, що подібні питання все ще мають неясні межі щодо того, чи вважаються вони офіційними проблемами безпеки.
Якщо розглядати це як офіційну проблему безпеки, чи є необхідність у fuzzer враховувати додавання таких Sentinel значень, як %TheHole/uninitialized_Oddball у вигляді змінних, щоб виявити інші експлуатаційні примітиви.
Незалежно від того, чи вважаються ці проблеми формально проблемами безпеки, вони значно скорочують час, необхідний хакерам для повного використання.
! Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel
! Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel
! Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel