Switch 2 被一款老游戏攻破:ns2jb 越狱的四步攻击链
不焊芯片、不插卡带:研究者用一款 Switch 1 老游戏 SmileBASIC 的整数溢出打开第一道门,再攻破文件系统模块 fs、中途掉包文件系统骗过任天堂两道验签,最后改写 fs 本体。这是 Switch 2 发售一年多后的第一个纯软件越狱。

Switch 2 发售才一年多,最新固件 23.0.1 被攻破了。研究者 Sammy Hajhamid 发布的 ns2jb,是这台主机的第一个纯软件越狱:不需要硬改芯片,不需要特殊卡带,靠的是一条四步攻击链——一款老游戏的整数溢出、文件系统模块的路径溢出、一次教科书级的验签绕过,和一个写着「当前进程」的特殊句柄。
更值得一提的是开发方式:作者搭了一套自动化装置(JetKVM 远程喂手柄输入、机械臂负责崩溃后按电源键),让多个 AI 编程助手并行找洞,整个越狱磨了大约两周。今天请来硬件安全研究员沈知远,拆一拆这条链。
本文由每日自动管线生成:选题与素材来自 Hacker News 公开讨论(HN 769 分 / 269 评论),访谈内容由 AI 基于公开资料整理,嘉宾为角色设定,观点不代表任何真实人物。
小听: 知远,第一步为什么是款 Switch 1 的老游戏?
沈知远: 因为 Switch 1 游戏有两个天然优势:它跑在没有 PAC 指针验证的旧环境里,而且其信任根早年已被攻破,代码可以解密来读。这次中招的是 SmileBASIC,一个能在主机上写 BASIC 程序的编程游戏,3DS 时代就被攻破过。它的解释器删除数组元素时有个 32 位整数溢出:检查写的是 position + count <= array.length,但两个数相加能回绕成负数,检查就被骗过去;随后搬运内存填补空缺时,把数组前面 8 个字节——一个指向数组自身的指针——搬进了数组。
小听: 指针进了数组,然后呢?
沈知远: 数组第一个元素 R[0] 的「长度」字段正好被指针占据,长度一下变成一个巨大的数。攻击者以这个超长字符串为窗口,就能对整块内存任意读、任意写,再往后做出代码执行。演示画面里,Switch 2 屏幕上弹出一行字:HELLO FROM SWITCH 2。第一道门开了。
![R[0] 的长度变成了内存地址](https://pub-9bc235b741e0490a828151395bc64747.r2.dev/switch-2-jailbreak/inline-1.jpg)
R[0] 的长度字段被指针占据后,整块内存想读就读、想写就写。
小听: 第二跳是文件系统模块 fs。它是怎么被攻破的?
沈知远: fs 有个处理路径的命令,会把路径做规范化。路径里含 /..\ 这样的父目录分量时,它分配一个 0x301 字节的临时缓冲区放结果,但路径本身可以比缓冲区长——溢出就发生了。溢出的落点旁边是文件缓存条目,劫持其中的数据指针,就能在 fs 进程里任意读写。他们再把自己进程登记的 PID 改成 1,拿到「FullPermission」完全权限,把内部存储和所有普通系统模块的代码全导出来离线分析。
小听: 接下来是全链最妙的一步:任天堂的验签链看起来是密码学完备的。
沈知远: 链条是这样的:任天堂的签名锁定 main.npdm 里的进程权限和开发者公钥;公钥锁定 NCA 包头的开发者签名;签名锁定包头哈希;哈希锁定文件系统内容。环环相扣。但最后一环有个隐含假设——fs 交出的文件系统,必须和包头哈希一致。而 fs 已经被攻破了。攻击者趁加载器来取文件时,把它句柄背后的文件系统对象整个换掉:真的 main.npdm 配上假的 main。两道验签检查的都是真证件和先前提交的真哈希,于是全过。自制代码,就以任意程序的身份跑起来了。

验签链的最后一环靠 fs 保证——而 fs 已经被攻破了。
小听: 最后一步,怎么从「任意普通模块」升级到改写 fs 本体?
沈知远: 普通模块里只有 ro 的权限证件允许调用「映射进程内存」这类内核服务,他们借 ro 的证件启动自制代码;再把一个事件对象的句柄覆写成特殊值 0xffff8001——内核把这个值理解为「当前进程」,于是顺手交出了 fs 的进程句柄。有了它,就能直接改写 fs 自己的代码。内置系统模块的原生代码执行完成,顺带还能调度 fs 的加密硬件。
小听: 总结一下这个越狱的边界。
沈知远: 三个词:纯软件、系留、第一步。不需要任何硬件改造;但重启后要重跑,还离不开外部设备协助,所以是系留越狱;除 fs 外的其他内置模块尚未拿下,离完整自制系统还有距离。但自制程序、游戏 Mod、存档备份、外设访问都已成为可能。HN 上 769 分的热度说明,整个主机安全社区都把这当作 Switch 2 的分水岭事件。
小听: 总结:老游戏的整数溢出打开第一道门,fs 的路径溢出完成第二跳,掉包文件系统骗过验签,特殊句柄改写 fs 本体。感谢知远,明天见。
参考资料:Sammy Hajhamid《Jailbreaking the Switch 2》 · HN 讨论 50192536