IoT设备固件分析教程之固件是怎么存储的

IoT设备固件分析教程之固件是怎么存储的_第1张图片

设备固件的安全是构建物联网设备安全的基础环节,它的安全问题将影响到整个系统。在真实的Hacking场景中,我们常常需要提取固件,将其解压缩,以便对操作系统和应用程序进行逆向和安全审计。最近的一个例子,请参阅我们的博客《Hacking
the Virgin Media Super Hub》(https://www.contextis.com/resources/blog/hacking-virgin-media-super-hub/)。这篇文章是《IoT设备固件分析教程》系列文章的第一篇。本文将介绍设备固件的存储位置和存储方式。未来的博客将关注固件的提取和解压方法(包括较经济的,也包括昂贵的方案)。

识别元器件

在介绍哪些元器件可用于存储固件之前,我们首先来讨论一下,如何识别PCB(Printed

Circuit Board,印刷电路板)上的元器件。最明显的信息是芯片上的标签,标签中可能包含了制造商名称、型号和芯片描述。下面几节将介绍不同种类芯片的典型封装,了解封装的特征可以帮助我们猜测芯片的功能。

如果你无法直接查看芯片标签的内容,观察电路的设计方式可以给你提供一些线索。例如,下图展示了西门子PLC(Programmable Logic Controller,可编程逻辑控制器)的PCB。

IoT设备固件分析教程之固件是怎么存储的_第2张图片

在查看芯片手册之前,我们可以进行一下猜测,片上系统(SoC)是右侧这块最大的芯片,中间的芯片是RAM(与SOC之间的接线是弯曲的,这是为了保证所有连线有相同的长度,因为高速RAM需要准确的定时信号),最左边这片是flash(大量平行的连线用于传输并行的数据信号)。

这是一个很好的例子,说明了通过观察芯片的连线和外设,来识别芯片的可能。这种方法,可以帮助我们识别没有标签的未知芯片。当然事实上,上图展示的情形,显然可以直接查看芯片标签的信息,所以它仅仅是一个用于教学的例子J。

上图中,右侧这块芯片可以通过西门子的logo和芯片的零件号来识别,其它两篇芯片上的logo表示它们均由Micron生产。由于空间限制,Micron没有标注芯片的零件号,而使用了空间占用较小的FBGA标记。幸运的是,Micron提供了一个在线解码器(https://www.micron.com/support/tools-and-utilities/fbga)来获得完整的零件号,它显示左边的芯片是ECC

NAND Flash(MT29F1G16ABBDAHC),中间的芯片是512MB SDRAM(MT46H16M32LFB5-6)。

固件的存储位置

一块PCB上,可能有很多地方可以用于存储固件,事实上,在某些设备中,固件确实被存储在多个位置。假如我们有能力找出并识别电路板上的存储芯片,那么下一步,我们需要了解这些存储芯片可以被分为哪些不同类型,以及它们各自常见的用途。

NOR Flash/EEPROM

我们讨论低密度存储设备时,术语NOR Flash和EEPROM通常可以互换使用,它们可以单独封装也可以集成在片上系统中。有许多介绍不同类型Flash存储器之间区别的资料,这里不做过多的介绍,只强调一下,NOR Flash/EEPROM最重要的优点在于它们是字节可寻址的(译者注:原文还提到字节可擦除,似乎有误)。这意味着,你可以直接从NOR Flash/EEPROM执行代码,一次一条指令(eXecute in Place or XiP)。这使得NORE Flash非常适合存储低级别的程序,例如启动代码。因为,它不需要任何驱动程序或Flash控制器来读取它存储的内容。

IoT设备固件分析教程之固件是怎么存储的_第3张图片

NOR Flash通常有串行和并行两种类型。串行NOR Flash通常采用小型封装,例如SOIC-8,看起来如上图所示。

其它常见的封装格式还有WSON(芯片的封装类型常常使用首字母缩写,这里指:Very

Very thin Small Outline No lead package)、DIP-8、SOIC-16和BGA-24(译者注:关于芯片封装,可以参考维基百科,https://en.wikipedia.org/wik/List_of_integrated_circuit_packaging_types)。这些小型芯片可以通过SPI或I2C等串行协议进行访问,通常用于存储少量数据,例如SoHo路由器上的系统设置。

大容量NOR通常采用更大的、具有并行数据线(用于提速)的封装。 这些器件更有可能采用48或56引脚的薄型小外形封装(TSOP,Thin Small Outline Package),比如下图所示的Spansion芯片。

IoT设备固件分析教程之固件是怎么存储的_第4张图片

这种大型的芯片,沿用我们之前举得例子,可以用于存储SoHo路由器的整个文件系统。

NAND Flash

尽管NOR Flash非常适合少量数据的存储,然而较大数据量的存储通常会使用NAND

Flash。NAND Flash是块寻址(你每次以块为单位读取数据)的,并且写入速度比NOR Flash快得多,但读取速度比NOR Flash慢。由于NAND不是字节寻址的,因此不能直接执行代码,在程序运行前,需要将程序代码拷贝到其它地方(通常是RAM)。

NAND Flash的接口比NOR Flash更复杂,并且通常通过并行接口访问。因此,当你想从NAND Flash访问固件时,你可能需要使用独立的芯片读取器读取或写入内容。

NAND Flash通常使用TSOP(Thin Small-Outline Package ,一般为48或56引脚)或球栅阵列(BGA,Ball Grid Array)封装。当我们为了提取固件,想将NAND Flash从PCB上取下来时,这些封装形式比具有引线的封装更具挑战性。有时为了减少PCB的大小,NAND Flash可以与RAM一起包含在多芯片封装(MCP,Multi-Chip Package)中。

Managed NAND

对NOR Flash和NAND Flash的操作有一些限制(比如Flash的擦写有使用寿命,反复擦写同一位置将很快将使用寿命耗尽),因此对它们的操作需要额外的管理,来实现纠错、擦写均衡、性能优化以及物理存储到逻辑存储的转换。从理论上讲,这种管理功能可以通过硬件实现,比如使用Flash控制器,也可以通过软件,比如在文件系统驱动中实现,或者通过两者的某种结合。需要指出的是,不同制造商生产的Flash芯片通常不能互相替换,因为它们往往有各自的芯片尺寸和引脚规范。

为了解决上述问题,eMMC作为一种解决方案被提出了。eMMC是一种管理NAND存储器的方案,它由同一物理封装内的多媒体卡(MMC,Multi Media Card)控制器和NAND Flash组成。事实上,它们就是封装在芯片中的SD卡。由于eMMC芯片符合JEDEC标准的引脚规范和封装尺寸,因此不同厂商的eMMC芯片可以互换。因此eMMC在工业界大受欢迎,设备制造商们可以灵活的改变芯片供应商,而无需重新设计任何东西。

上文展示的那张NAND Flash照片是来自金士顿(Kingston)的,采用BGA芯片封装的eMMC芯片KE4CN3H5A(你可以在这里查找有关这张芯片的详细信息:https://www.kingston.com/en/embedded/emmc)。这张照片是我们在研究一台基于Android的电话会议设备时拍摄的。

对于IoT Hacker而言,eMMC最赞的一点是,你只需要三个连接就可以与eMMC芯片的接口进行通信:data0、clock和command。另外,eMMC芯片一般都有符合JEDEC标准的引脚。正如最近的Blackhat演讲者展示的那样,如果你可以在PCB上找到这三个信号,那么你就无需把Flash芯片取下来,直接在电路中提取存储在芯片中的内容。

更多关于固件提取这个主题的内容,我们将在后续的博客中介绍。

Universal Flash Storage(UFS)

我们最近试图修复一台三星Galaxy S6(GT-i920F),在服务手册中找到了一些信息,提到它使用了三星KLUBG4G1BD闪存芯片。事实证明,这种芯片是一块通用闪存(UFS

2.0)芯片。UFS是eMMC的继任者。它设计了新的物理接口,提供比eMMC更快的速度。如果想深入了解UFS和eMMC相比有哪些差异,你可以阅读一下这篇Anandtech的文章(http://www.anandtech.com/show/9146/the-samsung-galaxy-s6-and-s6-edge-review/7)。

Mix Storage Types

上文介绍了Flash存储介质的不同类型和它们各自的特点。通常,一台设备会使用一种或多种类型的存储器,用于存储不同类型的数据。我们继续SoHo路由器的示例,下图显示了如何在单个设备上使用多个不同的存储位置,以及它们在通用的启动引导过程中各自的加载顺序。在这个例子中,有三个不同的存储位置用于存储主引导加载程序(PBL,Primary Boot Loader),包括辅助引导加载程序(the Secondary Bootloader),程序代码(Program Code)和系统设置(the System Setting)。


IoT设备固件分析教程之固件是怎么存储的_第5张图片

本文由看雪翻译小组 ljcnaix 编译,来源Scott Lester & Steven@contextis 转载请注明来自看雪社区

你可能感兴趣的:(IoT设备固件分析教程之固件是怎么存储的)