硬核!大佬通过Intel CPU的JTAG接口,DUMP微软原始Xbox的加密BootROM。

IoT 2个月前 admin
73 0 0

这是一篇记录如何通过Intel CPU的JTAG接口,DUMP微软原始Xbox的加密BootROM的文章,内容也记录了老哥如何设计实现JTAG调试器的过程,全过程非常硬核!

  • 原文:JTAG 'Hacking' the Original Xbox in 2023 Using Intel CPU JTAG to dump the secret bootrom in Microsoft's original Xbox[1]
  • 译者:TrustZone

2001年11月发布的初代Xbox是微软首次涉足游戏主机行业的产品。其硬件与21世纪初便宜但多功能的个人电脑十分相似,因此立即引起了技术爱好者的关注,他们试图在这款设备上运行“自制”代码和替代操作系统。

在其生命周期内,Xbox遭受了广泛的硬件和软件攻击,被单方面破解。但如今这款基于英特尔奔腾III的系统已问世20年,它仍然是一个惊人的平台,可用于学习或探索众多至今仍具有相关性的安全和计算机系统工程主题。

与往常的内容不同,本文利用一些怀旧情怀来应对初代Xbox研究人员最早提出的一些思考所带来的挑战:通过英特尔的x86 CPU JTAG“破解”初代Xbox。

硬核!大佬通过Intel CPU的JTAG接口,DUMP微软原始Xbox的加密BootROM。
Hardware debugging the original Xbox CPU (Pentium III) using a custom JTAG CPU interposer

关于初代Xbox

与21世纪初的其他一些游戏主机不同,初代Xbox是一个构建在英特尔CPU+英伟达GPU以及统一内存架构之上的非常直接的硬件平台。

微软设计了一个便于现有PC游戏开发者转型的系统,从而利用其在PC市场的主导地位。

硬核!大佬通过Intel CPU的JTAG接口,DUMP微软原始Xbox的加密BootROM。
Original Xbox 1.0 motherboard: An ATX board with a 32-bit 733 MHz Intel Pentium III CPU and a custom NVIDIA GPU

但Xbox的安全性在很大程度上依赖于一个“秘密”的512字节启动ROM,该ROM被精心隐藏在系统的定制英伟达MCPX南桥中,以建立信任链。在Xbox发布后的三个月内,这个秘密启动ROM就被安德鲁·“邦尼”·黄(Andrew “bunnie” Huang)破解并公之于众,这使得这款游戏机完全向进一步研究敞开大门。

邦尼使用FPGA在HyperTransport总线上嗅探ROM,在其从MCPX前往北桥/GPU的途中将其破解,然后再通过前端总线传输到CPU。邦尼2003年出版的书籍《破解Xbox》(现已免费)中详细描述了这种(以及其他)攻击方法。

硬核!大佬通过Intel CPU的JTAG接口,DUMP微软原始Xbox的加密BootROM。
The MCPX is the "Media Communication Processor" (southbridge) which also plays host to the secret ROM

回顾破解秘密ROM的竞争过程,当时有一些讨论考虑了尝试使用英特尔CPU的JTAG功能来探测系统并读出这个难以捉摸的引导程序:

“JTAG边界扫描方法被拒绝,因为用于将JTAG链保持在复位状态的TRST#引脚以一种难以修改的方式被激活,除非移除处理器。”

——摘自安德鲁·黄(Andrew Huang)2002年的论文《硬件中的保密:微软Xbox(TM)案例研究》

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

硬核!大佬通过Intel CPU的JTAG接口,DUMP微软原始Xbox的加密BootROM。
Original Xbox CPU: 32-bit 733 MHz Intel Pentium III with 128 KB L2 cache as a mobile BGA2 chip package

更重要的是,为了查询内存、寄存器或执行其他类似调试器的操作,对英特尔的私有JTAG指令进行黑盒逆向工程被认为是一项非同小可的任务:

“移除并安装处理器被认为成本高昂且耗时;Pentium III的BGA插槽成本估计在数百至数千美元之间。此外,Pentium III的JTAG边界扫描代码大多是专有的,因此也必须进行逆向工程……”

——摘自安德鲁·黄(Andrew Huang)2002年的论文《硬件中的保密:微软Xbox(TM)案例研究》

但随着Xbox自制生态系统在接下来的几年里蓬勃发展,人们发现了一系列其他方法来廉价地破坏、破解或逃离微软试图通过秘密ROM建立的信任链。由于追求这些更具挑战性的硬件攻击缺乏动力,因此它们被搁置并逐渐被遗忘。

英特尔x86 JTAG

尽管如今通过新方法破解或绕过秘密ROM已无所获,但对Xbox CPU进行硬件调试的能力仍将为研究和保存该平台丰富的历史提供无与伦比的透视。使用JTAG对CPU进行调试的一些好处包括:

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

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

硬核!大佬通过Intel CPU的JTAG接口,DUMP微软原始Xbox的加密BootROM。根据我的研究,2000年代初最好的奔腾III调试器(可能甚至是唯一的)是由美国的Arium公司和Applied Microsystems公司生产的。其中一些Arium公司的产品售价低至9000美元,而另一些则超过40000美元。据传,英特尔在与这些公司合作开发这些解决方案时,要求它们签署了10至15年的保密协议。

这些调试器的主要客户主要是原始设备制造商(OEM),他们在稳定新主板的过程中进行硬件验证或BIOS/固件开发。由于市场相当狭窄,这两家公司生产的这一时期的硬件调试器总共不过几千台。

到2023年,这些古董级的硬件调试器很少出现,而且售价大多不超过25至75美元。

自制CPU JTAG

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

我开始回顾旧的英特尔处理器数据表、硬件开发人员手册、主板参考设计以及那个时代的平台建议,以便开始拼凑出对这些硬件调试器应该如何与CPU进行物理接口的更好理解。硬核!大佬通过Intel CPU的JTAG接口,DUMP微软原始Xbox的加密BootROM。作为一名主要从事软件研究的研究人员,在处理英特尔CPU的物理集成方面,我并不想偷工减料。为了消除所有硬件方面的模糊性,我决定最好设计一个CPU中间层PCB,以清晰地引出JTAG信号,并根据英特尔的规范重新构建一个ITP端口。

专用的CPU中间层将使我能够隔离JTAG信号(以及其他CPU控制信号),同时跳过对Xbox主板可能对这些信号所做的任何其他反向工程。这样,我还可以将相关信号整齐地收集到一个调试器通常期望接入的物理端口中。

硬核!大佬通过Intel CPU的JTAG接口,DUMP微软原始Xbox的加密BootROM。
Designing the 4-layer CPU JTAG breakout interposer in KiCad 7.0

绝大多数CPU信号只是简单地通过4层CPU中间层PCB进行1对1的传输。这个中间层最初被设计为2层PCB,但在经过同行评审并考虑到当今业余PCB生产的成本差异微不足道后,它被增加到了4层。

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

硬核!大佬通过Intel CPU的JTAG接口,DUMP微软原始Xbox的加密BootROM。硬核!大佬通过Intel CPU的JTAG接口,DUMP微软原始Xbox的加密BootROM。从JLCPCB订购的五块4层ENIG PCB的最低订单费用为20美元,DHL运费为20美元。在等待JTAG中间层PCB到货的同时,我重新焊接了一个或两个之前从另一个项目中剩下的松动的Xbox CPU。

下单八天后,我收到了JTAG引出CPU中间层,并且有一块板已经准备好进行安装尝试。

安装JTAG引出CPU中间层

即使使用半专业设备,安装JTAG引出中间层也是一个繁琐的过程,任何错误都可能导致失败。以下一系列图片描绘了移除原始CPU并安装JTAG中间层的大致步骤顺序。

硬核!大佬通过Intel CPU的JTAG接口,DUMP微软原始Xbox的加密BootROM。
The original Xbox CPU with flux around it to aid in reflow, under a BGA rework station, prior to chip removal

硬核!大佬通过Intel CPU的JTAG接口,DUMP微软原始Xbox的加密BootROM。硬核!大佬通过Intel CPU的JTAG接口,DUMP微软原始Xbox的加密BootROM。

硬核!大佬通过Intel CPU的JTAG接口,DUMP微软原始Xbox的加密BootROM。
A test fit of the JTAG interposer and its expected alignment prior to final install
硬核!大佬通过Intel CPU的JTAG接口,DUMP微软原始Xbox的加密BootROM。
CPU and interposer on a cheap BGA rework station, both about to be soldered during a single reflow profile

安装过程中最关键的部分是,不仅要对准并回流一个球栅阵列,而且要对准并回流两个球栅阵列,以便在单个返工配置上进行焊接。虽然我使用了一些聚酰亚胺胶带来更好地确保底部阵列(中间层到主板)的对准,但顶部球阵列(CPU到中间层)的对准则是靠肉眼完成的。

硬核!大佬通过Intel CPU的JTAG接口,DUMP微软原始Xbox的加密BootROM。
BGA camera of CPU + interposer stackup, after the BGA profile has completed the reflow profile

在回流之前,在转接板插头部分的下方放置了一些“支撑物”(无操作SMD电阻)。虽然这些支撑物不可见,也不起任何电气作用,但它们提供了一定的机械强度,有助于在插拔JTAG排线时防止BGA球发生应力或开裂。

作为一个原型,我甚至不确定这个JTAG转接板(或安装)是否会出错,所以对于这次概念验证尝试的理想构造或使用寿命,我并不太关心。

硬核!大佬通过Intel CPU的JTAG接口,DUMP微软原始Xbox的加密BootROM。
The successfully installed JTAG interposer – the system was able to boot normally at this point
硬核!大佬通过Intel CPU的JTAG接口,DUMP微软原始Xbox的加密BootROM。
The fully populated JTAG interposer ready for testing with the CodeTAP hardware debugger

在完成回流工艺后,转接板是手工安装的。我不相信30针的插头能在焊接CPU和JTAG转接板所需的高温下不熔化。考虑到这次安装的复杂性,以及使用一个未经审查的设计来转接150个敏感的CPU信号,事情进展得出奇地顺利。

安装了CPU转接板后,谢天谢地,Xbox像往常一样正常启动了。但是JTAG能用吗?

转储加密ROM

第一次测试JTAG设置很困难,因为我对硬件和软件的“正常”连接序列一无所知,也没有相关文档。我获得了CodeTAP的“现状”版本,并努力寻找带有ITP端口(通常是罕见的工程主板)的奔腾II/III主板来进行测试。

将硬件调试器插入我的JTAG转接板,并将软件(CAD-UL XDB)连接到它,Xbox在尝试启动时会出现“FRAG”(闪烁的红绿灯,表示一般系统故障状态)。

硬核!大佬通过Intel CPU的JTAG接口,DUMP微软原始Xbox的加密BootROM。
Plugging the CodeTAP JTAG debugger into the interposer when prepping the board post-install

调试器软件一直无法连接,提示“目标RESET断言”,而CodeTAP硬件甚至没有指示它能从目标(TGTPWR)感应到电源。我稍微有点怀疑可能是什么问题,但还是再三检查了我的原理图、引脚分配,并在主板上进行了探测,以验证CPU确实正在被RESET。

问题的根源在于,原始Xbox上的系统管理控制器(一个PIC16微控制器)期望CPU在启动后的约200毫秒内通过一系列系统完整性测试,否则它将重置整个设备链。我已经将调试器配置为在系统连接时恢复,但显然这没有起作用,或者不是按我预期的方式起作用。

硬核!大佬通过Intel CPU的JTAG接口,DUMP微软原始Xbox的加密BootROM。我为Arduino Uno编写了一个小程序,并将其放置在通常运行在系统管理控制器(SMC)和MCPX之间的I2C总线上。这样,我就可以代替正常的CPU执行来满足SMC的系统完整性挑战。

突然之间,一切都变得井然有序,JTAG调试器也连接上了——我瞥见了Xbox原始1.0秘密ROM的CPU重置向量,它如此辉煌:硬核!大佬通过Intel CPU的JTAG接口,DUMP微软原始Xbox的加密BootROM。

硬核!大佬通过Intel CPU的JTAG接口,DUMP微软原始Xbox的加密BootROM。在努力熟悉调试器和几次系统重置之后,我能够使用XDB内存视图导航到系统内存的前512字节(大约在重置向量附近)——使用JTAG从零售版Xbox主板上转储了完整、原始的1.0秘密启动ROM。

最终,针对该系统的最古老的理论攻击之一 — 得以平息。

持续探索

将怀旧的好奇心与建立对计算机硬件更深层理解的有趣机会相结合,才是这项研究的真正目的。此外,对Xbox CPU进行硬件调试的能力开辟了几个新的相关项目,我个人觉得这些项目对于进一步研究该平台和一般操作系统内部机制非常有趣。

硬核!大佬通过Intel CPU的JTAG接口,DUMP微软原始Xbox的加密BootROM。
The pure chaos of JTAG hacking the Original Xbox, 20 years in the making

尽管不够充分,但微软在Xbox中积极努力地构建了多层安全机制。通过转接板发布了TRST#,使用Arduino满足了系统管理控制器的安全挑战,并使用JTAG转储了秘密ROM……他们隐藏了最后一个技巧,即在启动后几秒钟内,将异常的CPU启动与MCPX的强制重置绑定在一起。

找出这个最终重置的起源、它在系统中的历史以及最终禁用方法,可能本身就是一篇独立的博文,这表明Xbox中可能还有一些谜团仍然值得我们去深入了解。

硬核!大佬通过Intel CPU的JTAG接口,DUMP微软原始Xbox的加密BootROM。随着Xbox上的Intel JTAG现在已完全正常运行,通过消除Arduino甚至可能消除CPU转接板,这项工作的不确定性有所减少,从而可以对其进行更精细的完善。从长远来看,这种奔腾III的JTAG设置为研究私有Intel JTAG指令提供了一个良好的基础,这是该工作的衍生品,具有更广泛的应用。

如果你对定制的Intel JTAG技术感兴趣或有所了解,请考虑为你能贡献的部分做出贡献,以支持在GitHub上建立的这一新兴的开放知识库。这是唯一一个旨在保存或记录x86 JTAG的现代资源,它在本帖所述的工作中证明了其重要性。

结论

这篇博文重温了一个旧想法,即原始的微软Xbox可能通过Intel的x86 CPU JTAG接口被黑客入侵。创建了一个定制的CPU转接板PCB,以将JTAG信号引出至CodeTAP硬件调试器。通过Intel JTAG成功转储了Xbox的秘密启动ROM,并从执行的第一条指令开始就具备了真正的调试能力,从而结束了这一长达20年的理论篇章。

与传统的软件和基于操作系统的内核调试技术相比,硬件CPU调试可以提供独特的系统内部审视能力。这类硬件解决方案过去通常是高度专有的,并且关于它们的公开信息非常少,这使得这是一项充满挑战但同时也非常有益的研究体验。


推荐阅读:

参考资料

[1]

JTAG 'Hacking' the Original Xbox in 2023 Using Intel CPU JTAG to dump the secret bootrom in Microsoft's original Xbox: https://blog.ret2.io/2023/08/09/jtag-hacking-the-original-xbox-2023/


原文始发于微信公众号(TrustZone):硬核!大佬通过Intel CPU的JTAG接口,DUMP微软原始Xbox的加密BootROM。

版权声明:admin 发表于 2024年7月2日 上午7:43。
转载请注明:硬核!大佬通过Intel CPU的JTAG接口,DUMP微软原始Xbox的加密BootROM。 | CTF导航

相关文章