这篇论文的标题是《Effectively Sanitizing Embedded Operating Systems》,作者是 Jianzhong Liu, Yuheng Shen, Yiru Xu, Hao Sun, Heyuan Shi, Yu Jiang。论文主要研究了嵌入式操作系统的安全性问题,并提出了一种名为 EmbSan 的嵌入式系统消毒器,用于检测和修复嵌入式操作系统中的潜在错误。
以下是论文的主要内容概述:
摘要:
- 嵌入式操作系统在安全关键应用中广泛使用,但目前缺乏有效的消毒工具来彻底检测和修复错误。
- 作者提出了 EmbSan,一种通过动态插桩和解耦的宿主运行时库来对多种嵌入式操作系统固件进行消毒的方法。
- EmbSan 在模糊测试中对多个嵌入式操作系统进行了消毒,包括基于 Embedded Linux、FreeRTOS、LiteOS 和 VxWorks 的固件,并在其中检测到实际的错误。
- 评估结果表明,EmbSan 能够检测到与 KASAN 参考实现相同的实际错误标准,并且与 KASAN 和 KCSAN 的性能损失相当。
1. 引言:
- 嵌入式设备的激增要求进行额外的安全测试以保护行业和最终用户的完整性和安全。
- 嵌入式操作系统设计用于在嵌入式设备上运行专门的软件,这在提出能在广泛嵌入式系统上执行各种消毒操作的消毒器设计时带来了许多困难。
2. 背景和相关工作:
- 嵌入式操作系统设计用于执行特定任务,如医疗机器人、自动驾驶汽车、物联网设备等。
- 模糊测试是一种自动错误检测技术,因其在发现错误方面的有效性而闻名。
- 消毒器通过修改程序来检测目标程序的错误行为。
3. 设计:
- EmbSan 由三个主要组件构成:消毒器公共功能提取器、嵌入式平台配置探测器和通用消毒器运行时。
- 工作流程包括预测试探测阶段和测试阶段。
EmbSan 的设计分为三个主要组件,以及一个预测试探测阶段和一个测试阶段。以下是每个部分的详细介绍:
3.1 消毒器公共功能提取器(Sanitizer Common Function Distiller)
- 目的: 确定测试期间使用的消毒器的接口和行为特征。
- 过程: 静态处理过程,首先将消毒器的接口头文件输入提取器,生成消毒器的截获 API 列表。然后,使用先前列出的 API 列表解析消毒器的特定源代码文件和插桩传递源文件,构建接口的截获点和调用图,识别外部资源,并将消毒器 API 的逻辑蒸馏成内部领域特定语言(DSL)。
3.2 嵌入式平台配置探测器(Embedded Platform Configuration Prober)
- 目的: 检测目标固件的平台细节,包括指令集功能、平台设备内存分配和初始固件内存布局。
- 过程: 主要动态过程,需要预测试试运行来识别所有特征。探测器最终产生配置规格和初始设置例程,使用上述 DSL 编写。针对不同类别的固件,采取不同的探测策略:
- 开源固件: 支持编译时消毒器插桩,结合静态和动态方法确定其配置参数。
- 缺乏编译时插桩的开源固件: 插桩指令以识别初始化例程和函数。
- 闭源二进制固件: 主要使用动态方法结合测试者的先验知识来识别相关信息。
3.3 通用消毒器运行时(Common Sanitizer Runtime)
- 目的: 接受探测阶段的消毒器和固件描述,编译特定的消毒器运行时,拦截固件执行过程中预定的消毒器敏感指令和截获函数,并将执行转移到每个功能消毒器的运行时库以更新状态或验证操作。
- 方法: 修改模拟器的执行引擎,通过插入由消毒器指定的回调探针到翻译代码模板中。例如,在 QEMU/TCG 中,对于 KASAN 和 KCSAN 指定的加载指令,运行时通过插入调用代理函数
load_intercept()
来修改其翻译模板。 - 状态维护: 运行时还维护所有消毒器函数的状态,如统一的影子内存,记录多个消毒器功能的信息。
3.4 预测试探测阶段(Pre-testing Probing Phase)
- 准备固件二进制和相关描述: 测试者需要确定所需的消毒器,从操作系统内核中提取参考实现,如 Linux 的 KASAN 和 KCSAN 实现。将包含 API 定义的头文件和实际源代码传递给提取器,以生成 DSL 中消毒器截获函数和逻辑的描述。
- 分析固件源代码: 如果可用,验证其支持编译时消毒器插桩。
- 根据固件分类调用探测器: 生产平台规格和初始化例程,使用 DSL 指定。
- 准备固件进行动态测试: 对于有源代码的嵌入式 OS 固件,这与探测器的插桩过程大致相似,将就绪状态挂钩以调用初始化例程。
3.5 测试阶段(Testing Phase)
- 开始模糊测试或其他动态测试: 运行时组件接受 DSL 描述的消毒器接口和运行时逻辑,以及固件的平台配置和消毒器初始化例程。
- 运行时组件编译消毒器运行时逻辑: 并将所有相关操作挂钩到模拟器的执行过程中,包括与消毒器相关的指令和函数调用。
- 测试开始: 消毒器在固件达到就绪状态时初始化,更新运行时内部状态,验证任何敏感操作。
这个设计框架允许 EmbSan 在不同的嵌入式操作系统和平台上进行有效的消毒操作,同时保持较高的适应性和自动化水平。
4. 评估:
- 作者进行了实验来验证 EmbSan 与现有工具的正确性和有效性,并测量了运行 EmbSan 的运行时开销。
- 选择了基于 OpenWRT、OpenHarmony 等的固件进行评估,涵盖了基于不同嵌入式操作系统的 x86、ARM 和 MIPS 平台。
- EmbSan 辅助内核模糊测试工具发现了基于 Embedded Linux、FreeRTOS、LiteOS 和 VxWorks 的固件中的 41 个新错误。
5. 讨论:
- EmbSan 与现有消毒器相比,具有更好的适应性和错误检测潜力。
- 尽管 Syzkaller 和 Tardis 是最先进的,但它们仍然需要更多的系统调用规范来覆盖嵌入式固件。
6. 结论:
- EmbSan 解决了在测试环境中有效消毒嵌入式操作系统的难题。
- EmbSan 与现有的 KASAN 和 KCSAN 实现一样性能卓越,能够高效运行,并且能够适应更广泛的内核和指令集架构。
- EmbSan 协助内核模糊测试工具在基于 Embedded Linux、LiteOS、FreeRTOS 和 VxWorks 的固件中发现了 41 个新错误,展示了其在测试具有不同架构的广泛嵌入式内核方面的潜力。
7. 致谢:
- 研究部分由国家重点研发计划和国家自然科学基金项目资助。
参考文献:
- 论文列出了一系列相关的研究和工具,包括 Angora、EnFuzz、kmsan、Heartbleed 研究、Gustave、Rtkaller、Tardis、Kcov、AddressSanitizer、ThreadSanitizer、American fuzzy lop、Syzkaller 等。
论文详细介绍了 EmbSan 的设计、实现和评估过程,证明了其在嵌入式系统安全测试中的有效性和实用性。