
PS5용 WebKit 기반 커널 익스플로잇 및 탈옥
이 저장소에는 Synacktiv이 보고한 UMTX 경쟁 조건 use-after-free (CVE-2024-43102) 취약점에 대한 WebKit ROP 익스플로잇이 포함되어 있습니다. 기본적으로 fail0verflow의 및 flatz의 익스플로잇 전략을 포팅한 것입니다. UAF를 악용하여 커널 스레드 스택에 대한 읽기/쓰기 매핑을 얻고, 파이프 읽기와 쓰기를 활용하여 커널에서 (그다지 이상적이지 않은) 임의 읽기/쓰기 프리미티브를 구축합니다. 그런 다음 이 읽기/쓰기는 ipv6 소켓 쌍과 파이프 쌍을 활용하는 더 나은 프리미티브로 승격되어, 이전 IPV6 PS5 커널 익스플로잇에서 가능했던 것과 동일한 방식으로 페이로드에 전달할 수 있는 안정적인 읽기/쓰기를 제공합니다.
이 페이지 자체는 idlesauce의 PS5 익스플로잇 호스트를 축소 및 수정한 버전입니다. 이미 psfree를 제가 이전에 사용하던 코드 스타일에 접합하는 작업을 해두었기 때문입니다. 또한 이 호스트는 매우 매끄럽고 유용한 페이로드를 통합하므로 제가 실행할 때 개인적으로 선호하는 선택이기도 합니다. 가까운 시일 내에 이 익스플로잇을 지원하도록 업데이트되기를 바랍니다 <3.
결국 페이로드 로더가 실행되어 포트 9021에서 페이로드 ELF를 수신 대기합니다. 커널 오프셋이 추가되면 이 로더와 완전히 호환될 것이므로 PS5 Payload Dev SDK를 권장합니다.
이 취약점은 1.00 펌웨어부터 7.61 펌웨어까지 영향을 미치지만, FW >= 3.00은 익스플로잇이 작동하도록 조정이 필요한 추가 완화 조치가 있는 것으로 보입니다. 저는 주로 낮은 펌웨어에만 관심이 있기 때문에 이 익스플로잇은 아직 FW >= 3.00을 지원하지 않습니다. 또한, 우리가 연쇄적으로 사용하는 WebKit 취약점은 6.00에서 패치되었으므로, 이러한 시스템에는 사용자 영역 읽기/쓰기를 달성하는 또 다른 WebKit 익스플로잇이 필요할 것입니다. 다시 말하지만, 저는 높은 펌웨어에 집중하지 않으므로 지금은 미완성으로 남겨둡니다.
중요 참고 사항
현재 지원되는 펌웨어는 다음과 같습니다:
dns.conf를 통해 fakedns를 구성하여 manuals.playstation.net이 PC의 IP 주소를 가리키도록 합니다.python fakedns.py -c dns.confpython host.py0.0.0.0으로 둡니다.
ELF 로더를 사용하려면 익스플로잇이 완료될 때까지 실행하세요. 완료되면 포트 :9021에서 서버가 실행됩니다. TCP로 PS5에 연결하여 ELF를 보내면 실행됩니다. 이 로더는 브라우저를 종료한 후에도 페이로드를 계속 수락하고 실행합니다.
초기 double free
이 익스플로잇의 전략은 대부분 fail0verflow와 flatz에서 비롯되었습니다. 취약점에 대한 자세한 내용은 chris@accessvector의 분석 글을 참조하세요. 익스플로잇에 성공하면 기본적으로 double free가 발생합니다. 이를 사용하여 커널 스택의 vmobject를 mmap 매핑의 vmobject와 겹치게 하여 커널 스레드 스택에 대한 창을 얻을 수 있습니다. 이 매우 강력한 기능을 통해 스택에 있는 임의의 커널 포인터에 읽기/쓰기를 할 수 있어 ASLR을 무력화하고 프리미티브를 만들 수 있습니다. 스택에 접근 권한이 있는 스레드를 victim 스레드라고 부릅니다.
임의 읽기/쓰기 얻기
메인 스레드에서 파이프를 만들고 파이프 버퍼를 채운 다음 victim 스레드를 사용하여 쓰기를 시도하면, victim 스레드는 버퍼에 공간이 생길 때까지 대기하며 차단됩니다. 이 시간 동안 커널 스택에 대한 창을 사용하여 iovec 포인터를 커널 포인터로 변경하고 플래그를 설정하여 커널 주소로 처리되게 할 수 있습니다. 그런 다음 메인 스레드에서 파이프를 읽으면 커널 임의 읽기를 얻을 수 있습니다.
마찬가지로 victim 스레드가 파이프에서 읽도록 하면 들어오는 데이터를 기다리며 차단됩니다. 그런 다음 다시 iovec 포인터를 덮어써서 커널 포인터로 만들고 메인 스레드에서 데이터를 쓰면 커널 임의 쓰기를 얻을 수 있습니다.
임의 읽기/쓰기 업그레이드
이 단계에서는 실제 제약이 없는 임의 읽기/쓰기를 보유하지만, 작동하려면 멀티스레딩과 차단을 사용해야 하므로 이상적이지 않습니다. 그런 다음 R/W를 사용하여 프로세스의 FD 테이블을 반복하고 두 IPV6 소켓의 pktopts를 겹칩니다. 그런 다음 IPV6_PKTINFO sockopt를 통해 또 다른 임의 읽기/쓰기를 만들 수 있습니다. 그러나 이 읽기/쓰기 프리미티브는 기본 소켓 옵션으로 인해 크기와 내용이 제한되므로 역시 이상적이지 않습니다. 대부분의 페이로드 등이 구축된 IPV6 익스플로잇 시나리오를 모방하기 위해 이 단계를 유지합니다.
파이프를 통해 더 나은 읽기/쓰기를 얻을 수 있습니다. 프로세스의 FD 테이블을 다시 반복하고 pipemap 버퍼 객체를 수정하여 읽기/쓰기를 구축할 수 있습니다. IPV6 소켓 쌍은 pipemap 버퍼를 제어하는 메커니즘으로 사용됩니다.
손상 수정/우회
상태를 그대로 두고 브라우저를 닫으려고 하면 시스템이 충돌합니다. 프로세스 정리 과정에서 이미 해제된 커널 스택을 해제하려고 하기 때문입니다. 이를 방지하기 위해 두 가지를 수행합니다:
td_kstack을 0으로 설정합니다.FW < 3.00에서 이 익스플로잇은 매우 안정적입니다. 유일한 중요한 실패 지점은 vmobject 겹치기에 실패하는 것입니다. 더 높은 펌웨어에서는 페이지/힙 할당자 수준의 완화 조치로 인해 이 겹치기가 달성하기 더 어렵습니다.
PS5 연구/개발에 기여하는 데 관심이 있는 분들은 제가 만든 Discord에 참여할 수 있습니다 여기.