该仓库包含一个针对 UMTX 竞争条件释放后使用(CVE-2024-43102)漏洞 的 WebKit ROP 漏洞利用,该漏洞由 Synacktiv 报告。它基本上是 fail0verflow 的 和 flatz 的 漏洞利用策略的移植。它滥用 UAF 来获得对内核线程栈的读/写映射,并利用管道读写在内核中建立一种(不太理想的)任意读/写原语。随后,该读写被升级为一种更好的原语,利用 ipv6 套接字对和管道对实现稳定的读写,并可以像之前的 IPV6 PS5 内核漏洞利用 那样传递给有效载荷。
该页面本身是 idlesauce 的 PS5 Exploit Host 的精简修改版本,因为它已经完成了将 psfree 与我之前使用的代码风格相结合的工作。这个 Host 也是我个人运行东西的选择,因为它非常流畅并集成了有用的有效载荷,希望它能在不久的将来更新以支持这个漏洞利用 <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 连接并将你的 ELF 发送到 PS5,它就会运行它。即使退出浏览器,该加载器也应继续接受并执行有效载荷。
初始双重释放
该漏洞利用的策略主要来自 fail0verflow 和 flatz。有关该漏洞的更多信息,请参阅 chris@accessvector 的文章。利用该漏洞后,它实际上给了我们一个双重释放。我们可以利用这一点,将内核栈的 vmobject 与 mmap 映射的 vmobject 重叠,从而获得进入内核线程栈的窗口。这种非常强大的能力让我们能够读/写栈上的任意内核指针,从而击败 ASLR 并能够创建各种原语。我们能够访问其栈的线程称为受害者线程。
获取任意读写
通过创建一个管道并在主线程上填满管道缓冲区,然后尝试使用受害者线程向其写入,受害者线程将阻塞,等待缓冲区中出现可用空间。在此期间,我们可以利用进入内核栈的窗口,将 iovec 指针改为内核指针,并设置标志,使它们被当作内核地址处理。然后通过在主线程上读取管道,即可获得内核任意读。
类似地,让受害者线程在管道上进行读取,它将阻塞等待传入数据。然后,我们可以再次覆写 iovec 指针,将它们变为内核指针,并在主线程上写入数据,从而获得内核任意写。
升级任意读写
到了这个阶段,我们拥有一个没有真正限制的任意读/写,但它的工作依赖于多线程和阻塞,这并不理想。然后,我们使用该读写遍历进程的 FD 表,并重叠两个 IPV6 套接字的 pktopts。接着,我们可以通过 IPV6_PKTINFO 套接字选项创建另一个任意读写。不过,这个读写原语同样不理想,因为底层套接字选项限制了它的大小和内容。我们保留这一步主要是为了模拟 IPV6 漏洞利用的场景,大多数有效载荷等都是基于该场景构建的。
我们可以通过管道获得更好的读写。再次遍历进程的 FD 表并修改 pipemap 缓冲区对象,即可建立读写。IPV6 套接字对用作控制 pipemap 缓冲区的机制。
修复/规避损坏
如果我们保持原样并尝试关闭浏览器,系统将会崩溃。这是因为进程清理会尝试释放已经被释放的内核栈。为避免这种情况,我们做两件事:
td_kstack 清零。在 FW < 3.00 上,该漏洞利用非常稳定。唯一关键的失败点是无法重叠 vmobject。在较高固件上,由于页面/堆分配器层面所谓的缓解措施,这种重叠更难实现。
有兴趣为 PS5 研究/开发做出贡献的人可以加入我搭建的 Discord 这里。