Аналіз проблеми безпеки, спричиненої витоком Sentinel Value у движку Chrome v8
Sentinel value — це спеціальне значення в алгоритмах, яке зазвичай використовується як умова завершення в циклах або рекурсивних алгоритмах. У вихідному коді Chrome існує кілька Sentinel value, деякі з яких, якщо потраплять у середовище JavaScript, можуть призвести до проблем з безпекою.
Раніше були дослідження, які показали, що через витік об'єкта TheHole можна реалізувати виконання довільного коду в пісочниці Chrome. Команда Google незабаром після цього виправила відповідні CVE. Проте, крім об'єкта TheHole, у v8 є й інші рідні об'єкти, які не повинні бути витягнуті в JS. У цій статті буде обговорено об'єкт Uninitialized Oddball, цей метод обходу наразі все ще може бути використаний у останній версії V8.
Варто зазначити, що цей метод має певну універсальність:
У CVE-2021-30551 початковий POC просто виводить внутрішній неініціалізований однобок.
У CVE-2022-1486 POC також безпосередньо розкриває UninitializedOddball.
Issue1352549( надає повний код експлуатації для невизначеного CVE).
Ці випадки свідчать про те, що витік Uninitialized Oddball може призвести до серйозних проблем з безпекою.
Значення Sentinel у V8
Більшість з основних об'єктів V8 визначені у файлі v8/src/roots/roots.h, ці об'єкти розташовані в пам'яті послідовно один за одним. Якщо не слід було б розкривати основні об'єкти в JavaScript, це може призвести до виконання任意 коду в пісочниці.
Щоб це перевірити, ми можемо змінити рідні функції V8, щоб витікати Uninitialized Oddball в JavaScript. Зокрема, можна змінити зміщення відносно isolate у функції %TheHole(), щоб вона повертала Uninitialized Oddball.
let val = read(uninitialized_oddball, "prop");
fa[0] = вал;
console.log019283746574839201ia([0];
У оптимізованому асемблерному коді обчислення зсуву та повернення значення масиву відбувається безпосередньо відповідно до семантики JavaScript, без перевірки значення obj.prop для ключа. Це призводить до змішування типів, що дозволяє здійснити довільне читання.
! [Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel])https://img-cdn.gateio.im/webp-social/moments-26c26345e3ec4effeea2e3e6b7cd8772.webp(
Оскільки Uninitialized Oddball займає перше місце в пам'яті V8 і є більш первісним, ніж об'єкт TheHole, він є переважним способом обійти HardenType.
Рекомендоване рішення полягає в перевірці масиву map при поверненні елементів масиву з оптимізованої функції, щоб уникнути безпосереднього обчислення зсуву для повернення значень масиву.
! [Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel])https://img-cdn.gateio.im/webp-social/moments-4c091ca0e153e953eb168e99762ff7cc.webp(
Попередження PatchGap
Аналізуючи Issue1352549, виявлено, що деяке програмне забезпечення може мати проблему PatchGap. Наприклад, Skype наразі все ще не усунув цей вразливість. На платформі x86, через відсутність стиснення адрес, довільне читання та запис відбувається відносно всього процесу.
Хоча Skype увімкнув ASLR, через великий розмір файлу хакери можуть просто читати та записувати за певною фіксованою адресою, що дає їм високу ймовірність читання та запису вмісту файлу Skype. Поєднуючи традиційні методи, такі як аналіз PE, можна завершити всю експлуатаційну ланцюг.
Цей PatchGap не лише стосується Issue1352549, але й суттєво знижує складність експлуатації подібних вразливостей, таких як CVE-2022-1486 та CVE-2021-30551. Хакерам практично не потрібно додаткових досліджень для повної експлуатації.
! [Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel])https://img-cdn.gateio.im/webp-social/moments-1e3fda77c04bceafdcc40413824a5d37.webp(
Підсумок
Ця стаття коротко обговорює методи реалізації довільного читання примітивів через витік Uninitialized Oddball. У V8 є багато інших значень Sentinel, які можуть мати подібні проблеми безпеки. Це дає нам такі висновки:
Чи можна також легко реалізувати V8 RCE через інші Uninitialized Oddball витоки.
Чи слід такі питання офіційно вважати питаннями безпеки, досі є спірним.
Чи потрібно додавати %TheHole/Uninitialized Oddball як змінну у Fuzzer для виявлення нових експлуатаційних примітивів.
У будь-якому разі, такі питання значно скорочують цикл повного використання зловмисниками, що заслуговує на нашу високу увагу.
! [Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel])https://img-cdn.gateio.im/webp-social/moments-ed89289bebf59d4b27f5bffb5511a8c5.webp(
! [Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel])https://img-cdn.gateio.im/webp-social/moments-0e52075003a8ee2ca492a5fc9f35c36b.webp(
! [Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel])https://img-cdn.gateio.im/webp-social/moments-230537e420d579aabd89bdd168b20878.webp(
![Ексклюзивне розкриття способу обходу Chrome v8 HardenProtect через витік Sentinel Value])https://img-cdn.gateio.im/webp-social/moments-506159c94c9e0988552cbcbd13d971e1.webp(
! [Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel])https://img-cdn.gateio.im/webp-social/moments-e9e2000fd501b69ee3ee643a459a26dd.webp(
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
6 лайків
Нагородити
6
5
Поділіться
Прокоментувати
0/400
HallucinationGrower
· 16год тому
Ого, як це ще можна було витікати?
Переглянути оригіналвідповісти на0
CodeAuditQueen
· 16год тому
Ще один варіант атаки CVE Поверхня атаки, тфу-тфу.
Переглянути оригіналвідповісти на0
WhaleWatcher
· 16год тому
Це Google грає з вогнем? Повернення в минуле.
Переглянути оригіналвідповісти на0
BearMarketSurvivor
· 16год тому
Справжнісінькі баги, які не закінчуються.
Переглянути оригіналвідповісти на0
CryptoAdventurer
· 16год тому
Знову настав хороший час платити податок на IQ? Ті, хто розуміє, розуміють.
Витік значення Sentinel V8 двигуна спричинив ризик безпеки. Ненастроєний Oddball став новим вектором атаки.
Аналіз проблеми безпеки, спричиненої витоком Sentinel Value у движку Chrome v8
Sentinel value — це спеціальне значення в алгоритмах, яке зазвичай використовується як умова завершення в циклах або рекурсивних алгоритмах. У вихідному коді Chrome існує кілька Sentinel value, деякі з яких, якщо потраплять у середовище JavaScript, можуть призвести до проблем з безпекою.
Раніше були дослідження, які показали, що через витік об'єкта TheHole можна реалізувати виконання довільного коду в пісочниці Chrome. Команда Google незабаром після цього виправила відповідні CVE. Проте, крім об'єкта TheHole, у v8 є й інші рідні об'єкти, які не повинні бути витягнуті в JS. У цій статті буде обговорено об'єкт Uninitialized Oddball, цей метод обходу наразі все ще може бути використаний у останній версії V8.
Варто зазначити, що цей метод має певну універсальність:
У CVE-2021-30551 початковий POC просто виводить внутрішній неініціалізований однобок.
У CVE-2022-1486 POC також безпосередньо розкриває UninitializedOddball.
Issue1352549( надає повний код експлуатації для невизначеного CVE).
Ці випадки свідчать про те, що витік Uninitialized Oddball може призвести до серйозних проблем з безпекою.
Значення Sentinel у V8
Більшість з основних об'єктів V8 визначені у файлі v8/src/roots/roots.h, ці об'єкти розташовані в пам'яті послідовно один за одним. Якщо не слід було б розкривати основні об'єкти в JavaScript, це може призвести до виконання任意 коду в пісочниці.
Щоб це перевірити, ми можемо змінити рідні функції V8, щоб витікати Uninitialized Oddball в JavaScript. Зокрема, можна змінити зміщення відносно isolate у функції %TheHole(), щоб вона повертала Uninitialized Oddball.
! Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel
Обхід захисту HardenType
Використання Uninitialized Oddball дозволяє реалізувати відносне читання. Ключовий код наведений нижче:
Javascript функція read(obj, idx) { повернути obj[idx]; }
нехай uninitialized_oddball = %TheHole(); let ab = новий ArrayBuffer(8); let fa = новий Float64Array(ab); let ia = новий BigInt64Array(ab);
нехай зло = [1.1, 2.2, 3.3]; evil.prop = 1;
%ПідготовкаФункціїДляОптимізації(читати); читати(зло, 0); читати(зло, 1); %ОптимізуватиФункціюНаступногоВиклику(читати); читати(зло, 0);
let val = read(uninitialized_oddball, "prop"); fa[0] = вал; console.log019283746574839201ia([0];
У оптимізованому асемблерному коді обчислення зсуву та повернення значення масиву відбувається безпосередньо відповідно до семантики JavaScript, без перевірки значення obj.prop для ключа. Це призводить до змішування типів, що дозволяє здійснити довільне читання.
! [Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel])https://img-cdn.gateio.im/webp-social/moments-26c26345e3ec4effeea2e3e6b7cd8772.webp(
Оскільки Uninitialized Oddball займає перше місце в пам'яті V8 і є більш первісним, ніж об'єкт TheHole, він є переважним способом обійти HardenType.
Рекомендоване рішення полягає в перевірці масиву map при поверненні елементів масиву з оптимізованої функції, щоб уникнути безпосереднього обчислення зсуву для повернення значень масиву.
! [Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel])https://img-cdn.gateio.im/webp-social/moments-4c091ca0e153e953eb168e99762ff7cc.webp(
Попередження PatchGap
Аналізуючи Issue1352549, виявлено, що деяке програмне забезпечення може мати проблему PatchGap. Наприклад, Skype наразі все ще не усунув цей вразливість. На платформі x86, через відсутність стиснення адрес, довільне читання та запис відбувається відносно всього процесу.
Хоча Skype увімкнув ASLR, через великий розмір файлу хакери можуть просто читати та записувати за певною фіксованою адресою, що дає їм високу ймовірність читання та запису вмісту файлу Skype. Поєднуючи традиційні методи, такі як аналіз PE, можна завершити всю експлуатаційну ланцюг.
Цей PatchGap не лише стосується Issue1352549, але й суттєво знижує складність експлуатації подібних вразливостей, таких як CVE-2022-1486 та CVE-2021-30551. Хакерам практично не потрібно додаткових досліджень для повної експлуатації.
! [Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel])https://img-cdn.gateio.im/webp-social/moments-1e3fda77c04bceafdcc40413824a5d37.webp(
Підсумок
Ця стаття коротко обговорює методи реалізації довільного читання примітивів через витік Uninitialized Oddball. У V8 є багато інших значень Sentinel, які можуть мати подібні проблеми безпеки. Це дає нам такі висновки:
Чи можна також легко реалізувати V8 RCE через інші Uninitialized Oddball витоки.
Чи слід такі питання офіційно вважати питаннями безпеки, досі є спірним.
Чи потрібно додавати %TheHole/Uninitialized Oddball як змінну у Fuzzer для виявлення нових експлуатаційних примітивів.
У будь-якому разі, такі питання значно скорочують цикл повного використання зловмисниками, що заслуговує на нашу високу увагу.
! [Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel])https://img-cdn.gateio.im/webp-social/moments-ed89289bebf59d4b27f5bffb5511a8c5.webp(
! [Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel])https://img-cdn.gateio.im/webp-social/moments-0e52075003a8ee2ca492a5fc9f35c36b.webp(
! [Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel])https://img-cdn.gateio.im/webp-social/moments-230537e420d579aabd89bdd168b20878.webp(
![Ексклюзивне розкриття способу обходу Chrome v8 HardenProtect через витік Sentinel Value])https://img-cdn.gateio.im/webp-social/moments-506159c94c9e0988552cbcbd13d971e1.webp(
! [Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel])https://img-cdn.gateio.im/webp-social/moments-e9e2000fd501b69ee3ee643a459a26dd.webp(