Обхід Chrome V8 HardenProtect через витік значення Sentinel
Sentinel value є спеціальним значенням у алгоритмах, яке часто використовується як умова завершення для циклів або рекурсивних алгоритмів. У вихідному коді Chrome існує кілька Sentinel value. Раніше були дослідження, які вказували, як використовувати об'єкт TheHole для витоку і реалізації виконання будь-якого коду в пісочниці. У цій статті буде обговорено інший рідний об'єкт V8 - Uninitialized Oddball, метод, який досі може бути використаний у останній версії V8.
Цей метод є універсальним:
У Issue1216437 вперше було представлено концепцію витоку internal uninitialized oddball.
У Issue1314616 також безпосередньо було розкрито UninitializedOddball, хоча на той час метод використання ще не був ясний.
Issue1352549 варто звернути увагу на його потенційний вплив.
В даний час деяке програмне забезпечення все ще не виправило цю уразливість.
Більшість вбудованих об'єктів у V8 визначено у файлі v8/src/roots/roots.h, ці об'єкти розташовані в пам'яті сусідньо. Як тільки вбудовані об'єкти, які не повинні бути витоками, будуть доступні для JavaScript, це може призвести до виконання довільного коду в пісочниці.
Щоб перевірити цей метод, можна змінити рідні функції V8, щоб витік Uninitialized Oddball в JavaScript. Конкретно, можна змінити відступ %TheHole() функції щодо ізоляції.
Основний код методу обходу виглядає так:
Javascript
функція read(obj, prop) {
повернути obj[prop];
}
Коли передається uninitialized_oddball, обчислення починається з obj на 0x558b20004086, а в кінцевому підсумку завершується довільним читанням в інструкції vmovsd, дані зберігаються в регістрі xmm0.
Рекомендований спосіб виправлення полягає в тому, щоб при поверненні елементів масиву з оптимізованої функції додати перевірку масиву map, щоб уникнути безпосереднього обчислення зсуву для повернення значення масиву.
Варто зазначити, що деяке програмне забезпечення все ще не виправило цю вразливість. Спосіб використання на платформі x86 дещо відрізняється, оскільки немає стиснення адрес, довільне читання та запис є відносно всього процесу. Навіть якщо ASLR увімкнено, завдяки великому розміру файлу, все ще існує велика ймовірність читання та запису цільового вмісту.
Цей новий метод обходу значно знизив складність використання подібних уразливостей. Рекомендується переглянути всі вразливості, пов'язані з витоками uninitialized_oddball.
У V8 також є інші значення Sentinel, які також можуть призвести до подібних проблем. Це дає нам такі висновки:
Чи також легко реалізувати V8 RCE через інші uninitialized_Oddball витоки.
Чи слід такі питання офіційно вважати питаннями безпеки, все ще залишається спірним.
Чи слід додавати Sentinel value як змінну до Fuzzer для виявлення нових експлоіт-примітивів.
У будь-якому випадку, такого роду проблеми значно скорочують період, протягом якого хакери можуть повністю використати вразливість.
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.
10 лайків
Нагородити
10
5
Поділіться
Прокоментувати
0/400
ZKProofEnthusiast
· 07-09 11:53
Відомо, що V8 керує світом
Переглянути оригіналвідповісти на0
SleepyValidator
· 07-06 23:01
Chrome дійсно не підводить, стабільний
Переглянути оригіналвідповісти на0
FlashLoanLord
· 07-06 17:06
Такий великий漏洞 ще не виправлено?
Переглянути оригіналвідповісти на0
ForkItAll
· 07-06 17:00
вразливість v8 справді ybb.
Переглянути оригіналвідповісти на0
FudVaccinator
· 07-06 16:51
Ще одна значна уразливість. Завжди користуюсь Firefox, дуже подобається.
Chrome V8 двигун знову виявив уразливість безпеки: витік Sentinel Value може обійти пісочницю
Обхід Chrome V8 HardenProtect через витік значення Sentinel
Sentinel value є спеціальним значенням у алгоритмах, яке часто використовується як умова завершення для циклів або рекурсивних алгоритмів. У вихідному коді Chrome існує кілька Sentinel value. Раніше були дослідження, які вказували, як використовувати об'єкт TheHole для витоку і реалізації виконання будь-якого коду в пісочниці. У цій статті буде обговорено інший рідний об'єкт V8 - Uninitialized Oddball, метод, який досі може бути використаний у останній версії V8.
Цей метод є універсальним:
У Issue1216437 вперше було представлено концепцію витоку internal uninitialized oddball.
У Issue1314616 також безпосередньо було розкрито UninitializedOddball, хоча на той час метод використання ще не був ясний.
Issue1352549 варто звернути увагу на його потенційний вплив.
В даний час деяке програмне забезпечення все ще не виправило цю уразливість.
Більшість вбудованих об'єктів у V8 визначено у файлі v8/src/roots/roots.h, ці об'єкти розташовані в пам'яті сусідньо. Як тільки вбудовані об'єкти, які не повинні бути витоками, будуть доступні для JavaScript, це може призвести до виконання довільного коду в пісочниці.
Щоб перевірити цей метод, можна змінити рідні функції V8, щоб витік Uninitialized Oddball в JavaScript. Конкретно, можна змінити відступ %TheHole() функції щодо ізоляції.
Основний код методу обходу виглядає так:
Javascript функція read(obj, prop) { повернути obj[prop]; }
нехай uninitialized_oddball = %TheHole(); нехай arr = [1.1, 2.2, 3.3];
для (дозволити i = 0; i < 100000; i++) { read(arr, 0);
}
нехай val = read(uninitialized_oddball, 0); console.log019283746574839201val019283746574839201;
У тестуванні V8 11.0.0, коли %TheHole() повертає UninitializedOddball, все ще можливо здійснити відносно довільне читання.
! Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel
Оптимізована ключова збірка функції read виглядає так:
0x558b20004086 mov R11,rdi 0x558b20004089 movzx edi,byte ptr [r11+0xb] 0x558b2000408d cmp edi,0x81 0x558b20004093 jnz 0x558b200040d8 0x558b20004095 mov r9,qword ptr [r11+0xf] 0x558b20004099 тест esi,esi 0x558b2000409b js 0x558b200040d8 0x558b2000409d movsxd R11,esi 0x558b200040a0 cmp r11,qword ptr [r9+0xf] 0x558b200040a4 jae 0x558b200040d8 0x558b200040a6 vmovsd xmm0,[r9+r11*8+0x7]
Коли передається uninitialized_oddball, обчислення починається з obj на 0x558b20004086, а в кінцевому підсумку завершується довільним читанням в інструкції vmovsd, дані зберігаються в регістрі xmm0.
! Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel
Рекомендований спосіб виправлення полягає в тому, щоб при поверненні елементів масиву з оптимізованої функції додати перевірку масиву map, щоб уникнути безпосереднього обчислення зсуву для повернення значення масиву.
Варто зазначити, що деяке програмне забезпечення все ще не виправило цю вразливість. Спосіб використання на платформі x86 дещо відрізняється, оскільки немає стиснення адрес, довільне читання та запис є відносно всього процесу. Навіть якщо ASLR увімкнено, завдяки великому розміру файлу, все ще існує велика ймовірність читання та запису цільового вмісту.
Цей новий метод обходу значно знизив складність використання подібних уразливостей. Рекомендується переглянути всі вразливості, пов'язані з витоками uninitialized_oddball.
У V8 також є інші значення Sentinel, які також можуть призвести до подібних проблем. Це дає нам такі висновки:
Чи також легко реалізувати V8 RCE через інші uninitialized_Oddball витоки.
Чи слід такі питання офіційно вважати питаннями безпеки, все ще залишається спірним.
Чи слід додавати Sentinel value як змінну до Fuzzer для виявлення нових експлоіт-примітивів.
У будь-якому випадку, такого роду проблеми значно скорочують період, протягом якого хакери можуть повністю використати вразливість.
! Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel
! Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel
! Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel
! Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel
! Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel
! Ексклюзивне розкриття обходу Chrome v8 HardenProtect шляхом витоку значення Sentinel