中文译名: 作者:张弛 单位:计算机软件新技术国家重点实验室 (南京大学) 国家: #中国 年份: #2021年 来源: #信息安全学报 关键字: #综述 #嵌入式 笔记建立时间: 2023-02-02 : 21:12
摘要
- 归纳典型物联网固件实现缺陷类型、产生机理
- 评价静态分析、符号执行、模糊测试、程序验证、基于机器学习的方法
引言
- IEEE 标准 12207-2008 将固件定义为“硬件设备和以只读软件形式存储于硬件设备中的计算机指令和数据的结合”。
- 固件分为三类
- 单片固件, 通常采取单个二进制镜像的形式, 无需底层操作系统, 直接基于底层硬件驱动完成所有功能, 或者只包含部分系统的库;
- 基于 Linux 的固件, 以 Linux 作为底层的系统, 基于 Linux 进行开发;
- 基于 RTOS 的固件。RTOS (real-time operating system) 是指实时处理数据、没有缓冲延迟的操作系统。
- 固件中存在缺陷是造成物联网设备遭受安全攻击的根本原因之一。
- 挑战:
- 无法获取源码且代码类型复杂
- 不同类型的固件差别较大
- 测试用例难以构建
- 依赖资源及技术不足
固件缺陷及其机理分析
固件中的缺陷可以分为实现缺陷、配置缺陷和定制缺陷。
实现缺陷
- 内存损坏类缺陷:内存损坏类缺陷指不正确的内存访问导致堆、栈内存发生错误。
- 命令注入缺陷:命令注入缺陷指由于缺少对用户输入进行完备的检查导致恶意用户可以通过构造输入来运行非预期的命令。
- 程序逻辑缺陷:程序逻辑缺陷是指程序不严谨的逻辑所留下的缺陷, 使软件无法正常运行或给了不法分子可乘之机。
- 并发问题缺陷:并发问题缺陷指对多线程运行的固件设计不合理导致固件运行时产生数据竞争、死锁等行为。
配置缺陷
固件上的配置缺陷目前学术界研究缺失, 但大型软件系统和云系统中都有较多研究, 这些研究对固件配置缺陷检测或许会有启发。
- 功能配置参数缺陷
- 性能配置参数缺陷:这类缺陷通常不会直接引起系统挂起、崩溃等异常行为, 但是无法提供系统预期的性能, 无法满足用户的需求
- 权限配置参数缺陷
- 定制缺陷 ^6e21ca
固件安全缺陷检测技术
目前主流的自动化缺陷检测技术可以分为五类, 分别是静态分析、符号执行、模糊测试、程序验证、机器学习.
静态分析
- PIE 总结了固件通信协议代码的特征,借助机器学习算法高效识别未知固件的通信协议代码块
- DTaint 通过污点分析初步解决了静态分析技术扩展性差的问题
- 单纯的静态分析无法获取准确的污点传播情况, 容易造成大量的误报, 可扩展性较差。Saluki 通过 “运行”代码片段来提高污点分析的精度
- KARONTE 在对固件进行分析时考虑了固件不同组件之间的交互和数据流动, 大大降低了污点分析的误报。
符号执行
特定架构的分析
- Davidson 等人[49] 提出了基于符号执行引擎 KLEE 的符号执行工具 FIE, 实现了对基于 MSP430 系列微控制器的固件程序有效缺陷检测。
- Hernandez 等人[50] 基于 FIE, 通过加入对 Intel 8051 MCU 的支持, 实现了针对 USB 固件的符号执行分析框架 FirmUSB
特定缺陷的分析
- Oleksandr 等人[51]提出一种基于 KLEE 的符号执行工具, 用来分析 BIOS 中 SMM 中断处理程序的危险内存引用。
- Ya n 等人[52]提出利用符号执行技术来查找二进制固件中身份验证绕过缺陷, 并实现了分析框架 Firmalice。
通用分析框架
- 为了支持更多固件代码的处理, Corteggiani 等人[53]基于 KLEE 开发了针对固件代码的符号执行框架 Inception, 此工作一定程度上消除了平台的差异。
符号执行需要解决的痛点在于需要源码,如何实现直接以二进制固件作为输入进行分析。
模糊测试
按照固件运行的环境, 现有模糊测试技术可以分为基于真实设备以及基于模拟执行环境的模糊测试。
基于真实设备环境的模糊测试
- Sara 等人[28]提出了一种运行时验证工具来检测 FreeRTOS 中的并发缺陷。基于运行日志来进行分析
- RPFuzzer[56]是一个用于检测路由协议缺陷的框架, 通过向真实设备发送大量数据包, 监控 CPU 使用与查看系统日志, 进而检测设备重启与拒绝服务漏洞
- IoTFuzzer[57]基于移动应用程序与真实终端设备开发了一个检测固件程序中内存损坏缺陷的黑盒模糊测试工具。
下面几个是针对配置缺陷的
- Yu a n 等人[59]提出一个不需要源代码的在线黑盒测试工具 CODE 来对使用最为频繁的配置进行缺陷检测。
- Su 和 Attariyan 等人[60]通过在 Linux 内核级对与配置相关的动作的输入和输出进行跟踪, 推断出配置错误发生的因果关系, 并实现了工具 AutoBash。
- Attariyan 等人[61]通过对二进制文件进行插桩, 在程序运行时通过控制流和数据流获取依赖关系, 通过依赖关系将异常行为定位到特定的配置项中, 实现了名为 ConfAid 的动态配置缺陷检测工具。
- Zhang 等人[62]提出了一个静态分析和动态分析相结合来诊断单个配置缺陷的工具 ConfDiagnoser。
基于模拟执行环境的模糊测试
对基于 linux 的固件:
- Zaddach 等人[63]提出了一个框架 Avatar, 通过将仿真器的执行与实际硬件协调在一起, 实现了对嵌入式设备的复杂动态分析。
- Chen 等人[65]实现了第一个对基于 Linux 的商用物联网设备固件在模拟器中进行仿真、自动化分析的系统 FIRMADYNE, 此工作可以仿真 Linux 系统, 并完全脱离硬件进行仿真。
- Firm-AFL[66]基于 FIRMADYNE 实现了对基于 Linux 的物联网固件的高性能灰盒模糊测试, 这是第一个针对固件的灰盒模糊测试系统, 而且提高了固件模拟执行的效率。
对于处理外设输入:
- P2IM 基于外设接口抽象建模,但是无法处理固件对内存的直接访问
- DICE 通过识别固件中的 DMA 输入输出通道并动态创建缓冲区来解决固件对内存的直接访问
- Laelaps 使用符号执行来生成外设输入
- 以上的解决方案支持的外设类型和输入输出类型有限
- HALucinatior 通过替换固件硬件抽象层使其不依赖于具体硬件。
PCHECK 是针对配置缺陷的模糊测试软件
模糊测试的痛点在于不能完美的托管固件——没有完美的模拟器,未来研究通过其他方法来弥补模拟器的不足——打补丁。
程序验证技术
程序验证技术是指以数学和逻辑为基础, 对系统进行说明、设计和验证, 通过形式规约来描述系统的行为或者系统应该满足的性质, 采用形式化验证来验证系统是否满足需求和具备这些性质, 即是否满足规约 不感兴趣,不看。
基于机器学习的方法
现有的基于机器学习的方法大多通过静态分析或者动态执行来提取程序特征, 使用一些机器学习算法来学习已有的缺陷特征, 并在程序中查找已知缺陷。
上下文无关的函数匹配
- Feng 等人[79]提出一个基于控制流程图 (CFG) 的缺陷搜索引擎 Genius。创新在于将 CFG 转化成了数字特征向量,降低了匹配的开销。
- 在之后的研究中 Feng 等人[80]还提出了一种基于从原始二进制码中提取的条件公式作为高级语义特征进行代码搜索的方法, 并根据此实现了工具 XMATCH。
- Xu 等人[81]对神经网络进行了修改, 使其可以将从固件中提取的属性控制流图 (attributed control flow graph, ACFG) 转化为数字特征向量- 嵌入向量 (embedding vectors), 这一方法大大缩减了嵌入向量的生成时间和模型的训练时间。
- Gao 等人[82]提出了基于语义学习的代码相似性计算工具 VulSeeker,作者从固件中提取标记了的语义流图 (Labeled Semantic Flow Graph, LSFG), 该图同时包含数据流图和控制流图, 将图中的边标记为 0 和 1 分别来表示控制流和数据流, 作者使用从 LSFG 中提取的基本块特征作为数字向量, 以此数字向量为输入通过语义感知的 DNN 模型计算, 得出函数的嵌入向量, 通过计算两个函数的嵌入向量的余弦距离来计算相似性。
上下文敏感的函数匹配
上下文无关的函数匹配难以跨越多个函数进行匹配。
- David 等人[85]提出了基于 Angr 的静态分析工具 FirmUP, 用于程序在过程间层面进行缺陷相似性匹配。
二进制固件文件匹配
- Andrei 等人[86]的工作收集了大量的固件程序, 设计了分布式的架构对其进行解包和简单的静态分析, 并实现了一个引擎来比较和确定数据集中所有对象之间的相似性
- Chen 等人[87]发现固件代码在不同编译环境、优化选项下编译出来的二进制码会包含一些"编译不变性"的字符串,作者利用深度学习来编码可读字符串,对字符串 hash,用 hash 来进行比对和检索,加快了速度。
- Zou 等人[88]通过向物联网设备发送报文来获取物联网设备返回的协议标语信息, 用自然语言处理方法来进行处理, 最后获取设备分类, 以发现是否同有缺陷的设备为同一厂商。(什么鬼)
- 这部分这个文件匹配的思路大概就是用已知漏洞的文件和普通固件文件提取特征进行比对,关键点在于特征提取算法和比对算法能否提高效率。
基于模板的配置缺陷检测
- Zhang 等人[89]从一组给定的配置中利用数据挖掘技术学习配置规则, 以此规则来检测其他配置的正确性, 并实现了自动化测试工具 EnCore。
基于机器学习的方法可以用来检测固件中的已知缺陷, 且可以跨越不同平台进行检测。大多数方法需要基于静态分析得出的结果进行机器学习,因此效果的好坏很大程度上依赖于程序特征的提取和相应的机器学习模型的选择。
如何更好的抽取程序特征和如何对固件程序选取有效的特征和选择高效的匹配方法是这类方法的主要研究问题。主要是为了提高漏洞识别(或者是漏洞匹配)的精度,上下文敏感比上下文无关精度要高,但是这些方法(文章中提到的那几篇文章)使用的静态分析方法丢失了一部分语义。
缺陷检测辅助工作
- 获取源码:解放军信息工程大学李清宝团队在固件代码反编译领域取得了大量成果。文献[90]讨论了固件代码逆向中的指令归一化、控制流恢复、中断向量表等关键问题, 设计了逆向平台 amPro; 文献[91]针对固件严重依赖中断提出了基于中断向量表重构的固件代码反汇编技术, 大大提高了反汇编的精度; 文献[92]提出了动静态两个方面的固件代码控制流恢复算法, 提高了固件控制流恢复的全面性, 为后续的分析提供了有力的支持; 文献[93]提出快速位运算方法和区间生成算法, 提高了在固件反汇编中计算字节运算和位运算取值范围的效率; 文献[94]则基于反汇编技术提出了对固件代码的形式化验证方法和多路径固件恶意行为检测方法。
- 面向固件解码的判定问题, 中科院信息工程研究所孙利民团队提出了基于分类回归树的固件解码状态检测算法[95], 可以自动化分析大量固件解码状态; 面向固件系统、结构、支持硬件不同等问题, 提出了基于获取规则的方法来自动化发现和标注 IoT 设备的类型、供应商和型号[96], 和基于自然语言处理来分析网页内容识别设备指纹的方法[97], 方便其他学者获取固件详细信息; 还提出了基于自然语言处理分析网络上的缺陷报告来理解物联网设备被攻击的原因, 并协助抵抗攻击[98]。文献[99]对固件获取、固件格式分析、固件程序提取、目标程序分析提取、程序表示技术、执行信息恢复技术等进行了综述。
未来研究方向
- 构造一个测试基准集, 包含不同架构、不同类型的固件, 且固件中可植入不同类型的缺陷。
- 固件仿真能力的提高, 覆盖更多的外设类型和硬件架构, 提高对商用物联网设备固件的仿真能力。
- 如何有效利用智能化技术, 通过挖掘已有海量代码中的漏洞信息、结构特征、语义特征、代码修复、更新信息, 形成智能化的漏洞预测模型, 实现自动化生成漏洞检测规则, 进而高效地预测潜在漏洞, 并为后续目标制导的模糊测试提供制导目标
- 面向配置缺陷检测的测试用例生成技术
- 定制化缺陷的检测无需对整个固件程序进行重新测试, 只需对定制化部分测试即可, 但目前尚未出现这一方向的研究工作, 未来可在这一方向做出拓展。