攻击者如何通过USB攻陷微控制器固件

secM  1845天前

在本文中,我们将为读者演示如何从运行在CortexM0上的安全USB设备中提取固件。

谁“黑”了游戏机?

在视频游戏机领域,制造假冒和未经许可的产品的现象十分普遍。由于这是一个价值数十亿美元的行当,所以,有需求,造假者自然会趋之若鹜。现在,几乎所有发行的游戏机,都能找到相应的设备,使得我们可以利用闪存驱动器、假冒游戏手柄和附件、各种适配器来播放授权视频游戏的“备份”,其中,有些设备可以让您比其他玩家更有优势,甚至可以通过欺骗手段在在线和离线视频游戏中作弊。更有甚者,通过某些服务,可以直接花钱买等级,而不必花时间打怪。当然,这些都是未经游戏机制造商同意而出售的。

20年前一样,现代视频游戏机还是专有系统,其规则由硬件制造商自己说了算,而不是由使用这些设备的数百万客户来设定的。当然,他们的设计中也包含了各种保护措施,以确保这些游戏机只能运行已经签名的代码,这样,用户就只能玩通过合法渠道获得的授权视频游戏,并且,所有玩家享有平等的权利,只能使用官方授权的配件。在某些国家,试图破解自己的视频游戏机甚至是非法的。

但与此同时,保护的规模使得这些游戏机成为一个有吸引力的目标,也是对信息安全和逆向工程感兴趣的爱好者的一大破解目标。并且,对于他们来说,破解难度越大,越能激发他们的斗志。特别是,对于那些从小就爱玩电子游戏的破解者来说,尤其如此。

DualShock 4的保护方案

关注我的推特账号的读者可能知道,对视频游戏机及其相关内容进行逆向,包括非官方游戏设备,一直都是我的最爱。在PlayStation 4刚面世不久,通过FreeBSD内核(PlayStation 4所基于的内核)中的一个众所周知的漏洞,让我和许多其他研究人员有机会深入探索索尼新游戏机的架构和内部工作原理。为此,我进行了各种研究,例如,USB认证在PlayStation 4中的工作原理,以及它是如何区分许可设备和阻止未经授权的设备的。本文之所以选择这个主题,是因为我以前曾对其他游戏机做过类似的研究。虽然PlayStation 4的身份验证方案比Xbox 360中使用的方案简单得多,但同样也很有效。

1.png

PlayStation 4 USB配件的授权方案

PS4DualShock 4发送0x100个随机字节,作为响应,游戏手柄将创建相应的RSASSA-PSS SHA-256签名,并将其与需要验证的加密常数NE(公钥)一起返回。这些常量对于所有的DualShock 4游戏手柄来说都是独一无二的。同时,游戏手柄还会发送验证NE所需的签名。验证时,会使用相同的RSASSA-PSS SHA-256算法,但加密常数对于所有PlayStation 4游戏机来说都是相同的,并存储在内核中。

这意味着,如果您想要认证自己的USB设备,那么单纯攻击PlayStation 4内核是远远不够的——您还需要存储在游戏手柄中的私钥。即使有人设法破解游戏手柄并获得私钥,索尼仍然可以通过固件更新将密钥列入黑名单。如果八分钟后游戏机没有收到验证响应,它就会停止与游戏手柄的通信只有将其从USB端口拔出并再次将其插入后它才能工作。这就是早期的假冒游戏手柄的工作机制,它每8分钟就模拟一个USB端口拔掉/插入过程,用过的人都知道,特别烦人。

关于超仿DualShock 4的传闻

DualShock 4问世以来,没有任何迹象表明有人成功攻破了这种保护机制。然而最近,市场上新冒出了一些超仿的DualShock 4,无论外观还是功能方面,与正品几乎一模一样。在好奇心的驱使下,我忍不住从中国的商店里订购了一些。

当我在等待我的包裹到达时,我决定尝试收集更多有关假冒游戏手柄方面的信息。在搜索引擎的帮助下,我找到了一款名为Gator Claw的游戏手柄。

1.png

未经授权的Gator Claw游戏手柄

Reddit上有一个有趣的讨论,人们说原来它和其他未经授权的游戏手柄一样,只能使用8分钟,但是开发者已经通过固件更新解决了这个问题。图中的页面提供了固件更新的链接和相应的手册。

1.png

Gator Claw固件更新手册

针对嵌入式固件的分析工作

分析工作的第一步,就是查看固件更新程序可执行文件的资源部分。

1.png

Gator Claw固件更新程序的资源中找到的固件代码

熟悉嵌入式设备代码的读者很可能会已经对这种文件格式有所了解了。实际上,这是一种Intel十六进制文件格式,通常用于微控制器编程,许多编译器(例如GNU编译器)可以以这种格式来输出编译后的代码。此外,我们可以看到,固件代码的开头的熵不太高,字节序列很容易识别。这意味着固件没有进行相应的加密或压缩处理。为了考察这些代码,我们可以以Intel十六进制格式解码固件,并加载到十六进制编辑器(010 Editor能够直接打开这种格式的文件)。那么,它是为哪种体系结构编译的呢?很明显,这里是ARM Cortex-M架构。

1.png

Gator Claw固件(左)和ARM Cortex-M矢量表(右)

根据相关的规范,第一个双字是初始堆栈指针,之后是异常向量表。这个表中的第一个双字是用作固件入口点的复位向量。其他异常处理程序的高地址提供了固件的基地址。

除了固件之外,固件更新程序的资源部分还包含一个配置文件,其中通过了关于不同微控制器的描述信息。所以,固件更新程序的开发人员很可能使用微控制器制造商提供的公开源代码,这就解释了为什么这个配置文件会附带了相关的源代码。

1.png

带有不同微控制器描述信息的配置文件

在从配置文件中搜索微控制器标识符之后,我们找到了制造商Nuvoton的站点。我们发现,技术文档和SDK中都含有相关的产品信息,重要的是,它们都是可以免费下载的,根本无需任何许可协议。

1.png

Nuvoton微控制器制造商网站

至此,我们已经搞定了固件,知道了它的架构和微控制器制造商,同时,我们还获得了关于基址、初始堆栈指针和入口点的相关信息。下面,我们将使用IDA Pro加载固件,开始分析之旅。

ARM处理器有两种不同的指令集:ARM(32位指令)和THUMB(使用Thumb-2 32位指令扩展的16位指令)。我们知道,Cortex-M0仅支持Thumb模式,因此,使用IDA Pro加载固件时,我们需要将“ProcessorOptions-Edit ARM Architecture Options-Set ARM Instructions”中的单选按钮切换为“No”。

之后,我们会看到,固件将加载到基址0处,并且自动分析已经识别的几乎所有的函数。现在的问题是如何进一步展开固件代码的逆向分析工作。

1.png

固件函数示例

分析固件时,就会发现固件对内存进行读写操作时,基址自始至终都是0x40000000。这是内存映射到输入输出(MMIO)寄存器的基地址。这些MMIO寄存器允许您访问和控制微控制器的所有外设组件。固件所做的一切都是通过访问它们来实现的。

1.png

外围控制器的内存映射

通过查找与地址0x40000000有关的技术文档,我们发现该微控制器属于M451系列。现在,既然已经知道了微控制器所属的系列,就下来就可以下载对应的SDK和代码示例了。在SDK中,我们找到了一个定义了所有MMIO地址、位字段和结构的头文件。我们还可以使用所有库来编译示例代码,并将它们与IDB中的函数进行比较,或者在源代码中查找MMIO地址的名称,并将其与反汇编进行比较。这使得逆向工程的过程变得轻松许多。实际上,这主要归功于我们知道了微控制器的架构和模型,从而能够找到所有MMIO寄存器的定义。如果我们没有这些信息,分析就会困难得多了。同时,这也是为什么许多供应商只有在签署NDA之后才分发SDK的原因。

1.png

在固件中查找库函数

巨人的影子

在等待假冒游戏手柄到手之际,我抽空分析了一下GatorClaw的固件。我们对它的内部运行细节没有太多兴趣:认证数据被发送到可通过I2C访问的另一个微控制器,之后,响应将被送回控制台。这款未经许可的游戏手柄的开发人员也意识到,自己的固件可能会被逆向,如果这样的话,会有更多的假冒游戏手柄问世,从而会影响自家的销量。为了杜绝这种情况,他们使用了另一个微控制器来加以保护。这是一种非常常见的做法。黑客在他们的产品上下了很大的功夫,因为他们也不想被其他黑客破解。在这个固件中,真正引起我注意的是存在一些看似未使用的字符串。它们很可能是USB设备描述符的一部分,但该特定描述符尚未使用。这个字符串是故意保留的吗?这是某种签名吗?很有可能,因为这个字符串是以其逻辑分析仪而闻名的一家硬件制造商的名称。但事实证明,该公司还设立了一个游戏部门,旨在成为原始设备制造商(OEM),甚至拥有许多与游戏配件生产相关的专利。除此之外,他们还拥有一些子公司,其网站上有各种各样的游戏配件,并且都在同一个品牌下销售。在售的产品包括二十几种适配器,可以让一种游戏机的游戏手柄可以在另一种游戏机上面使用。例如,有一种产品,可以让我们将Xbox 360的游戏手柄连接到PlayStation 4上面,而另一种产品则可以将PlayStation3游戏手柄连接到Xbox One上使用,等等。更有甚者,有的适配器竟然可以将PC鼠标和键盘连接到PS4Xbox One、任天堂游戏机、各种手柄和印刷电路板上。所有产品都提供了与Gator Claw类似的固件更新程序,但也存在一个显著的区别——所有固件都是经过加密的。

1.png

来自其中一个产品的资源的手动和加密固件的示例

这些印刷电路板上用于帮我创建自己的街机控制器,有了它们,我们无需购买相关设备,更无需进行拆卸,就能查看相关的PCB设计了。他们的PCB设计很可能与Gator Claw手柄的非常接近。在下面的图片中,我们可以看到2个微控制器;其中一个是NuvotonM451,另一个是附加的微控制器,用来存储机密数据。所有走线都汇聚到了黑色环氧树脂下的微控制器,因此,它应该就是主微控制器,并且,具有四个黄色引脚的微控制器似乎满足在I2C上工作所需的条件。

1.png

PCB设计示例

新发现

这时我终于收到了深圳的包裹,具体如下图所示:这款游戏手柄看起来跟原版的DualShock 4简直一模一样。这是一款采用优质材料制作的无线游戏手柄,提供了工作触摸板、扬声器和耳机接口。

1.png

假冒DualShock 4的外观

手柄启动后,将会进入DFU模式;在该模式下,将游戏手柄连接到PC,它被识别为具有不同标识符和特征的另一台设备。接下来,我们将考察其内部情况……

1.png

假冒DualShock 4PCB电路板

我将几根导线焊接到看起来像是JTAG点的地方,并将其连接到一个JTAG编程器。我们发现,该编程器能够正确识别该微控制器,但它设置了安全锁。

1.png

编程工具识别出了该微控制器,但它启用了安全锁

通过USB入侵微控制器固件

好了,现在是回到本文的主题的时候了。USBUniversal Serial Bus,通用串行总线)是外围设备的工业标准。它的设计非常灵活,同时,也得到了非常广泛的应用。USB协议定义了两种实体——一个主机连接其他设备。USB设备的类型分为集线器、人机界面、打印机、图像、海量存储设备,等等。

1.png

USB设备连接方案

设备与主机之间的数据和控制交换过程是通过一组单向或双向管道完成的。对于管道,我们可以把它看作是主机软件和USB设备上的特定端点之间的数据传输通道。一个设备可以有多种不同的端点,以交换不同类型的数据。

1.png

数据传输类型

数据传输存在4种不同的类型:

  • 控制传输(用于配置设备)
  • 批量数据传输(生成或消耗的数据量相对较大且突发性较强)
  • 中断数据传输(用于及时、可靠地传递数据)
  • 同步数据传输(占用预先协商好的USB带宽量,并且具有预先协商好的传输延迟)

所有USB设备必须支持通过端点0指定的特殊管道,USB设备的控制管道将连接到该管道。

这些类型的数据传输是通过下面的方案提供的数据包来实现的。

1.png

USB协议中使用的数据包

事实上,USB协议是一个状态机制,在本文中,我们不会全面介绍所有这些数据包。下面是控制传输中使用的数据包的示例。

1.png

控制传输

USB设备在实现批量传输、中断传输、同步传输时可能存在漏洞,但这些类型的数据传输是可选的,它们的存在与否和用法会因目标而异。但所有USB设备都支持控制传输。它们的格式是通用的,这使得这种类型的数据传输成为最有吸引力的漏洞分析目标。

下面显示了用于执行控制传输的SETUP数据包的格式。

1.png

SETUP数据包的格式

SETUP数据包的长度为8个字节,可根据请求类型获得不同类型的数据。其中,有些请求对于所有设备都是通用的(例如,GET DEsc riptOR);其他请求则取决于设备类别和制造商的许可。要发送或接收的数据长度通过SETUP数据包中提供的16位字记录。

1.png

标准请求和特殊请求的示例

总而言之:控制传输使用了一个非常简单的协议,所有USB设备都必须支持该协议。它可以提供很多额外的请求,同时,我们可以控制数据的大小。所有这一切都使得控制转移成为模糊测试和发送假信号的完美目标。

利用方法

要破解这款假冒游戏手柄,我们无需对它进行模糊测试,因为我在考察Gator Claw的代码时发现了一些漏洞。

1.png

HID类请求处理程序中存在漏洞的相关代码

函数HID_ClassRequest()用于模拟原始DualShock 4手柄的工作,并实现与PS4一起工作所需的最少请求。USBD_GetSetupPacket()函数用于获取SETUP数据包,根据报告的类型,它或者使用函数USBD_PrepareCntrlIn()发送数据,要么使用函数USBD_PrepareCntrlOut接收数据。这个函数不会检查所请求数据的长度,因此,我们可以读取固件所在的部分内部闪存,也可以读取和写入SRAM存储器的开头部分。

1.png

控制传输期间的缓冲区溢出

DATA数据包的大小是在USB设备描述符中定义的(也随控制传输一起接收),但容易被忽略的是,这个大小定义的是单个数据包的长度,并且,由于可能存在许多数据包,其长度具体取决于SETUP数据包中的设置。

值得注意的是,Nuvoton站点上提供的示例代码也没有检查长度,这可能导致所有使用这些代码作为参考的产品中都存在类似的安全漏洞。

1.png

SRAM存储器缓冲区溢出漏洞的利用

静态随机存取存储器(StaticRandom Access MemorySRAM)是一种供堆栈使用的存储器。SRAM通常也是可执行存储器(这是可配置的)。通常的做法是,将经常调用的代码片段(例如,实时操作系统)复制到SRAM,以提高系统的性能。我们虽然无法保证缓冲区溢出能够到达堆栈顶部,但发生这种情况的几率仍然很高。

令人惊讶的是,利用USB固件的主要障碍是操作系统。下面是我在使用Windows系统时观察到的情况,但我认为大部分同样适用于没有打相应补丁的Linux系统。

首先,操作系统不允许在控制传输期间读取超过4KB的内容。其次,根据我的经验,操作系统不允许在控制传输期间写入一个以上的DATA数据包。第三,USB设备可能具有隐藏的请求,并且所有使用它们的尝试都将被操作系统所阻止。

这很容易通过包括游戏手柄在内的人机界面设备(HID)来进行演示。HID还提供了其他描述符(HID描述符、报告描述符、物理描述符)。报告描述符与其他描述符差别很大,它是由描述受支持报告的不同项所组成得。如果报告描述符中缺少报告,则操作系统将拒绝完成它,即使该报告是由该设备处理的。这提高了在USB设备固件中发现和利用漏洞的难度,实际上,很可能正是这些细微差别,导致过去没有人能够发现相关的漏洞。

为了能够在不必阅读和重新编译Linux内核的源代码的情况下解决这个问题,我只能求助于手头上的低层工具:Arduino Mega BoardUSB Host Shield(总共不到$30)

1.png

连接方案

在利用上述方案连接设备之后,我使用Arduino板来控制传输,这样就不会受到操作系统的任何干扰了。

1.png

Arduino Mega + USB HostShield

假冒的游戏手柄与Gator Claw具有相同的漏洞,所以,首先要做的就是转储相应的固件。

1.png

转储相应的固件

查找固件转储的基址的最简单方法是查找具有指向已知数据的指针的结构。之后,我们就可以提供计算地址的增量来将转储的固件加载到IDA Pro了。

1.png

指向已知数据的指针的结构

通过固件转储,我们可以找到printf()函数的地址,该函数用来输出工厂质量保证所需的UART信息。不仅如此,我还能够在转储中找到hexDump()函数,这意味着连shellcode都不用编写了。

1.png

寻找有助于漏洞利用的函数

在游戏手柄的印刷电路板上定位UART点、焊接导线并将其连接到TTL2USB适配器后,可以在串行终端看到输出内容。

1.png

游戏手柄引导期间的标准UART输出

Nuvoton微控制器的标准库附带了一个非常方便的硬故障异常处理程序,可以输出寄存器转储内容。这对于漏洞利用来说是非常有帮助的,同时,对于调试漏洞利用代码也非常有用。

1.png

堆栈覆盖导致硬故障异常后的UART输出

在下面的屏幕截图中可以看到转储固件的最后一个漏洞。

1.png

用于在UART上转储固件的漏洞利用代码和shellcode

但这种转储固件的方式并不完美,因为NuvotonM451系列微控制器可能有两种不同类型的固件——主固件(APROM)和用于设备固件更新的迷你固件(LDROM)

1.png

闪存和系统存储器在不同模式下的内存映射

APROMLDROM被映射到相同的内存地址,因此,我们只能转储其中的一个。为了获得LDROM固件的转储,我们需要禁用安全锁并使用编程工具来读取闪存。

1.png

禁用安全锁的Shellcode

加密失败

对负责更新的固件(LDROM)进行分析之后发现,它主要是引自Nuvoton的标准代码,同时,还添加了解密固件更新的代码。

1.png

一种用于固件更新解密的密码算法方案

用于解密固件更新的加密算法是一种自定义分组密码。它是在密码块链接模式下执行的,但块大小仅为32位。该算法需要接收一个密钥(产品的文本(ASCII)标识符),以及定义应该对当前块执行什么转换的指令数组。在到达密钥和数组的末尾后,算法会将它们的当前位置设置为初始位置。转换列表涉及六个操作,即异或、减法、减法(反向),剩下的三种操作与之相同,只不过交换了字节。由于固件中包含大量填充了零的区域,因此很容易计算出该算法的秘密部分。

1.png

固件更新的加密密钥

将从假冒游戏手柄的固件中提取的算法应用到在主要OEM制造商的站点上发现的附件的所有固件中,我们发现所有附件使用的都是这种加密算法,并且该算法中的弱点允许我们计算所有设备的加密密钥,从而可以解密它们的固件更新。换言之,假冒产品内部使用的算法导致该制造商开发的所有产品的安全防线全部崩溃。

小结

在本文中,我们为读者详细介绍了分析嵌入式固件的具体方法,通过这些方法,我们可以找到漏洞并利用它们来获取固件转储并在USB设备上执行代码。

虽然对glitching攻击的讨论已经超出了本文的范围,但需要说明的是,这种攻击对USB设备也非常有效。对于那些想深入了解这种攻击方法的读者来说,建议观看这里的视频。对于那些想知道盗版者是如何从DualShock 4获得算法和密钥来制作自己的设备的读者,推荐阅读这篇文章

至于用于保密的辅助微控制器,我发现并非所有设备都会使用它,只有想要提高隐蔽性的设备才会添加它们。但是,该微控制器本身无法保守任何秘密,仅用于SHA1SHA256。这项研究还有助于游戏爱好者创建自己的游戏机方面的开源项目。

至于假冒游戏手柄的买家,他们的处境有些令人担忧,因为制造商可以禁用非法密钥,这时,他们的游戏手柄就没法正常使用了,同时,也无法获得固件更新的相关帮助。

原文地址:https://securelist.com/hacking-microcontroller-firmware-through-a-usb/89919/

最新评论

昵称
邮箱
提交评论