PS5 UMTX越狱
摘要
此仓库包含Synacktiv报告的UMTX比赛免费使用(CVE-2024-43102)漏洞的WebKit ROP漏洞。这基本上是一种故障端口溢出和flatz利用策略。它滥用UAF来获取到内核线程堆栈的读/写映射,并利用管道读写在内核中建立一个(不太理想的)任意读/写原语。然后将此读/写升级为更好的读/写,该读/写利用ipv6套接字对和管道对进行稳定的读/写入,可以以与之前的ipv6 PS5内核漏洞相同的方式传递给有效载荷。
该页面本身是idlesease的PS5 Exploit Host的精简和修改版本,因为它已经将psfree与我以前使用的代码风格粘合在一起。这个主机也是我运行东西的个人选择,因为它非常流畅,集成了有用的有效载荷,希望它在不久的将来能够更新以支持此漏洞利用<3。
最终,将启动有效载荷加载器,以监听端口9021上的有效载荷ELF。我推荐PS5 Payload Dev SDK,因为当添加内核偏移时,它应该与此加载器完全兼容。
此漏洞会影响1.00固件到7.61固件,但是FW>=3.00似乎有额外的缓解措施,需要调整漏洞才能正常工作。由于我主要只对较低的固件感兴趣,因此此漏洞目前还不支持FW>=3.00。此外,我们链接的WebKit漏洞已在6.00中修补,因此这些系统需要另一个实现用户空间读/写的WebKit攻击。再说一次,由于我不专注于更高级的固件,所以现在还没有完成。
重要注意事项
3.00+的可靠性较低,可能需要更长的时间来执行,如果你在一段时间内陷入“触发竞争”,请关闭浏览器并重试。
5.00+ELF加载器目前无法工作,因为我们无法再正确调用dlsym,负载SDK需要更改。
目前支持以下固件:
1.xx[1.00、1.01、1.02、1.05、1.10、1.11、1.12、1.13、1.14]
2.xx[2.00、2.20、2.25、2.26、2.30、2.50、2.70]
3.xx[3.00,3.20]
4.xx[4.00、4.02、4.03、4.50、4.51]
5.xx[5.00、5.02、5.10、5.50]
目前包括
获取任意内核读/写
启用调试设置菜单(注意:您必须完全退出设置并返回查看)。
获取root权限并突破沙盒/监狱。
在端口9021上运行John Tornblom的ELF加载器,以执行有效载荷(在<5.00FW上)
局限性
此漏洞可实现读/写,但无法执行代码。这是因为我们目前无法转储小工具的内核代码,因为内核文本页面被标记为仅执行内存(XOM)。试图读取kernel.text指针会死机!
根据上述+管理程序(HV)强制内核写保护,此漏洞也无法在内核空间安装任何补丁或钩子。
存在并实施了基于Clang的细粒度控制流完整性(CFI)。
由于高压,无法禁用监控模式访问预防/执行(SMAP/SMEP)。
FW>=6.00需要新的WebKit漏洞,因此不受支持。
如何使用
通过dns.conf配置fakedns,将manuals.playstation.net指向您的PC IP地址
运行伪dns:python fakedns.py-c dns.conf
运行HTTPS服务器:python host.py
进入PS5高级网络设置,将主DNS设置为您的PC IP地址,并将次DNS设置为0.0.0.0
有时手册仍然无法加载,需要重新启动,不确定为什么它真的很奇怪
转到设置中的用户手册,接受不受信任的证书提示,运行
可选:取消注释kernel.data转储代码并运行转储服务器脚本(注意:exploit.js中必须替换地址/端口)。
今后的工作
更新FW>=3.xx的漏洞利用策略,以考虑缓解措施
为更多(较低)固件添加补偿
为FW>=6.00添加WebKit漏洞。
使用ELF加载器
要使用ELF加载器,请运行该漏洞直到完成。完成后,它将在端口9021上运行服务器。通过TCP将ELF连接并发送到PS5,它将运行它。即使在退出浏览器后,此加载器也应继续接受和执行有效载荷。
利用策略说明
初始双倍免费
这种利用的策略主要来自fail0overflow和flatz。请参阅chris@accessvector的文章提供了有关该漏洞的更多信息。在剥削时,它本质上给了我们双重自由。我们可以使用它将内核堆栈的vmobject与mmap映射的vmobject重叠,以获得一个进入内核线程堆栈的窗口。这种非常强大的功能使我们能够读取/写入堆栈上的任意内核指针,从而使ASLR失败并能够创建基元。我们可以访问的线程是堆栈,我们将称之为受害线程。
获取任意读/写
通过创建一个管道并填充主线程上的管道缓冲区,然后尝试使用受害线程对其进行写入,受害线程将阻塞等待缓冲区中的空间清理。在此期间,我们可以使用内核堆栈的窗口将iovec指针更改为内核指针,并设置标志以将其视为内核地址。通过读取主线程上的管道,我们可以获得内核的任意读取。
同样,通过让受害线程在管道上读取数据,它将阻止等待传入数据。然后,我们可以再次覆盖iovec指针,使其成为内核指针,并在主线程上写入数据,以获得内核任意写入。
升级任意读/写
到这个阶段,我们已经有了一个没有真正约束的任意读/写,但我们不得不使用多线程和阻塞来使其工作,这并不理想。然后,我们使用R/W迭代进程的FD表,并重叠两个IPV6套接字的pktops。然后,我们可以通过IPV6_PKTINFO sockopt创建另一个任意读/写。尽管如此,这种读/写原语仍然不理想,因为它的大小和内容受到底层套接字选项的限制。我们保持这一步主要是为了模拟IPV6漏洞利用的场景,大多数有效载荷等都是基于IPV6漏洞的。
我们可以通过管道获得更好的读/写。通过再次迭代进程的FD表并修改管道映射缓冲区对象,我们可以建立读/写。IPV6插座对用作控制管道映射缓冲区的机制。
修复/回避腐败
如果我们保持原样并尝试关闭浏览器,系统将崩溃。这是因为进程清理将尝试释放已经空闲的内核堆栈。为了避免这种情况,我们做了两件事:
故意泄漏我们用于初始double free的shm FD上的refcount,这样在进程退出时它就不会被释放
将进程线程列表中受害线程的td_kstack清零。
稳定性说明
在FW<3.00时,此漏洞非常稳定。唯一的关键故障点是未能重叠vmobjects。在高级固件上,由于在页面/堆分配器级别采取了所谓的缓解措施,这种重叠更难实现。
鸣谢/呐喊
故障溢出
弗拉茨
ChendoChap
SlidyBat
abc/psfree
无所事事
Znullptr
泽科索
社会幸福
约翰·托恩布洛姆
不和谐
那些有兴趣为PS5研究/开发做出贡献的人可以加入我在这里设置的不和谐。
最后网址是原作者地址想看原文的来这里:https://github.com/PS5Dev/PS5-UMTX-Jailbreak/blob/main/README.md
摘要
此仓库包含Synacktiv报告的UMTX比赛免费使用(CVE-2024-43102)漏洞的WebKit ROP漏洞。这基本上是一种故障端口溢出和flatz利用策略。它滥用UAF来获取到内核线程堆栈的读/写映射,并利用管道读写在内核中建立一个(不太理想的)任意读/写原语。然后将此读/写升级为更好的读/写,该读/写利用ipv6套接字对和管道对进行稳定的读/写入,可以以与之前的ipv6 PS5内核漏洞相同的方式传递给有效载荷。
该页面本身是idlesease的PS5 Exploit Host的精简和修改版本,因为它已经将psfree与我以前使用的代码风格粘合在一起。这个主机也是我运行东西的个人选择,因为它非常流畅,集成了有用的有效载荷,希望它在不久的将来能够更新以支持此漏洞利用<3。
最终,将启动有效载荷加载器,以监听端口9021上的有效载荷ELF。我推荐PS5 Payload Dev SDK,因为当添加内核偏移时,它应该与此加载器完全兼容。
此漏洞会影响1.00固件到7.61固件,但是FW>=3.00似乎有额外的缓解措施,需要调整漏洞才能正常工作。由于我主要只对较低的固件感兴趣,因此此漏洞目前还不支持FW>=3.00。此外,我们链接的WebKit漏洞已在6.00中修补,因此这些系统需要另一个实现用户空间读/写的WebKit攻击。再说一次,由于我不专注于更高级的固件,所以现在还没有完成。
重要注意事项
3.00+的可靠性较低,可能需要更长的时间来执行,如果你在一段时间内陷入“触发竞争”,请关闭浏览器并重试。
5.00+ELF加载器目前无法工作,因为我们无法再正确调用dlsym,负载SDK需要更改。
目前支持以下固件:
1.xx[1.00、1.01、1.02、1.05、1.10、1.11、1.12、1.13、1.14]
2.xx[2.00、2.20、2.25、2.26、2.30、2.50、2.70]
3.xx[3.00,3.20]
4.xx[4.00、4.02、4.03、4.50、4.51]
5.xx[5.00、5.02、5.10、5.50]
目前包括
获取任意内核读/写
启用调试设置菜单(注意:您必须完全退出设置并返回查看)。
获取root权限并突破沙盒/监狱。
在端口9021上运行John Tornblom的ELF加载器,以执行有效载荷(在<5.00FW上)
局限性
此漏洞可实现读/写,但无法执行代码。这是因为我们目前无法转储小工具的内核代码,因为内核文本页面被标记为仅执行内存(XOM)。试图读取kernel.text指针会死机!
根据上述+管理程序(HV)强制内核写保护,此漏洞也无法在内核空间安装任何补丁或钩子。
存在并实施了基于Clang的细粒度控制流完整性(CFI)。
由于高压,无法禁用监控模式访问预防/执行(SMAP/SMEP)。
FW>=6.00需要新的WebKit漏洞,因此不受支持。
如何使用
通过dns.conf配置fakedns,将manuals.playstation.net指向您的PC IP地址
运行伪dns:python fakedns.py-c dns.conf
运行HTTPS服务器:python host.py
进入PS5高级网络设置,将主DNS设置为您的PC IP地址,并将次DNS设置为0.0.0.0
有时手册仍然无法加载,需要重新启动,不确定为什么它真的很奇怪
转到设置中的用户手册,接受不受信任的证书提示,运行
可选:取消注释kernel.data转储代码并运行转储服务器脚本(注意:exploit.js中必须替换地址/端口)。
今后的工作
更新FW>=3.xx的漏洞利用策略,以考虑缓解措施
为更多(较低)固件添加补偿
为FW>=6.00添加WebKit漏洞。
使用ELF加载器
要使用ELF加载器,请运行该漏洞直到完成。完成后,它将在端口9021上运行服务器。通过TCP将ELF连接并发送到PS5,它将运行它。即使在退出浏览器后,此加载器也应继续接受和执行有效载荷。
利用策略说明
初始双倍免费
这种利用的策略主要来自fail0overflow和flatz。请参阅chris@accessvector的文章提供了有关该漏洞的更多信息。在剥削时,它本质上给了我们双重自由。我们可以使用它将内核堆栈的vmobject与mmap映射的vmobject重叠,以获得一个进入内核线程堆栈的窗口。这种非常强大的功能使我们能够读取/写入堆栈上的任意内核指针,从而使ASLR失败并能够创建基元。我们可以访问的线程是堆栈,我们将称之为受害线程。
获取任意读/写
通过创建一个管道并填充主线程上的管道缓冲区,然后尝试使用受害线程对其进行写入,受害线程将阻塞等待缓冲区中的空间清理。在此期间,我们可以使用内核堆栈的窗口将iovec指针更改为内核指针,并设置标志以将其视为内核地址。通过读取主线程上的管道,我们可以获得内核的任意读取。
同样,通过让受害线程在管道上读取数据,它将阻止等待传入数据。然后,我们可以再次覆盖iovec指针,使其成为内核指针,并在主线程上写入数据,以获得内核任意写入。
升级任意读/写
到这个阶段,我们已经有了一个没有真正约束的任意读/写,但我们不得不使用多线程和阻塞来使其工作,这并不理想。然后,我们使用R/W迭代进程的FD表,并重叠两个IPV6套接字的pktops。然后,我们可以通过IPV6_PKTINFO sockopt创建另一个任意读/写。尽管如此,这种读/写原语仍然不理想,因为它的大小和内容受到底层套接字选项的限制。我们保持这一步主要是为了模拟IPV6漏洞利用的场景,大多数有效载荷等都是基于IPV6漏洞的。
我们可以通过管道获得更好的读/写。通过再次迭代进程的FD表并修改管道映射缓冲区对象,我们可以建立读/写。IPV6插座对用作控制管道映射缓冲区的机制。
修复/回避腐败
如果我们保持原样并尝试关闭浏览器,系统将崩溃。这是因为进程清理将尝试释放已经空闲的内核堆栈。为了避免这种情况,我们做了两件事:
故意泄漏我们用于初始double free的shm FD上的refcount,这样在进程退出时它就不会被释放
将进程线程列表中受害线程的td_kstack清零。
稳定性说明
在FW<3.00时,此漏洞非常稳定。唯一的关键故障点是未能重叠vmobjects。在高级固件上,由于在页面/堆分配器级别采取了所谓的缓解措施,这种重叠更难实现。
鸣谢/呐喊
故障溢出
弗拉茨
ChendoChap
SlidyBat
abc/psfree
无所事事
Znullptr
泽科索
社会幸福
约翰·托恩布洛姆
不和谐
那些有兴趣为PS5研究/开发做出贡献的人可以加入我在这里设置的不和谐。
最后网址是原作者地址想看原文的来这里:https://github.com/PS5Dev/PS5-UMTX-Jailbreak/blob/main/README.md