针对 Switch 2 最新固件 23.0.1,一款名为 ns2jb 的纯软件越狱工具正式发布。这是已知首款针对 Switch 2 的此类漏洞利用程序,虽需 tethered(依赖主机连接)运行,但允许以普通系统模块或内置 fs 系统模块身份执行任意原生代码。

借助该工具,用户可运行自制软件、进行逆向工程、修改游戏及备份存档,并通过 MMIO 访问大部分外设。为展示其能力,开发者 Codex 成功对 Switch 2 独占游戏《马里奥赛车世界》进行了模组修改。

技术原理与突破

ns2jb 的核心突破在于绕过 WebKit 的安全限制,转而利用 Switch 1 游戏 SmileBASIC 中的漏洞。由于 Switch 1 不支持指针认证码(PAC)和控制流完整性(CFI),且信任根已被攻破,这为攻击提供了更可行的切入点。

Codex 在 SmileBASIC 解释器中发现了一个 32 位整数溢出漏洞。当从数组中移除项目时,位置与计数的总和可能回绕为负数,导致 memmove 操作发生越界读写。利用这一缺陷,攻击者可以劫持数组指针,实现对内存的任意读写(ARW)。

提权至系统模块

获取用户态代码执行权限后,下一步是提权至特权系统模块。Codex 选择了内置的 fs 系统模块作为目标,因其代码量大且与 Switch 1 相似度高。通过分析,团队在 fs 的路径规范化功能中发现缓冲区溢出漏洞:包含特定父目录组件的路径会触发临时堆缓冲区溢出。

利用该溢出,攻击者可以劫持 BufferedStorage 对象的缓存指针,从而实现内核级的任意读写。随后,通过将进程 ID 设置为 1,获得“FullPermission”权限,进而转储内部存储及所有普通系统模块代码。

实现任意代码执行

为实现原生代码执行,攻击者利用了加载器(ldr)与 fs 模块之间的交互机制。尽管 NCA 标头经过严格的签名验证,但 fs 模块负责确保文件系统内容与哈希值匹配。凭借对 fs 的任意读写权限,攻击者可以在加载器检查后、处理文件请求前,替换 ExeFS 对象。

具体而言,攻击者将包含原始 main.npdm 但替换了 main 可执行文件的临时文件系统注入加载器域表。由于 fs 已提交有效的 NCA 标头哈希和签名,第二次检查得以通过。此外,通过操纵 IPC 连接句柄,攻击者能精确控制 fs 处理消息的时机,确保替换成功。

最终,利用 ro 系统模块的 NPDM 权限,攻击者调用 MapProcessMemory 创建 fs 代码的可写视图,从而修补并执行任意代码。这一突破意味着可以在无需利用每个设备驱动漏洞的情况下调查硬件,为 Switch 2 自制软件和定制固件(CFW)的发展奠定基础。

目前,该漏洞利用已在 Switch 1 上完成测试,但尚未打包发布。未来工作包括将 fs 漏洞利用移植至 WebKit,以及探索其他内置系统模块的潜在漏洞。