PS5 虚拟机监控器(hypervisor)漏洞,适用于 <= 2.xx 固件。仓库中包含两个相互独立的漏洞及对应的漏洞利用链,任选其一即可使用。其中一个漏洞利用仅用于存档保留(/_old_jump_table_exploit),只需使用主漏洞利用链(QA flags 漏洞利用)即可。
该研究已在 hardwear.io NL 2024 大会上展示,幻灯片可在此处获取。演讲视频即将发布。
跳转表(Jump Table)漏洞利用
第一个漏洞利用了虚拟机监控器代码跳转表与客户机内核共享的漏洞,位于 /_old_jump_table_exploit/。通过劫持 VMMCALL_HV_SET_CPUID_PS4 超级调用(hypercall)的跳转表项,即可在虚拟机监控器中实现代码执行。我们运行一条 ROP 链来禁用嵌套页表(NPT)和访客模式执行陷阱(GMET),从而能够在内核页表项(PTE)中禁用仅执行内存(XOM,即 xotext)以将其转储,同时还能在 PTE 中启用写入权限,从而挂钩/修补内核。
这种方法需要相当多的 gadget 和偏移量,这也是该漏洞利用并非主漏洞利用的主要原因。此外,它目前只能破坏运行 ROP 链所在核心上的虚拟机监控器,其他核心上的虚拟机监控器仍然处于活动状态,需要另行禁用。
QA flags 漏洞利用
主要且推荐的漏洞利用利用了系统 QA(Quality Assurance)标志在虚拟机监控器与客户机内核之间共享这一事实。虚拟机监控器初始化时,构建嵌套页表的初始化代码会检查用于系统级别(SL)调试的 QA 标志。如果该标志被设置,则在内核 .text 页面对应的嵌套页表项(PTE)中不会设置 xotext 位,而且内核 .text 页面的 PTE 还会设置写入位。
这些标志在从睡眠模式恢复时不会由安全加载程序重新初始化,但虚拟机监控器会。通过设置 SL 标志、让系统进入睡眠状态并恢复,我们可以修改客户机内核的页表,使内核 .text 页面变为可读/可写,从而允许转储内核以及进行挂钩/修补。
byepervisor.elf)需要发送两次:一次在系统挂起之前,另一次在恢复之后。该漏洞利用载荷使用 PS5-Payload-Dev SDK 构建。另外请注意,hen/ 的构建稍有特殊,因为它会被编译成一个平面二进制文件,然后复制到内核代码洞穴(code cave)中。hen/ 中的全部代码都以监督者/内核模式运行。
byepervisor.elfbyepervisor.elf(如果你使用 John Tornblom 的 ELF 加载器,加载器在恢复后应继续接受载荷;如果不行,则需要重新运行 UMTX 漏洞利用)byepervisor.elf 只需发送一次对 PS5 研究/开发感兴趣的人可以加入我建立的 Discord 服务器。