购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.3 固件安全

3.3.1 固件安全概述

固件指设备内部保存的设备驱动程序,是一种特殊的计算机软件,主要为设备特定硬件提供底层控制。通过固件,操作系统按照标准的设备驱动实现特定部件的操作,如光驱、刻录机的盘片转动或读盘片等。在一个系统中,固件是工作在基础层(或称底层)的软件;而在硬件设备中,固件决定着硬件设备的功能及性能,是硬件设备的灵魂。

固件安全威胁主要在于固件代码存在很多安全漏洞,这些漏洞可以被攻击者恶意利用,进而获取智能设备的权限并控制设备,给系统造成危害。

近几年来,越来越多的安全研究人员关注嵌入式(硬件)设备安全漏洞。安全研究人员通过对固件代码逻辑进行逆向分析,挖掘并验证漏洞。固件逆向分析过程如图3-40所示。

图3-40 固件逆向分析过程

3.3.2 固件分类

物联网设备生产需求、硬件性能存在差异,导致固件类型不同。固件大致可以分为以下几类。

1.通用操作系统设备

通用操作系统设备,如智能路由器、智能摄像头等,大多使用基于Linux内核、UNIX文件系统的操作系统,libc库一般使用精简版本的函数库。这类固件一般具有完整的符号表,逆向难度相对较小。

2.实时操作系统设备

实时操作系统主要包括VxWorks、FreeRTOS等。许多路由器厂商将VxWorks作为固件文件系统,如TP-LINK、DrayTek Vigor等路由器固件。

3.无操作系统/裸机设备

无操作系统/裸机设备,如智能门锁等,以“单片机设备”为主,功能较为单一,只能进行比较简单的控制、循环等操作。它们利用中断、例程来处理外部各种事件。无操作系统/裸机设备的能耗较低,资源管理较为高效,适合长时间续航。这类固件的代码通常将内核、用户程序静态编译到一起,对于库函数没有相应的符号名称。

轻量级物联网设备与通用操作系统设备的特征对比如表3-1所示。

表3-1 轻量级物联网设备与通用操作系统设备的特征对比

3.3.3 固件组成

这里主要介绍嵌入式设备固件,此类固件由头部分和数据部分组成。头部分存储了与整个固件相关的信息,如固件版本、固件大小、校验等;数据部分包含了引导程序(BootLoader)、内核(Kernel)(可压缩)、根文件系统(RootFs)(可压缩)、配置文件等,如图3-41所示。

图3-41 嵌入式设备固件组成

固件文件格式分析是固件逆向的前提,常见的固件文件格式包括bin、usr、rfu等。

1.固件头

固件头是一个可选的部分。在一般情况下,分析头部分的数据就能知道整个固件文件的结构。常见的固件头格式包括trx Header、DLOB Header、ZyNOS Header、IMG0(VxWorks)Header、TP-LINK Header、Realtek Header等。

例如,trx文件的开头是28字节的头部分,其余为数据部分。magic字段用于存放魔数,即固件头的特征标识。len字段记录了整个固件文件的长度。CRC32字段用于存放数据部分的CRC32校验码。flag_version字段用于存放固件标识和版本信息(0~15位为固件标识,16~31位为版本信息)。offsets数组用于存放内核、文件系统等各个部分在固件文件中的偏移值。

2.引导程序

常见的引导程序有U-boot、Superboot和Little Kernel等。

U-boot是常见的开源引导程序,常用于ARM、MIPS等平台,支持Monitor功能;Superboot引导程序不开源,“友善之臂”的tiny210代码中默认使用它;Little Kernel常用于高通公司的平台设备,支持Monitor功能。

3.内核

常见的内核包括Linux、VxWorks和WinCE等。

Linux内核镜像格式主要有zImage和uImage。其中,zImage文件是ARM Linux常用的一种压缩镜像文件,是vmlinux经过gzip命令压缩后的文件。zImage文件在下载后,可以直接使用go命令进行跳转,直接解压并启动内核,但无法挂载文件系统。

uImage文件是使用mkimage工具处理zImage文件生成的,是U-boot专用的镜像文件。通过在zImage文件之前加上一个长度为64字节的文件头,来说明这个镜像文件的类型、加载位置、生成时间、大小等信息。

4.根文件系统

固件中常见的嵌入式文件系统有JFFS2、YAFFS、CRAMFS、SquashFS和UBI/UBIFS。

JFFS2是一种日志文件系统,基于MTD驱动层,能在设备不正常断电的情况下保持数据的完整性。

YAFFS(Yet Another Flash File System),是由Aleph One开发的NAND Flash嵌入式文件系统,是一种类日志文件系统,可以在意外断电重启后恢复数据记录。

CRAMFS是一种专门针对闪存设计的只读压缩文件系统,根据目前读取文件的进度与位置,动态地将数据解压缩到内存中。CRAMFS中不会保存文件的时间戳信息。

SquashFS是一种基于Linux内核、使用压缩技术的只读文件系统。该文件系统能压缩系统内的文档、inode及目录,通常采用zlib和lzma数据压缩算法。SquashFS的压缩比例较高。其数据、inode及目录都是经过压缩的,并且可以支持大端(Big-Endian)和小端(Little-Endian)两种格式,以便开发人员根据硬件特征进行选择。

UBI/UBIFS是基于UBI的Flash日志文件系统,是一种性能卓越、扩展性高的Flash专用文件系统。UBI的逻辑卷管理层类似于LVM的逻辑卷管理层,主要用于实现损益均衡,以及逻辑擦除块、卷管理和坏块管理等功能。

3.3.4 固件存储方式

在嵌入式设备的PCB板上,固件存储方式一般有两种,即集成式存储和分离式存储。在集成式存储时,固件存储在MCU上;在分离式存储时,固件独立存储在ROM(Read-Only Memory,只读存储器)中,如图3-42和图3-43所示。

图3-42 集成式存储固件的存储位置

图3-43 分离式存储固件的存储位置

固件存储芯片经历了数代,存储技术不断完善。当前,常用的固件存储芯片有EEPROM(Electrically Erasable Programmable ROM,电擦除可编程只读存储器)、eMMC Flash、NOR Flash、UFS 2.0/3.0等。

1.ROM发展历史

在PC个人计算机发展初期,BIOS(Basic Input Output System,基本输入输出系统)都存放在ROM中。ROM中的资料是在ROM制造工序中通过特殊方法烧写的,内容只能读不可改写。资料一旦被烧写进去,用户只能验证是否正确,无法进行修改。ROM的生产成本比较高,一般只用于大批量的应用场合。ROM样例如图3-44所示。

由于ROM编程难度高且烧制困难,也无法修改或升级,因此后来发明了PROM(Programmable ROM,可编程只读存储器)。用户可以自行使用专用编程器烧写自己的程序或数据,但只可以写入一次并且写入后无法修改。虽然PROM与ROM的特性相似,但是PROM的成本更高,烧写速度更慢,一般只适用于少量需求的场合。PROM样例如图3-45所示。

图3-44 ROM样例

图3-45 PROM样例

EPROM通过可擦除和重写的技术解决了PROM只能写入一次的弊端。EPROM可以通过紫外线照射正面陶瓷封装的玻璃窗口来擦除芯片内部数据,且仅使用专用编程器即可烧写程序。EPROM样例如图3-46所示。

鉴于EPROM操作的不便,之后大多采用EEPROM。EEPROM不需要借助其他设备即可使用电子信号来擦除芯片内容,且以Byte为最小修改单位。因为EEPROM不必擦除全部数据,所以EEPROM彻底摆脱了EPROM擦除及编程器的束缚。EEPROM基于传输协议可以分为IICEEPROM和SPIEEPROM两种。EEPROM样例如图3-47所示。

图3-46 EPROM样例

图3-47 EEPROM样例

2.Flash发展历史

Flash的全称为Flash EEPROM Memory,是一种特殊的EEPROM,集ROM和RAM的优势于一体,不仅具备电可擦除可编程的性能,而且具有快速读取数据的优势,并且存储的数据不会因为断电而丢失。

目前,Flash主要有NOR Flash、NAND Flash和eMMC Flash 3种。其中,eMMC Flash采用统一的MMC标准接口,自身集成MMC Controller。它的存储单元与NAND Flash相同。NOR Flash采用SPI或Parallel接口通信协议,一般而言,Parallel接口型Flash会比SPI接口型Flash的读写速度更快,支持容量更大。Flash样例如图3-48所示。

图3-48 Flash样例

3.UFS发展历史

UFS(Universal Flash Storage,通用闪存存储)是一种于2011年推出的存储规范,同时也是数码相机、智能手机等电子产品领域经常使用的闪存存储规范,被视为嵌入式多媒体存储卡和SD卡的替代者。它使用MIPI联盟开发的M-PHY物理层技术,实现了全双工的LVDS串口。

UFS与嵌入式多媒体存储卡的最大不同在于,UFS改用了更为先进的串行信号,提升了频率,同时变半双工为全双工,并且UFS是基于小型计算机系统接口结构模型的设计模式。 QEHshc6zLrVdlS1sDGaTvcLECFNsLf3+d8yCRoIK0HhGRkcekp5PvShWvHqftdTK

点击中间区域
呼出菜单
上一章
目录
下一章
×