
Эксплойт ядра на основе WebKit и джейлбрейк для PS5
Этот репозиторий содержит WebKit ROP-эксплойт для уязвимости гонки use-after-free в UMTX (CVE-2024-43102), сообщённой Synacktiv. По сути, это порт стратегии эксплойта fail0verflow и flatz. Он злоупотребляет UAF для получения чтения/записи в стек потока ядра и использует чтение и запись через pipe для создания (не совсем идеального) примитива произвольного чтения/записи в ядре. Затем это чтение/запись улучшается до более стабильного примитива на основе пары ipv6-сокетов и пары pipe, который можно передавать пейлоадам так же, как это было возможно с предыдущим эксплойтом ядра PS5 через IPV6.
Сама страница представляет собой урезанную и модифицированную версию PS5 Exploit Host от idlesauce, поскольку там уже была проделана работа по интеграции psfree с моим ранее используемым стилем кода. Этот хост — также мой личный выбор для запуска всего: он очень плавный и включает полезные пейлоады. Надеюсь, в ближайшем будущем его обновят для поддержки этого эксплойта <3.
В конечном итоге запускается загрузчик пейлоадов, который слушает порт 9021 в ожидании ELF-пейлоадов. Я рекомендую PS5 Payload Dev SDK, поскольку он должен быть полностью совместим с этим загрузчиком, когда будут добавлены смещения ядра.
Эта уязвимость затрагивает прошивки с 1.00 по 7.61, однако на FW >= 3.00, похоже, действуют дополнительные меры защиты, требующие доработки эксплойта. Поскольку меня в основном интересуют только младшие прошивки, этот эксплойт пока не поддерживает FW >= 3.00. Кроме того, уязвимость WebKit, которую мы используем в связке, была исправлена в 6.00, поэтому для этих систем потребуется другой WebKit-эксплойт, обеспечивающий чтение/запись в пользовательском пространстве. Опять же, поскольку я не сосредоточен на старших прошивках, эта часть пока не завершена.
Важные замечания
В настоящее время поддерживаются следующие прошивки:
dns.conf, указав для manuals.playstation.net IP-адрес вашего ПКpython fakedns.py -c dns.confpython host.py0.0.0.0
Чтобы использовать ELF-загрузчик, запустите эксплойт до завершения. По завершении он запустит сервер на порту :9021. Подключитесь и отправьте ваш ELF на PS5 по TCP — он будет выполнен. Этот загрузчик должен продолжать принимать и выполнять пейлоады даже после выхода из браузера.
Первоначальное double free
Стратегия этого эксплойта во многом взята у fail0verflow и flatz. См. статью chris@accessvector для получения дополнительной информации об уязвимости. При эксплуатации она, по сути, даёт нам double free. Мы можем использовать его, чтобы перекрыть vmobject стека ядра с vmobject mmap-отображения и получить доступ к стеку потока ядра. Эта очень мощная возможность позволяет читать/записывать произвольные указатели ядра в стеке, что даёт обход ASLR и возможность создавать примитивы. Поток, к стеку которого у нас есть доступ, мы будем называть потоком-жертвой.
Получение произвольного чтения/записи
Создав pipe и заполнив его буфер в главном потоке, а затем попытавшись записать в него из потока-жертвы, мы заставим поток-жертву заблокироваться в ожидании освобождения места в буфере. В это время мы можем через окно в стек ядра изменить указатели iovec на указатели ядра и установить флаги так, чтобы они обрабатывались как адреса ядра. Затем, читая pipe в главном потоке, мы получаем произвольное чтение в ядре.
Аналогично, заставив поток-жертву читать из pipe, он заблокируется в ожидании входящих данных. Затем мы снова перезаписываем указатели iovec, превращая их в указатели ядра, и записываем данные в главном потоке, получая произвольную запись в ядре.
Улучшение произвольного чтения/записи
На этом этапе у нас есть произвольное чтение/запись без реальных ограничений, но для его работы нам приходится использовать многопоточность и блокировки, что не идеально. Затем мы используем R/W для перебора таблицы файловых дескрипторов процесса и перекрываем pktopts двух IPV6-сокетов. После этого мы можем создать ещё одно произвольное чтение/запись через sockopt IPV6_PKTINFO. Этот примитив чтения/записи снова не идеален, так как он ограничен по размеру и содержимому из-за особенностей базового сокетного параметра. Этот шаг мы сохраняем в основном для повторения сценария IPV6-эксплойта, на котором построено большинство пейлоадов и сопутствующих инструментов.
Более хороший примитив чтения/записи можно получить через pipe. Снова перебирая таблицу файловых дескрипторов процесса и изменяя объекты буфера pipemap, мы можем установить чтение/запись. Пара IPV6-сокетов используется как механизм управления буфером pipemap.
Исправление/обход повреждений
Если оставить всё как есть и попытаться закрыть браузер, система упадёт. Это происходит потому, что очистка процесса попытается освободить стек ядра, который уже был освобождён. Чтобы избежать этого, мы делаем две вещи:
td_kstack потока-жертвы в списке потоков процесса.На FW < 3.00 этот эксплойт очень стабилен. Единственная критическая точка отказа — неудачное перекрытие vmobjects. На старших прошивках этого перекрытия сложнее добиться из-за предполагаемых мер защиты на уровне аллокатора страниц/кучи.
Те, кому интересно внести вклад в исследования/разработку для PS5, могут присоединиться к Discord-серверу, который я создал, здесь.