互联嵌入式系统在我们的日常生活中变得越来越普遍,也更容易受到攻击。嵌入式软件安全测试的现有技术依赖于源代码或二进制文件。但是,测试二进制代码是检测漏洞的困难方法,因为源代码语义会丢失。这使得识别内存安全违规和损坏变得困难。在嵌入式系统中,高级源代码往往与手写汇编代码混合在一起,当前基于源代码的工具无法直接处理这些代码。
但是,有一个新框架可用,使您能够对嵌入式系统软件执行系统范围的安全测试。开源的 Inception 框架引入了嵌入式系统中符号执行的新技术。简而言之,符号执行是一种实现高代码覆盖率并在检测到错误时生成测试用例的技术。我的EURECOM同事Giovanni Camurati和Aurélien Francillon,以及我将在论文中更多地谈论Inception。
Inception背后的动机是帮助开发人员发现其连接的嵌入式系统中的漏洞。毕竟,嵌入式软件中的漏洞可能会产生可怕的后果。例如,用于越狱某些智能手机的引导ROM漏洞无法在软件中修补,因为引导加载程序在掩码ROM中是硬编码的。因此,能够彻底测试此类低级嵌入式软件至关重要。与仅使用二进制代码相比,基于源代码的测试可以更好地检测错误。但是,高级编程语言 (C/C++) 通常与手写汇编混合(以执行手动优化或启用硬件功能)。在某些情况下,为板级支持包或专有库代码提供二进制代码。由于这些原因,测试嵌入式系统软件需要对所有这些语言的大量支持。
Inception 如何发现漏洞
初始由三个关键组件组成:
Inception 转换器从高级源代码、手写程序集、二进制库和部分处理器硬件行为生成和合并 LLVM 位代码。
基于 KLEE 的 Inception 符号虚拟机执行符号执行。它使用多种策略来管理不同级别的内存抽象、与外围设备的交互和中断。
Inception Debugger是一个高性能的JTAG调试器,它将内存访问重定向到真实硬件。
Camurati,Francillon和我使用53,000个测试验证了我们的实现,这些测试将Inception执行与Arm Cortex-M3芯片上的具体执行进行了比较。在 USENIX 的演讲中,我们将讨论我们如何在 1624 个合成易受攻击的程序、4 个真实的开源和工业应用程序以及 20 个演示的基准上展示 Inception 的优势。在这次检查中,我们发现了八个崩溃和两个以前未知的漏洞,这突出了Inception框架在嵌入式设备固件测试方面的效果。
在实际的产品开发方案中,Inception 框架对于商业引导加载程序非常有用,因为它们具有低级代码并且经常解析不受信任的输入。当真正的硬件尚不可用时,引导加载程序很难测试。我们分析了一个安全引导加载程序,它支持存储在一次性可编程(OTP)内存中的多个引导选项。在特定模式下执行时,引导加载程序会填充一个结构,其中包含有关要加载的应用程序的信息。结构位置保存在未初始化的SRAM位置(未初始化的指针称为p_header)。如果无效写入未触发任何其他错误,引导加载程序仍可以在start_address时执行并成功加载应用程序,这使得问题难以在实际硬件上检测到。它不会在FPGA原型上崩溃,因为SRAM在启动时初始化为0,而硅片上的情况并非如此。此外,稍后尝试检测错误(例如在硅片上)将付出高昂的代价。因此,攻击者可以获得对p_header值的部分控制权。我们还在商用芯片的软件开发工具包上测试了Inception。硬件原型尚不可用,因此我们将外设读取配置为返回不受约束的符号值。Inception 发现了一个测试用例,其中逐位移位依赖于不受信任的值;该错误会导致外围设备配置错误和意外行为。最后,我们将 Inception 框架应用于正在开发的商业支付终端。我们 使用 其 FPGA 原型 来 重新 定向 大多数 外 设 和 其 中断。Inception检测到八个潜在漏洞。
增强嵌入式软件测试
在嵌入式应用程序中,手写汇编和第三方二进制库的使用相当普遍。通常,即使内存变得更便宜并且编译器效率提高,也有必要手动优化代码。程序集还用于直接与一些低级处理器功能交互。但是,这限制了传统的基于源代码的测试框架的使用。Inception 框架提供了一种强大的方法,可以在源代码可用时增强嵌入式软件测试。
审核编辑:郭婷
-
处理器
+关注
关注
68文章
19096浏览量
228789 -
嵌入式
+关注
关注
5058文章
18972浏览量
301894 -
源代码
+关注
关注
96文章
2943浏览量
66613
发布评论请先 登录
相关推荐
评论