HENkaku Ensō bootloader hack for Vita
漏洞分析
多年前我们在逆向分析Vita固件时,发现了一个位于引导程序中的缓冲区溢出漏洞。该漏洞极具价值,因为它出现在引导早期阶段(在ASLR和其他安全功能正确初始化之前),并且允许在内核启动前进行补丁修改(这大大扩展了破解的可能性)。
漏洞成因是引导程序为eMMC设备读取静态分配了一个缓存缓冲区,使用固定的512字节块大小,但在实际将块加载到缓存时,却使用了FAT分区头中(用户可控的)块大小字段。我们通过经典的缓冲区溢出方式,覆盖了位于缓存缓冲区后的函数指针来利用此漏洞。
设计目标
在创建Ensō时,我们设定了几个主要设计目标:
- 尽可能早地加载未签名驱动代码,这将支持开发更多种类的破解
- 支持用户错误时的恢复,避免因错误插件导致设备变砖
- 尽可能重用现有基础设施,不分裂本已很小的自制软件生态系统
引导过程劫持
漏洞利用让我们能够在非安全引导程序中控制代码执行,我们的任务是在保持控制的同时让系统其余部分正常启动。
引导过程分为三个阶段:
- NSBL(非安全引导程序)- 我们从漏洞利用中控制此阶段
- 使用NSBL内部的加载器加载基础内核和驱动
- 内核完全加载
我们在多个关键位置打补丁:
- 在authmgr.skprx中禁用未签名代码的检查
- 在sysstatemgr.skprx中支持加载自定义(未签名)引导脚本
- 在sdif.skprx中重定向块0读取到块1,确保漏洞利用的MBR修改不会破坏内核
- 在display.skprx中打补丁实现自定义启动logo
恢复机制
早期引导阶段的破解非常危险,我们设计了多重恢复方案:
- 安全模式下降级几乎所有补丁(仅保留sdif.skprx补丁)
- 用户选择安全模式中的重置选项将删除损坏的自定义引导脚本和taiHENkaku
- 通过安全模式重新安装3.60固件将移除Ensō破解
- 所有破解文件存储在ur0:(用户数据分区),避免修改只读的os0分区
测试结果
我们邀请了100名测试者参与测试,最终67人完成了测试指南。测试覆盖了多种设备配置:
- PS Vita 1000系列:26台
- PS Vita 2000系列:25台
- PS TV:16台
在最初版本中出现了两台永久性变砖设备,我们迅速识别并修复了问题,后续测试中再未出现变砖情况。
技术挑战与解决方案
内存卡兼容性问题:当启用版本欺骗功能启动SceShell时,Vita会将"当前"固件版本写入内存卡的id.dat文件。解决方案是在HENkaku R9中禁用id.dat写入。
内存卡切换问题:如果用户切换内存卡且该卡装有旧版HENkaku,可能导致SceShell崩溃。解决方案是在HENkaku R10中将所有内容安装到内置系统内存ur0中。
该破解支持3.60-3.65固件版本,通过精心设计的补丁系统和多重恢复机制,在提供强大功能的同时最大限度地降低了设备变砖风险。