
1.xx-2xx 펌웨어용 PS5 하이퍼바이저 익스플로잇입니다.
PS5 하이퍼바이저 익스플로잇으로 2.xx 이하 펌웨어를 대상으로 합니다. 저장소에는 두 가지 취약점과 익스플로잇 체인이 포함되어 있으며, 이들은 서로 독립적이므로 둘 중 하나를 사용할 수 있습니다. 하나의 익스플로잇은 주로 보존 목적으로 제공되며 (/_old_jump_table_exploit), 기본 익스플로잇 체인(QA 플래그 익스플로잇)만 사용하면 됩니다.
이 연구는 hardwear.io NL 2024에서 발표되었으며, 슬라이드는 여기에서 확인할 수 있습니다. 발표 내용은 곧 공개될 예정입니다.
점프 테이블 익스플로잇
첫 번째 익스플로잇은 하이퍼바이저 코드 점프 테이블이 게스트 커널과 공유되는 취약점을 이용하며, /_old_jump_table_exploit/에 포함되어 있습니다. VMMCALL_HV_SET_CPUID_PS4 하이퍼콜의 점프 테이블 엔트리를 하이재킹하여 하이퍼바이저에서 코드 실행을 달성할 수 있습니다. Nested Paging(NPT)과 Guest Mode Execute Trap(GMET)을 비활성화하는 ROP 체인을 실행하여, 커널 페이지 테이블 엔트리(PTE)에서 XOM(eXecute Only Memory, 일명 xotext)을 비활성화해 덤프할 수 있으며, PTE에 쓰기 가능 플래그를 활성화해 커널을 후킹/패치할 수도 있습니다.
이 방법은 상당히 많은 가젯과 오프셋을 필요로 하며, 이것이 이 익스플로잇이 기본 익스플로잇이 아닌 주된 이유입니다. 또한 현재 ROP 체인이 실행되는 코어에서만 하이퍼바이저를 무력화할 수 있으며, 다른 코어에서는 하이퍼바이저가 여전히 활성 상태이므로 비활성화해야 합니다.
QA 플래그 익스플로잇
기본이자 권장되는 익스플로잇은 시스템 QA(Quality Assurance) 플래그가 하이퍼바이저와 게스트 커널 간에 공유된다는 점을 이용합니다. 하이퍼바이저가 초기화될 때 중첩 페이지 테이블을 구성하는 초기화 코드는 QA 플래그에서 SL(System Level) 디버깅 플래그를 확인합니다. 이 플래그가 설정되어 있으면 중첩 PTE(Page Table Entries)에 커널 .text 페이지에 대한 xotext 비트가 설정되지 않으며, 또한 커널 .text 페이지에 쓰기 비트도 설정됩니다.
이 플래그들은 절전 모드에서 다시 시작할 때 보안 로더에 의해 다시 초기화되지 않지만, 하이퍼바이저는 다시 초기화됩니다. SL 플래그를 설정하고 시스템을 절전 모드로 전환한 후 다시 시작하면, 게스트 커널의 페이지 테이블을 편집하여 커널 .text 페이지를 읽기/쓰기 가능하게 만들 수 있으며, 이를 통해 커널 덤프 및 후킹/패치가 가능합니다.
이 익스플로잇 페이로드는 PS5-Payload-Dev SDK를 사용하여 빌드됩니다. 또한 hen/의 빌드는 약간 특별한데, 커널 코드 케이브에 복사되는 플랫 바이너리로 컴파일되기 때문입니다. hen/의 모든 코드는 수퍼바이저/커널 모드에서 실행됩니다.
byepervisor.elf를 전송합니다.byepervisor.elf를 다시 전송합니다 (John Tornblom의 ELF 로더를 사용하는 경우, ELF 로더는 재개 후에도 페이로드를 계속 수락해야 합니다. 그렇지 않으면 UMTX 익스플로잇을 다시 실행해야 합니다).byepervisor.elf를 한 번만 전송해도 되도록 만들기PS5 연구/개발에 기여하는 데 관심이 있는 분들은 제가 개설한 디스코드에 참여할 수 있습니다 여기.