[博客翻译]JTAG在2023年“黑客攻击”原始Xbox


原文地址:https://blog.ret2.io/2023/08/09/jtag-hacking-the-original-xbox-2023/


JTAG“破解”2023年的初代Xbox

使用英特尔CPU的JTAG功能提取微软初代Xbox的秘密启动ROM

2023年8月9日 / Markus Gaasedelen

2001年11月发布的初代Xbox是微软进军游戏主机行业的第一步。它的硬件与2000年代初期的廉价但多功能PC非常相似,因此立即吸引了技术爱好者们的目光,他们希望在这台设备上运行“自制”代码和替代操作系统。

在Xbox的生命周期中,它通过广泛的硬件和软件攻击被单方面破解。然而,20年过去了,这款基于英特尔奔腾III的系统仍然是一个绝佳的平台,用于学习或探索许多至今仍然相关的安全和计算机系统工程主题。

作为对我们常规内容的有趣偏离,这篇文章利用了一些怀旧情绪,来应对初代Xbox研究人员早期提出的挑战:通过英特尔的x86 CPU JTAG“破解”初代Xbox。


使用定制的JTAG CPU转接板对初代Xbox CPU(奔腾III)进行硬件调试

关于初代Xbox

与其他2000年代初期的游戏主机不同,初代Xbox是一个非常直接的硬件平台,围绕英特尔CPU和NVIDIA GPU构建,采用统一内存架构。微软设计了一个易于现有PC游戏开发者过渡的系统,利用他们在PC市场的主导地位。


初代Xbox 1.0主板:一块ATX主板,搭载32位733 MHz英特尔奔腾III CPU和定制的NVIDIA GPU

然而,Xbox的安全性严重依赖于一个“秘密”的512字节启动ROM,这个ROM被小心翼翼地隐藏在系统的定制NVIDIA MCPX南桥中,以建立信任链。在发布后的三个月内,这个秘密启动ROM被Andrew “bunnie” Huang提取出来,使得该主机向进一步研究敞开了大门。

Bunnie使用FPGA在HyperTransport总线上嗅探ROM,当ROM从MCPX传输到北桥/GPU时,再通过前端总线传输到CPU。这个攻击(以及其他攻击)在bunnie 2003年的书《“Hacking The Xbox”》(现已免费)中有详细描述。


MCPX是“媒体通信处理器”(南桥),同时也承载着秘密ROM

回顾提取秘密ROM的竞赛,当时有一些讨论关于是否尝试使用英特尔的CPU JTAG功能来探测系统并读取这个难以捉摸的启动加载程序:

“JTAG边界扫描方法被拒绝,原因是TRST#引脚(用于保持JTAG链复位)被激活,难以修改而不移除处理器。”
——摘自《Keeping Secrets in Hardware: The Microsoft Xbox (TM) Case Study》,Andrew Huang,2002年

微软故意将TRST#引脚接地,位于Xbox CPU下方,以禁用英特尔JTAG接口,阻止任何人进行探测。


初代Xbox CPU:32位733 MHz英特尔奔腾III,128 KB L2缓存,采用移动BGA2芯片封装

更重要的是,黑箱逆向英特尔的私有JTAG指令以查询内存、寄存器或执行其他类似调试器的操作被认为是非常困难的:

“移除和插座化处理器被认为是非常昂贵和耗时的;奔腾III的BGA插座成本估计在数百到数千美元之间。此外,奔腾III的JTAG边界扫描代码大多是专有的,也需要进行逆向工程……”
——摘自《Keeping Secrets in Hardware: The Microsoft Xbox (TM) Case Study》,Andrew Huang,2002年

但随着Xbox自制生态系统在接下来的几年中蓬勃发展,发现了一系列其他方法可以廉价地破坏、提取或绕过微软试图通过秘密ROM建立的信任链。因此,很少有人去追求这些更具挑战性的硬件攻击,它们被遗忘了。

英特尔x86 JTAG

尽管今天通过新方法提取或绕过秘密ROM已经没有什么意义,但硬件调试Xbox CPU的能力仍然提供了无与伦比的洞察力,以进一步研究和保存该平台的丰富历史。JTAG调试CPU的一些好处包括:

  • 从执行的第一条指令(即复位向量)开始调试系统
  • 无需修改操作系统或硬件上运行的任何软件即可进行非侵入式调试
  • 调试零售BIOS映像和其他没有本地内核调试功能的运行时
  • 如果它在CPU上运行,你就可以调试它——Xbox内核、Linux、自定义RTOS、Windows等
  • JTAG在保真度上超越了模拟器,用于研究硬件特定行为和未模拟的外设

然而,20年后,仍然没有开源硬件或软件解决方案能够访问英特尔的私有JTAG指令……考虑到x86的普及程度,这似乎有些奇怪。另一种选择是找到过去的一些半完整的“高度专有”硬件调试器(及其软件组件),这几乎同样具有挑战性:


一个Applied Microsystems的CodeTAP调试器,用于英特尔奔腾II / III,购买时“按现状”

根据我的研究,2000年代初最好的奔腾III调试器(可能也是唯一的)是由American AriumApplied Microsystems制造的。这些调试器的价格从低至$9k到超过$40k美元不等。据称,英特尔在开发这些解决方案时与这些公司签订了10-15年的保密协议。

这些调试器的主要客户是进行硬件验证或BIOS/固件开发的OEM厂商,以稳定新主板。由于市场狭窄,这两家公司生产的硬件调试器数量不超过几千台。

在2023年,这些老式硬件调试器很少出现,并且购买价格通常不超过25-75美元。

自制CPU JTAG

在Xbox上处理JTAG的一个更具挑战性的方面是TRST#引脚在CPU下方被接地。虽然理论上钻出连接以释放TRST#可能允许我们驱动JTAG状态机,但我不知道CodeTAP /硬件调试器在TRST#未按预期操作时会有何反应。

我开始查阅旧的英特尔处理器数据表、硬件开发者手册、主板参考设计和当时的平台建议,以拼凑出这些硬件调试器如何与CPU物理接口的更好理解。


英特尔参考ITP原理图,来自《Intel Pentium III Processor/840 Development Kit Manual》,2001年4月

作为一个主要从事软件研究的人,我并不想在英特尔CPU的物理集成上偷工减料。为了消除所有硬件歧义,我决定最好设计一个CPU转接PCB,以干净地引出JTAG信号,根据英特尔的规格重建ITP端口。

专用的CPU转接板将允许我隔离JTAG信号(和其他CPU控制信号),同时跳过对Xbox主板可能对这些信号进行的任何逆向工程。这也使我能够将相关信号整齐地收集到一个物理端口中,调试器通常期望通过这个端口进行连接。


KiCad 7.0中设计4层CPU JTAG引出转接板

大多数CPU信号只是通过4层CPU转接PCB 1对1地传递。这个转接板最初设计为2层PCB,但在一些同行评审后升级为4层,因为今天的业余PCB生产成本差异可以忽略不计。

感兴趣的JTAG / CPU控制信号通过内部布线层(绿色)引出,第二个内部层(隐藏在上方)仅作为地平面。引出是一个30针SMT System 50连接器,符合英特尔规格——仅这个接头就花费了15美元。


KiCad中的JTAG引出转接PCB渲染图,物理订单前


五个JTAG引出转接板,刚从JLCPCB到货

从JLCPCB订购五个4层ENIG PCB的最低成本为20美元,DHL运费为20美元。在等待JTAG转接PCB到货的同时,我重新焊接了一两个从另一个项目中剩下的Xbox CPU。

订单发出八天后,我拿到了JTAG引出CPU转接板,并准备进行安装尝试。

安装JTAG引出CPU转接板

即使使用半专业设备,安装JTAG引出转接板也是一个繁琐的过程,任何错误都会导致失败。以下图片系列展示了移除原始CPU并安装JTAG转接板的大致步骤。


原始Xbox CPU周围涂有助焊剂,以帮助回流,位于BGA返修站下,芯片移除前

[](https://b