Значення Sentinel та обходження HardenProtect у Chrome v8
Sentinel value – це спеціальне значення в алгоритмах, яке часто використовується як умова завершення для циклів або рекурсивних алгоритмів. У вихідному коді Chrome широко використовуються такі спеціальні значення. Нещодавно проведені дослідження показали, що витік деяких об'єктів Sentinel value може дозволити виконання довільного коду в пісочниці Chrome.
У цій статті буде розглянуто метод обходу механізму HardenProtect Chrome v8 за допомогою неініціалізованого об'єкта Oddball. Цей метод вперше був запропонований учасником Project0 в Issue1352549 і наразі все ще доступний у найновішій версії V8, Google ще не виправив цю вразливість.
Слід зазначити, що цей метод має велику універсальність:
Issue1216437(CVE-2021-30551) вперше наводить poc для витоку internal uninitialized oddball.
Issue1314616(CVE-2022-1486) також безпосередньо розкриває об'єкт UninitializedOddball.
Issue1352549( немає CVE), що демонструє повний ланцюг експлуатації цього методу.
Ці випадки вказують на те, що цей метод обходу може вплинути на кілька версій програмного забезпечення. На сьогоднішній день програми, такі як Skype, все ще не виправили цю вразливість.
Значення Sentinel у V8
У вихідному коді V8 визначено велику кількість рідних об'єктів, включаючи кілька значень Sentinel. Ці об'єкти в пам'яті розташовані поряд один з одним. Як тільки рідні об'єкти, які не повинні бути розкриті, стають доступними для JavaScript, це може призвести до виконання довільного коду в пісочниці.
Щоб перевірити цей метод, ми можемо змінити функцію V8 %TheHole() так, щоб вона повертала об'єкт Uninitialized Oddball.
Наступний код демонструє, як використати витік об'єкта Uninitialized Oddball для реалізації довільного читання:
Javascript
function read(obj, idx) {
повернути obj[idx];
}
нехай uninitialized_oddball = %GetUninitialized();
let ab = новий ArrayBuffer(8);
нехай f64 = новий Float64Array(ab);
let u32 = новий Uint32Array(ab);
для (дозвольте i = 0; i < 0x10000; i++) {
read({prop: 1.1}, 0);
}
%ОптимізуватиФункціюНаступногоВиклику(читати);
let val = read({prop: uninitialized_oddball}, 0x1234);
f64[0] = вал;
console.log(u32[0].toString(6), u32[1].toString(16);
Оптимізований асемблерний код функції read показує, що функція лише перевіряє атрибут prop об'єкта obj, не перевіряючи значення obj.prop, і безпосередньо обчислює зміщення, що призводить до плутанини типів і дозволяє довільне читання.
! [Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel])https://img-cdn.gateio.im/webp-social/moments-26c26345e3ec4effeea2e3e6b7cd8772.webp(
Рекомендована схема виправлення: при поверненні елементів масиву з оптимізованої функції додайте перевірку масиву map, щоб уникнути прямого обчислення зсуву.
! [Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel])https://img-cdn.gateio.im/webp-social/moments-4c091ca0e153e953eb168e99762ff7cc.webp(
Попередження PatchGap
Цей обхідний метод впливає не лише на історичні вразливості, але й може вплинути на поточне програмне забезпечення. Наприклад, Skype досі не виправив цю проблему. На платформі x86, через відсутність стиснення адрес, можливості для довільного читання та запису є більшими.
Цей PatchGap не лише стосується Issue1352549, але й значно знижує складність використання подібних Issue1314616 та Issue1216437. Рекомендується виробникам провести повну перевірку відповідних вразливостей.
! [Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel])https://img-cdn.gateio.im/webp-social/moments-1e3fda77c04bceafdcc40413824a5d37.webp(
Підсумок
Ця стаття описує метод реалізації довільного читання V8 за допомогою Uninitialized Oddball. У V8 є й інші значення Sentinel, які можуть нести подібні ризики безпеці. Рекомендується подальше дослідження:
Чи можливо реалізувати V8 RCE через витік інших значень Sentinel
Додайте значення Sentinel як змінну до 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])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, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
Chrome v8 HardenProtect обхід: використання Sentinel Value для виконання довільного коду
Значення Sentinel та обходження HardenProtect у Chrome v8
Sentinel value – це спеціальне значення в алгоритмах, яке часто використовується як умова завершення для циклів або рекурсивних алгоритмів. У вихідному коді Chrome широко використовуються такі спеціальні значення. Нещодавно проведені дослідження показали, що витік деяких об'єктів Sentinel value може дозволити виконання довільного коду в пісочниці Chrome.
У цій статті буде розглянуто метод обходу механізму HardenProtect Chrome v8 за допомогою неініціалізованого об'єкта Oddball. Цей метод вперше був запропонований учасником Project0 в Issue1352549 і наразі все ще доступний у найновішій версії V8, Google ще не виправив цю вразливість.
Слід зазначити, що цей метод має велику універсальність:
Issue1216437(CVE-2021-30551) вперше наводить poc для витоку internal uninitialized oddball.
Issue1314616(CVE-2022-1486) також безпосередньо розкриває об'єкт UninitializedOddball.
Issue1352549( немає CVE), що демонструє повний ланцюг експлуатації цього методу.
Ці випадки вказують на те, що цей метод обходу може вплинути на кілька версій програмного забезпечення. На сьогоднішній день програми, такі як Skype, все ще не виправили цю вразливість.
Значення Sentinel у V8
У вихідному коді V8 визначено велику кількість рідних об'єктів, включаючи кілька значень Sentinel. Ці об'єкти в пам'яті розташовані поряд один з одним. Як тільки рідні об'єкти, які не повинні бути розкриті, стають доступними для JavaScript, це може призвести до виконання довільного коду в пісочниці.
Щоб перевірити цей метод, ми можемо змінити функцію V8 %TheHole() так, щоб вона повертала об'єкт Uninitialized Oddball.
! Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel
Обхід HardenType
Наступний код демонструє, як використати витік об'єкта Uninitialized Oddball для реалізації довільного читання:
Javascript function read(obj, idx) { повернути obj[idx]; }
нехай uninitialized_oddball = %GetUninitialized(); let ab = новий ArrayBuffer(8); нехай f64 = новий Float64Array(ab); let u32 = новий Uint32Array(ab);
для (дозвольте i = 0; i < 0x10000; i++) { read({prop: 1.1}, 0);
}
%ОптимізуватиФункціюНаступногоВиклику(читати);
let val = read({prop: uninitialized_oddball}, 0x1234); f64[0] = вал; console.log(u32[0].toString(6), u32[1].toString(16);
Оптимізований асемблерний код функції read показує, що функція лише перевіряє атрибут prop об'єкта obj, не перевіряючи значення obj.prop, і безпосередньо обчислює зміщення, що призводить до плутанини типів і дозволяє довільне читання.
! [Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel])https://img-cdn.gateio.im/webp-social/moments-26c26345e3ec4effeea2e3e6b7cd8772.webp(
Рекомендована схема виправлення: при поверненні елементів масиву з оптимізованої функції додайте перевірку масиву map, щоб уникнути прямого обчислення зсуву.
! [Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel])https://img-cdn.gateio.im/webp-social/moments-4c091ca0e153e953eb168e99762ff7cc.webp(
Попередження PatchGap
Цей обхідний метод впливає не лише на історичні вразливості, але й може вплинути на поточне програмне забезпечення. Наприклад, Skype досі не виправив цю проблему. На платформі x86, через відсутність стиснення адрес, можливості для довільного читання та запису є більшими.
Цей PatchGap не лише стосується Issue1352549, але й значно знижує складність використання подібних Issue1314616 та Issue1216437. Рекомендується виробникам провести повну перевірку відповідних вразливостей.
! [Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel])https://img-cdn.gateio.im/webp-social/moments-1e3fda77c04bceafdcc40413824a5d37.webp(
Підсумок
Ця стаття описує метод реалізації довільного читання V8 за допомогою Uninitialized Oddball. У V8 є й інші значення Sentinel, які можуть нести подібні ризики безпеці. Рекомендується подальше дослідження:
Незалежно від того, чи було це питання офіційно визнано як вразливість безпеки, воно може значно скоротити повний цикл використання хакерами. Сподіваюсь, що ця стаття приверне увагу відповідних сторін.
! [Ексклюзивне розкриття обходу 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])https://img-cdn.gateio.im/webp-social/moments-506159c94c9e0988552cbcbd13d971e1.webp(
! [Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel])https://img-cdn.gateio.im/webp-social/moments-e9e2000fd501b69ee3ee643a459a26dd.webp(