APP下载

工控设备固件提取技术综述

2021-03-22林晔篁刘蕾蕾杜伟彭纬伟金先涛胡璇

电子产品可靠性与环境试验 2021年1期
关键词:固件工控二进制

林晔篁 , 刘蕾蕾 , 杜伟 , 彭纬伟 , 金先涛, 胡璇

(1.中国南方电网调峰调频发电有限公司检修试验分公司, 广东 广州 510610;2.中国南方电网调峰调频发电公司, 广东 广州 510635 3.工业和信息化部电子第五研究所, 广东 广州 510610)

0 引言

自2010 年以来, ICS 安全问题频频出现, 对工控系统造成了极其严重的影响,其攻击普遍借助伪造通信手段为出发点,例如: 震网病毒[2]通过伪造签名并突破工业局域网的限制, 通过更改变频器参数使得离心机无法正常工作; Duqu 病毒[3]借助通信机制传播恶意代码, 并控制其大面积隐蔽感染其他计算机; Havex 病毒[4]利用OPC DA 协议来收集网络和联网设备的信息并将其反馈到C&C 服务器的手段, 通过植入木马等方式感染监测控制和数据采集 (SCADA: Supervisory Control and Data Acquisition) 系统及使用的工业控制软件等。

在备受瞩目的Stuxnet 病毒爆发前, 有关ICS安全的大多数研究工作主要集中在人机界面(HMI) 和其他SCADA 软件上, 而对这些嵌入式系统方面所做的分析相对较少。 尽管有许多成熟的工具和技术可用于分析商用个人计算机(PC) 上的软件, 但我们对嵌入式设备中的漏洞只有一个较浅的了解, 并且很少有用于分析它们的工具。 最近在嵌入式设备上进行的许多安全工作已经发现了严重的安全漏洞, 例如: 从固件映像中提取的硬编码密码, 未经身份验证的固件上载, 启用了多个未经身份验证的接口和弱密码散列。 我们相信, 这些发现将在更多的设备上得到重复, 并且未来的安全研究将在深入研究固件和硬件上实现。

固件逆向工程理论按其工作流程可以分为代码提取、 指令归一化、 代码还原、 逆向分析和验证测试等5 个部分。 在本文中, 我们描述了工控设备固件提取的特点, 分析了固件提取的重难点,最后对工程上的工控设备固件提取方法进行了归纳。

1 固件逆向工程

固件逆向工程是以固件程序或其他具有固件程序结构特征的二进制程序为研究对象的二进制逆向工程, 其主要任务是获取固件程序、 生成对应的源代码、 系统结构和相关设计原理及算法的文档, 是软件逆向工程的一个重要分支。 固件逆向工程按其研究的内容可以分为固件逆向工程理论和辅助固件逆向工程两个部分, 如图1 所示。

图1 软件逆向工程的分支

固件逆向工程理论按其工作流程可以分为代码提取、 指令归一化、 代码还原、 逆向分析和验证测试等5 个部分。 本文主要关注代码提取方面。

个性化心理护理在输尿管软镜肾结石钬激光碎石患者中的应用 …………………………………………王亚红(80)

2 工控设备固件特点及其脆弱性分析

固件逆向工程作为软件逆向工程的一个重要分支并与其他分支相互区别, 是因为其特殊的研究对象即固件代码与其他软件实体相比具有不同的特点。 固件是指存储于非易失存储器(如ROM/PROM/FLASH 等, 这些存储芯片在系统掉电后数据不会丢失) 中的二进制程序。 这是根据存在形式方面的特殊性对固件进行的传统定义, 随着超大规模集成电路的发展, 固件中的二进制程序不仅能够以非易失存储器件为载体, 还能够存储于微控制器、 SOC 等具有非易失存储能力的器件中。这些器件中的二进制程序也是固件逆向工程研究的对象。 因此, 固件逆向工程研究的固件是指存储于具有非易失存储功能的器件中的二进制程序,这些器件包括传统的固件存储器以及具有内部存储器的微控制器、 SOC/SOPC 和FPGA/CPLD 等。

固件中存储的代码程序是一类可以直接运行的二进制程序, 通常用于嵌入式系统。 固件代码与通用PC 机中的可执行代码相比, 在设计思想、存在形式、 应用领域和代码组织等方面存在许多重要的差异, 主要表现为以下几个方面。

2.1 设计思想方面

固件程序的设计一般以结构化设计思想为主。结构化程序设计理论形成于20 世纪60 年代早期,并由Dijktra 最终提出[5]。 虽然面向对象和面向方面的程序设计正逐步地取代结构化程序设计思想并主导着桌面及网络应用程序的开发, 但是在嵌入式系统领域, 结构化程序设计思想依然指导着嵌入式程序员开发出各式各样的固件程序, 而这些根据结构化程序设计理念开发出来的、 存在于嵌入式系统中的代码正是固件逆向工程的主要研究对象。 固件的这一特点决定了结构化设计、 分析和验证的方法与理论是固件代码逆向工程的重要理论工具, 同时也使得固件逆向工程的研究内容有别于结构化二进制逆向工程。

2.2 存在形式方面

固件代码存在于嵌入式系统的存储设备中,这给固件逆向工程带来两个方面的影响: 1) 固件代码的获取相对困难, 这些存储设备大多使用了读写保护、 自毁和口令验证, 数据加密等安全机制, 这使得固件代码的获取变得相对困难, 需要专门的提取技术和硬件设备, 固件代码获取技术的研究和相关设备的开发是固件逆向工程中的一个重要组成部分; 2) 固件代码的测试需要硬件支持, 验证固件逆向分析的结果必须将固件置于一个真实的硬件环境中, 与固件代码的获取一样,需要专门的硬件设备, 如下载线、 编程器、 仿真器和运行固件代码的嵌入式系统。

2.3 应用领域方面

由于嵌入式处理器千差万别, 品种数量已经超过1 000 多种, 体系结构已经超过30 多个[4],应用更是遍及家用、 航天、 制造、 医疗和通信等诸多领域。 与嵌入式处理器相连的外部设备往往随着应用的不同而变化, 处理器内部也难以有稳定的硬件配置。 与通用小型计算机系统相比, 嵌入式处理器的外部设备更富于变化, 这种不稳定的硬件配置为固件逆向工程带来了以下3 个方面的困难。

a) 增加了虚拟硬件平台和其他辅助逆向工具开发的困难

软件逆向研究人员很难设计出一个面向所有固件的通用逆向分析工具。 虚拟硬件平台的设计是固件代码辅助逆向工程的一项重要研究内容,能够使固件程序在一个可控的虚拟环境中运行,实时地观测其运行时的动态效果, 将大大地提高固件代码逆向分析的效率。 与具有稳定硬件配置的通用计算机不同, 嵌入式设备的硬件配置随着应用领域的变化而不断地改变, 嵌入式系统这种硬件配置上的多样化和动态性, 使得开发出一个类似于PC 虚拟软件VMware 这样的虚拟硬件平台变得相对困难。

b) 加大了逆向分析工作的难度

对固件代码的正确分析必须了解与之相关的各类硬件设备。 对一个嵌入式设备中的固件程序进行逆向分析, 必须首先了解嵌入式设备的硬件连接、 外部设备、 处理器结构和汇编指令集等。不同的嵌入式设备往往具有不相同的硬件连接关系、 功能各异的外部设备、 不同体系结构的微控制器和风格迥异的汇编指令集。 这些繁重的准备工作明显地增加了逆向分析人员的工作负担, 加大了逆向分析工作的难度。

c) 限制了某些逆向分析策略的应用

因为应用领域广泛的特点而引起的硬件配置上的多样化和动态性同时也限制了某些逆向分析策略的应用。 例如: 由于嵌入式系统硬件配置的不稳定, 并且资源相对有限, 我们往往难以在其中嵌入一个通用动态分析软件(类似于PC 上的Soft ICE) 来实时地观测设备的动态运行情况, 虽然各类仿真器、 JTAG 调试器可以完成类似的功能, 但需要硬件设备的辅助, 缺乏灵活性, 而且也只能观测处理器和部分芯片的状态, 不能获取整个系统的运行情况; 另外, 因为目前尚没有一个通用虚拟硬件平台来模拟固件的执行, 所以代码的动态分析技术难以用于固件的逆向分析[4]。

2.4 代码组织方面

固件代码在代码组织方面表现为如下特点。

a) 不包含结构信息

在冯·诺伊曼机器中, 内存里的数据和指令均以同样的二进制形式存储。 这意味着, 只有当一个给定字节从内存被读出放入一个寄存器作为数据或指令使用的时候, 我们才知道它是数据还是指令。 即使是在分段的体系结构上, 其中数据段里只有数据信息、 代码段只有指令, 数据仍然能够以表的形式被储存在一个代码段中, 指令同样也能够以数据的形式被储存然后通过解释这些指令而运行[6]。 在结构化二进制程序中, 指令和数据的区分部分依赖于规范的文件格式, 而固件程序中只包含数据和指令, 没有任何关于程序的入口地址、 函数的开始地址、 代码和数据空间的位置大小和分布情况的任何信息, 与有着规范文件格式的结构化二进制程序相比, 固件代码能够提供给逆向分析人员的信息十分有限, 其逆向分析的难度相对较大。

b) 混合编码模式

混合编码模式是固件程序的另一个重要特点,编码模式是关于机器指令的一系列编码规范的总称, 编码模式指出了指令中操作数的默认大小,提供了指令如何解析的信息, 通常的编码模式包括8 、 16 、 32 位和现在的64 位编码, 编码的位数指定了指令中操作数的默认大小, 例如: DOS是16 位操作系统, 所以CPU 在16 位环境下执行它的代码。 同时编码模式还指定了指令的长度,例如: ARM 处理器32 位模式(ARM 模式), 指令长度为4B, 而16 位模式(Thumb 模式) 下指令长度为2B。 混合编码在固件代码中极为常见,I386 机器BIOS 程序中经常出现实模式和虚拟模式相互切换的情况, 而ARM 的BOOTLOADER 程序里也有ARM 模式和Thumb 模式的混合编码的情况, 混合编码模式将影响控制流恢复的正确性,增加控制流恢复算法的复杂性。

c) 硬件相关性

固件代码与硬件紧密关联, 是直接与硬件交互的程序, 固件中的大部分指令都在访问硬件设备, 上层应用程序的资源可以表现为文件的形式,而固件程序的资源则表现为IO 端口。 对固件代码的逆向分析需要与硬件相关的信息, 对固件的安全检测也是通过硬件资源的访问控制来实现的[7]。固件代码具有很强的硬件相关性。

由于固件代码在设计思想、 存在形式、 代码组织和应用领域等方面的特殊性, 使得固件逆向工程与其他软件逆向工程相区别并获得了独立的发展。

3 工控设备固件提取的重点与难点

工控设备固件的提取存在特殊性, 很难直接使用传统方法来获取固件, 部分原因在于较为封闭的工控环境中处理器架构未知、 存储设备未知和内存通信方式多样等一系列的因素, 对于工控固件的提取来说, 这是不可避免的阻碍条件。 但就工控设备的固件提取而言, 重点和难点主要在于专用工具稀缺、 工控设备种类繁多、 固件解密困难和固件结构未知4 个方面。

首先, 就专用工具而言, 尽管有许多成熟的工具和技术可用于分析商用个人计算机(PC) 上的软件, 但对于工控设备的固件提取与修复而言,很少有相应的专用工具。 不仅每次固件提取时,都需要开发想用工具, 而且不同工控设备使用的工具不能通用, 增加了固件提取的成本和难度,大大地降低了固件提取的效率。

其次, 工控设备的种类繁多, 也是工控设备固件提取的难点之一。 从可编程芯片方面分类,工控设备固件包含以下几类: FPGA 固件、 SOC 内部固件和外挂FLASH 固件。 每类固件的提取方法完全不同, 而且每种架构芯片包含多个厂家, 每个厂家之间的提取方法也不通用。 例如: PowerPC处理器、 AVR 处理器、 PIC 处理器、 ARM 处理器和MIPS 处理器等SOC, 它们对应的应用场景不同, 固件提取的方法也不同。 从工控设备用途来分 类, 工 控 设 备 包 含: PLC、 RTU、 HMI 和SCADA 等4 类设备, 每类设备的固件规模、 固件格式和提取场景均不相同。 PLC 和RTU 设备是典型的嵌入式设备, 而HMI、 SCADA 设备可能包含通用操作系统映像。

另一方面, 固件解密非常困难。 对某些处理器, 采用内置ROM 存储固件, 自带加密和解密算法, 对原始固件进行加密和解密, 即使提取到固件, 也无法对固件解密; 甚至某些工控设备依据芯片特性, 在出厂后从硬件上配置了禁止固件上载, 导致无法获取固件。 同时, 部分工控设备通过软件实现的方法对固件进行加密和解密, 除非得到密钥, 否则即使得到固件, 也无法修复。

最后, 工控设备固件结构未知, 影响固件的修复。 在二进制逆向工程中, 根据程序的结构特点, 可以将二进制程序分为两类: 1) 结构化二进制程序, 这类程序具有规范的文件格式, 包含了程序动态执行与静态分析相关的程序信息, PE、ELF 等格式的目标代码就是典型的结构化二进制程序; 2) 非结构化二进制程序, 非结构化二进制程序中仅包含数据和指令的序列, 如bin、 hex 格式的芯片内置程序、 51 处理器内部ROM 程序、 ARM处理器的BootLoader 和I386 机器固件芯片中的BIOS 程序等。 非结构化二进制程序多为固件程序,通常也被称作为固件或固件代码。 固件代码因为结构未知, 当从flash 中拷贝整个数据时, 无法从flash 映像中分离出有效数据和无效数据。

4 工程上的工控设备固件提取方法

工程上主要包含9 种工控设备固件提取方法。固件提取分为两个方向: 1) 基于硬件直接提取;2) 基于固件(软件) 本身提取。 具体内容如表1所示。

表1 两类不同固件的提取方法

每种获取固件的方法都会遇到不同的困难。

使用调试(JTAG) 端口连接到设备对某些设备有效, 但是很多时候接口被禁用或使用非标准协议。 从闪存读取固件始终能够获得固件, 但是异常的内存布局可能使重新组装整个固件变得困难。 如果固件来自多个闪存芯片, 则必须重新组装。 由于固件的结构尚不清楚, 因此此过程可能会很复杂。

当通过接口干扰、 定向爆破等技术使其保护机制失效, 然后直接读取芯片数据时, 难点在于如何使存储器的保护机制失效, 只要使芯片失去保护, 即可随意地读取任意位置的数据, 获取完整的固件代码, 如果芯片数据加密, 那么还需要进行数据解密或者解析系统中的加密/解密逻辑电路。 加密逻辑通常存在于靠近处理器或存储器的CPLD/FPGA 芯片中。

当监听总线, 使用数据采集设备(如逻辑分析仪等) 获取系统运行时总线上的数据和地址信息, 恢复出被运行程序的片段时, 需要专门的数据采集设备和数据恢复软件, 对数据采集部件的工作频率要求较高(一般为存储器工作频率的2倍或更高), 恢复出来的数据也难以验证其完整性。 无论是摧毁固件芯片的保护机制还是使用总线监听技术, 其获取的难度将远大于通用PC 机上的可执行文件。

5 结束语

深入地了解工控设备的底层实现机制是很重要的, 因为随着工控系统的互联互通, 他们的功能变得越来越复杂, 对ICS 的攻击往往会降到较低的抽象级别。 虽然电子产品的逆向工程已有很长的历史, 工控设备固件提取和逆向工程并不是一个新的领域, 但是安全社区没有像x86 软件和硬件那样有足够的经验或工具来处理嵌入式设备上的固件提取与安全分析。 工控设备固件提取方面,还需要开发专用的工具和技术, 需要使用工具来识别固件、 嵌入式操作系统和处理器, 并且应开发工具包以进行动态分析或调试。

猜你喜欢

固件工控二进制
用二进制解一道高中数学联赛数论题
有趣的进度
二进制在竞赛题中的应用
工控速派 一个工控技术服务的江湖
工控速浱 一个工控技术服务的江湖
热点追踪 工控安全低调而不失重要
基于固件的远程身份认证
基于攻击图的工控系统脆弱性量化方法
提取ROM固件中的APP
一种通过USB接口的可靠固件升级技术