Консоль PlayStation 5 получает первую документацию, касающуюся эксплойта пользовательской среды, обнаруженного в прошивке 4.03, как уже ожидалось notzecoxao несколько дней назад.
Консоль Sony была выпущена 12 ноября 2020 г., хотя она имеет архитектуру, аналогичную архитектуре консоли PlayStation 4, в ней используется значительно более высокая модель безопасности как на уровне ядра, так и на уровне пользователя.
Мы выпустили небольшое описание и немного кода для userland exec на PS5.
Перенаправление DNS на https работает.
https://t.co/mgmD6JZgPo - Z (@Znullptr) 27 января 2022 г.
Ниже приведена некоторая ключевая системная информация о системном программном обеспечении и некоторых изменениях, внесенных по сравнению с предыдущим поколением.
Использует FreeBSD 11.
Нет доступа для разработки (т.е. неподписанный код не может быть запущен без эксплойтов).
На сегодняшний день нет публичных эксплойтов.
Добавлены смягчения в ядре и пользовательской среде.
Добавлен гипервизор, который управляет безопасностью приложений и контейнерами.
Обзор пользовательского пространства
Еще в сентябре Project Zero выпустила первый отчет о том, что, по их мнению, было CVE-2021-30858, но на самом деле оказалось неверным, как они описывали CVE-2021-30889.
Sleirsgoevy тем временем написал proof of concept для консоли PlayStation 4 , позже модифицированный, чтобы получить выполнение ROP на прошивке 9.00 для эксплойта ядра.
Документация, опубликованная ChendoChap , не описывает уязвимость, а фокусируется на получении произвольных примитивов чтения/записи и leakobj()/или fakeobj()предоставленных эксплойтом для получения выполнения кода на PlayStation 5 .
По-видимому, прошивка ниже версии 2.00 не выглядит уязвимой, вероятно, потому, что ее код FontFaceотсутствует в предыдущих сборках WebKit (это также относится к консоли PS4, так как прошивка ниже 9.00 не может быть использована с этой ошибкой).
Веб-браузер консоли PlayStation 5 оказался уязвимым в прошивке 4.03, хотя, к сожалению, стратегия эксплойта, используемая на PS4, не может быть использована на PS5 из-за CFI на основе clang.
На консолях PS4 примитивы leakobj()и произвольная запись используются для потери виртуальной таблицы HTMLTextArea и уничтожения одного из нескольких виртуальных вызовов для выполнения кода. На консолях PS5 вместо этого проверяются эти виртуальные вызовы.
Виртуальные вызовы теперь имеют код, похожий на этот, где применяется его адрес:
Смягчения
Имя ядро Пользователь Описание
SMEP: предотвращение выполнения в режиме супервизора Икс SMEP предотвратит запуск кода пользовательского пространства в режиме супервизора.
SMAP: предотвращение доступа в режиме супервизора Икс Он интегрирует предотвращение выполнения в режиме супервизора (SMEP), расширяет защиту на чтение и запись.
XOM: выполнить только память (R ^ X) Икс Икс Предотвращает чтение любых страниц памяти, помеченных как исполняемые.
Clang-CFI: целостность потока управления Икс Икс Защищает от перехвата потока управления переадресацией (виртуальные вызовы и т. д.).
Флаг работоспособности потока управления Clang
-fsanitize = cfi- Описание
актерский состав Это позволяет строго контролировать запуск.
производное приведение Приведение от базы к производной к неправильному динамическому типу.
несвязанный состав Трансляция из void * или какого-либо другого типа, не связанного с неверным динамическим типом.
nvcall Невиртуальный вызов через объект, vptr которого имеет неправильный динамический тип.
вкал Виртуальный вызов через объект, vptr которого имеет неверный динамический тип.
Я звоню Косвенный вызов функции с неверным динамическим типом.
mfcall Косвенно вызывается через указатель на функцию-член с неправильным динамическим типом.
Реализация эксплойта в WebKit
Обзор
Поэтому требовалась альтернатива для запуска кода в WebKit. К счастью, CFI PS5 работает только с передним фронтом и не использует теневой стек, поэтому обратные атаки (например, атака обратных адресов в стеке) являются честной игрой.
Javascript предоставляет довольно интересную функцию под названием Web Workers. Эти рабочие процессы представляют собой простые потоки внутри них, которые выполняют javascript в изолированной среде.
Они были полезны для эксплуатации, так как у них был надежный стек, который мы могли потерять и предоставить поток для вращения в нашей цепочке ROP.
Потеря стека рабочих
Библиотека libkernel, используемая WebKit (и многими другими приложениями), поддерживает список потоков для этого процесса и включает такую информацию, как адрес и размер стека. Перебирая этот список с помощью произвольного чтения/записи, мы можем найти адрес стека воркера.
function find_worker ( ) {
const PTHREAD_NEXT_THREAD_OFFSET = 0x38 ;
константа PTHREAD_STACK_ADDR_OFFSET = 0xA8 ; константа PTHREAD_STACK_SIZE_OFFSET = 0xB0 ;
for ( let thread = p.read8 ( libKernelBase.add32 ( OFFSET_lk__thread_list ) ) ; thread.low ! = 0x0 && thread . hi ! = 0x0 ; thread = p.read8 ( thread.add32 ( PTHREAD_NEXT_THREAD_OFFSET ) ) ) { let stack = p _ _ _ _ _ _ _ _ . read8 ( поток
. add32 ( PTHREAD_STACK_ADDR_OFFSET ) ) ;
пусть stacksz = p . read8 ( thread.add32 ( PTHREAD_STACK_SIZE_OFFSET ) ) ; _ _ if ( stacksz . low == 0x80000 ) { return stack ; } } alert ( "не удалось найти работника." ) ;
}
Запуск цепочки ROP
Когда у нас есть работающий стек, мы можем уничтожить известный адрес возврата в стеке, чтобы сложить сводную точку и заставить ROP работать. Поскольку стек детерминирован, мы можем настроить фиктивный рабочий процесс с обработчиком postMessageи переопределить адрес возврата в stack+0x7FB88.
const OFFSET_WORKER_STACK_OFFSET = set_offset_for_platform ( 0x0007FB88 , 0x0007FB28 ) ;
// ...
пусть return_address_ptr = worker_stack . добавить32 ( OFFSET_WORKER_STACK_OFFSET ) ; пусть original_return_address = p . read8 ( return_address_ptr ) ; пусть stack_pointer_ptr = return_address_ptr . добавить32 ( 0x8 ) ; // ... асинхронная функция
launch_chain ( цепочка ) {
// ...
// перезаписать адрес возврата
p . write8 ( return_address_ptr , gadgets [ "pop rsp" ] ) ;
р . write8 ( stack_pointer_ptr , chain.stack_entry_point ) ; _ _
let p1 = await new Promise ( ( resolve ) = > {
const channel = new MessageChannel ( ) ;
channel.port1.onmessage = ( ) = > { channel.port1.close ( ) ; resolve ( 1 ) ; } worker.postMessage ( _ _ _ _ _ _ _ _ 0 , [ канал .
порт2 ] ) ;
} ) ;
// ...
}
Вывод
https://www.biteyourconsole.net/2022/01/27/scena-ps...e-playstation-5/