一条覆盖多段固件的 PS5 利用链由哪几部分组成

一个公开的 PS5 利用项目把支持范围写成固件 7.00 到 13.60。项目同时给出两个阶段的说明,浏览器阶段负责在渲染进程里拿到内存读写原语,内核阶段借一次释放后使用的竞争拿到内核读写。跨越多段小版本仍能工作的链条,靠的是把这两个阶段接起来,再给每个阶段留出按版本维护的偏移数据。看清这条链的组成,比记住版本号更能判断它能不能在自己的机器上跑通。

版本区间说明了什么

利用代码里的地址和结构体偏移跟着固件走。一个小版本改了对象布局,写死的偏移就会失效。这个项目把偏移单独放在一个目录里,说明偏移是按版本维护的数据,不是代码里的常量。覆盖 7.00 到 13.60 的含义是,这段区间内浏览器引擎的对象布局和内核相关结构没有出现让链路中断的变化。换到区间之外的固件,通常要自己重新确认这些偏移。

浏览器阶段在做什么

第一个任务是在渲染进程里造出可用的读写能力。项目写了两条线索。一条是 JavaScriptCore 的信息泄露,用来把进程里的地址读出来。另一条是结构化克隆时的对象池不匹配,两侧对池子的理解不一致,复制过程中写坏了 typedarray 的长度或数据指针。typedarray 一出问题,读写就能落到任意地址上。渲染进程的权限到此为止,要继续往下走必须进内核。

内核阶段怎么拿到权限

内核阶段的基础是一次地址泄露加上 aio_multi_wait 的释放后使用竞争。同一块内存在两个执行流之间被重复使用,配合已经拿到的内核地址,就能把某个对象改写成可控内容,进而建立内核读写。到这一步,执行任意代码的条件才齐。释放后使用类竞争通常要反复尝试,成功率跟时序关系很大,这也是整条链路稳定性最弱的一环。

跑通之后的流程

项目给的用法是修改主机的网络设置,把主 DNS 指到指定地址,让主机自己访问利用页面,也可以在本地跑一个 Python 服务。默认载荷放在 payloads 目录,成功运行后一个 ELF 加载器监听 9021 端口,后续工作从这里开始。载荷与利用代码分开存放,说明前后两个阶段只负责开路,真正运行的程序由使用者自己提供。

失败时怎么处理

项目说明里写得很直接。浏览器阶段可能要试几次,卡住就刷新页面。内核阶段可能让主机挂起甚至直接重启,这时应该重启后再试,不要继续加载载荷。把这些写进说明,是因为失败率跟版本、时序和机器状态都有关。复现时容易把还没成功当成版本不支持。

自己动手前的边界

项目以 MIT 许可发布,声明只用于教育和安全研究。绕过设备的访问控制、在未经授权的设备上运行这类代码可能违法,厂商条款也可能封禁账号。复现只应在自己的设备上进行,并记录好原始固件版本,方便回退。

常见问题

机器在支持区间内也跑不通,先查什么?

先看浏览器阶段是否卡住,刷新再试。内核阶段失败会让主机挂起或重启,重启后重新进入页面,避免连续加载多个载荷。

偏移一定要自己找吗?

区间内一般直接用项目自带的偏移文件。换到未列出的固件,需要自己确认浏览器与内核两侧的结构变化。

ELF 加载器的端口能改吗?

默认监听 9021,端口在载荷侧配置,改完之后客户端也要跟着调整。