基于ARM嵌入式系统底层漏洞挖掘技术研究

  • 投稿FLax
  • 更新时间2015-09-11
  • 阅读量962次
  • 评分4
  • 70
  • 0

杨世德,梁光明,余凯

(国防科学技术大学电子科学与工程学院,湖南长沙410073)

摘要:随着针对嵌入式系统的攻击事件不断发生,安全指标在嵌入式系统设计过程中得到了越来越广泛的关注。传统的嵌入式系统安全分析主要针对嵌入式操作系统和应用软件,很少关注底层硬件安全。通过分析嵌入式系统底层运行机制,建立和提出一种基于ARM嵌入式系统底层硬件漏洞挖掘模型和方法。

教育期刊网 http://www.jyqkw.com
关键词 :Linux;内核模块;寄存器;挖掘技术

中图分类号:TN710?34 文献标识码:A 文章编号:1004?373X(2015)18?0057?03

嵌入式系统是以应用需求为目的,软硬件资源结合为手段,通过裁剪软硬件资源满足用户对功能、可靠性、成本、体积、功耗等性能指标要求的专用计算机系统[1]。在嵌入式系统发展初期,嵌入式系统通常都是作为完成单一任务的处理器被独立使用,很少通过网络与外界相连。由于嵌入式系统用户的单一性和网络的封闭性,不存在通过网络的攻击,所以在嵌入式系统设计过程中很少考虑安全的因素。但是,随着互连网和无线通信等技术的迅速发展,嵌入式设备不断向数字化,网络化,智能化方向发展,嵌入式系统安全也成了一个急需解决的问题[2]。对于嵌入式系统软件的漏洞挖掘理论已经日趋成熟,但是针对嵌入式系统硬件漏洞挖掘方法还没有形成理论。

1 嵌入式系统体系结构

嵌入式系统一般由嵌入式软件和嵌入式硬件组成,软件主要由嵌入式操作系统、驱动程序和上层应用程序构成[3]。硬件主要由嵌入式微处理器和外围电路构成。嵌入式系统层次结构图如图1所示。

2 嵌入式操作系统与Linux 内核模块驱动

2.1 嵌入式操作系统

嵌入式设备发展早期并没有操作系统。主要存在两个原因,一方面控制嵌入式设备运行只需要一些简单的程序,如洗衣机、微波炉、电冰箱等;另一方面,早期的嵌入式设备硬件资源有限,没有足够的资源支撑嵌入式系统运行。随着硬件的不断发展和用户对于产品功能要求的提高,嵌入式系统不断变的复杂,这时候需要操作系统管理软硬件资源。

嵌入式操作系统是上层应用程序与底层物理硬件的接口,嵌入式操作系统使硬件系统和应用软件层产生相对独立性,可在一定范围对硬件模块进行升级和替换而不影响应用软件的使用。对于用户而言,嵌入式操作系统屏蔽了硬件工作细节,为用户提供统一的应用程序开发接口,这大大简化了应用程序的开发设计流程,同时保障了软件质量和缩短了开发周期。

2.2 Linux内核模块驱动

设备驱动程序是嵌入式操作系统的一部分,它是位于应用程序和实际设备之间的软件。设备驱动程序是驱动硬件工作的特殊程序,其直接与硬件打交道。上层应用程序与操作系统使用硬件必需调用相应的驱动程序[4]。对于普通用户而言,设备驱动程序为用户提供了硬件操作的接口,不需要知道硬件工作具体细节就可以驱动硬件工作。用户操作通过一组标准化的调用完成而这些调用是和特定的驱动程序无关的。驱动程序运行于操作系统,操作系统通过驱动程序才可以控制硬件设备工作。只有正确安装了设备驱动程序,才能保证硬件设备正常工作。

Linux设备驱动程序存在两种安装使用方法:

(1)直接将设备驱动程序编译进Linux内核。将编写完成的驱动程序源码放在Linux 内核源码相应目录下,通过修改Makefile和Kconfig文件将其添加到内核目录树中,然后通过make menuconfig配置该选项,将驱动程序直接编译进Linux内核中。

(2)以可加载内核模块LKM(Loadable Kernel Mod?ule)的方式安装驱动程序。通过使用已经运行于嵌入式系统的Linux内核相应的源码,将驱动程序编译成内核模块,加载内核模块。

本文研究的是第2种方式。相比于第1种方式,以加载内核模块的方式安装驱动程序可在需要时动态的加载,且不需要重新编译内核,不会使内核过于庞大和浪费内存资源。以系统调用read为例,Linux内核模块工作原理如图2所示。

3 基于测试的硬件漏洞挖掘模型

Linux内核模块提供了在用户空间操作底层寄存器的途径,而嵌入式系统存储器种类繁多、容量较大,如何从中选取出对嵌入式系统运行起关键作用的寄存器也是本文研究的重点[5]。本文提出了一种基于测试的硬件漏洞挖掘模型,如图3所示。

基于测试的硬件漏洞挖掘目标为:从嵌入式系统存储体系中搜索对嵌入式系统运行起核心作用的寄存器;挖掘可导致嵌入式系统运行出错的寄存器配置。在基于测试的硬件漏洞挖掘模型中,关键技术是测试向量构建、确定适度函数和异常自动监测。典型的测试向量生成方法有两类,基于变异的测试向量生成方法和基于生成的测试向量生成方法。

4 基于内核模块的硬件寄存器访问机制漏洞

为防止对资源的未经授权的访问,ARM 微处理器划分为不同的操作模式[6]。不同的工作模式运行不同级别的程序和享有不同的操作权限,Linux用户程序工作在ARM微处理器SVC模式,内核程序工作在ARM微处理器USR 模式。例如,SVC 模式可以控制内存映射方式、特殊寄存器、中断和DMA等,而usr模式则不可以。

驱动程序是在“内核空间”中运行,而应用程序是在“用户空间”中运行[7]。通过系统调用和硬件中断可以完成由“用户空间”到“内核空间”的转换。两个空间分别引用不同的地址映射。即程序代码使用不同的地址空间。由此可见,想直接通过指针把“用户空间”的数据地址传递给“内核空间”是不可能的,必需通过Linux提供的一些函数实现地址空间的转换,如get_user,put_user,copy_from_user,copy_to_user 等。通过上述分析,可以找出一种在用户空间对硬件寄存器操作的方法,即通过可加载内核模块的方法操作硬件寄存器。内核模块运行于内核空间,此时ARM 处理器处于svc模式,有权限对硬件寄存器进行读/写操作。本文设计一个可对看门狗寄存器进行更改的内核模块,动态加载到嵌入式Linux系统中,通过应用程序调用此内核模块实现激活看门狗电路、重启嵌入式系统的操作。内核模块open函数中定义的对看门狗寄存器的操作代码如图4所示。

以上内核模块代码即为用户程序中系统调用函数open的最终实现代码。Linux中,无论是内核程序还是应用程序,都只能对虚拟地址进行操作。图中代码完成看门狗寄存器物理地址到虚拟地址的映射和赋值工作。通过分别对看门狗定时器数据(WTDAT)寄存器、看门狗定时器计数(WTCNT)寄存器、看门狗定时器控制(WTCON)寄存器赋值,实现启动看门狗电路,重启嵌入式系统的操作。

5 结语

本文通过分析嵌入式系统体系结构和基于内核模块的驱动加载原理,获知嵌入式Linux系统在内核层次对于寄存器没有防护,特别是核心寄存器。攻击者可通过动态加载内核模块方式更改核心寄存器值。并且,针对内核中已经存在驱动程序的硬件设备,仍然可通过可加载内核模块的方式获得硬件设备的控制权,即嵌入式Linux中缺乏不同驱动操作同一硬件的冲突处理机制。并以看门狗电路为例,对看门狗相关寄存器值进行更改,实现了嵌入式系统的重启。文中提出的嵌入式系统硬件漏洞挖掘方法和模型对于嵌入式系统漏洞挖掘具有一定的应用价值。

教育期刊网 http://www.jyqkw.com
参考文献

[1] 姜荣萍.ARM 嵌入式系统分析[J].计算机光盘软件与应用,2010(6):71?72.

[2] 蔡红辉.嵌入式系统的安全与分析[J].科教文汇,2007(9):217?218.

[3] 袁源,戴冠中.LKM后门综述[J].计算机科学,2008(7):5?8.

[4] 李淑文.嵌入式Linux内核模块加载技术分析[J].广东经济管理学院学报,2004(8):78?80.

[5] 刘瑜.Linux安全分析与系统增强的研究[D].成都:电子科技大学,2004.

[6] YAMAURA T. How to design practical test cases [J]. Software,IEEE,1998,15(6):30?36.

[7] HUANG J C. Program instrumentation and software testing [J].Computer,1978,11(4):3?8.

作者简介:杨世德(1991—),男,内蒙古鄂托克前旗人,硕士研究生。主要研究方向为通信网信息安全。

梁光明(1970—),男,湖南涟源人,博士,硕士生导师。主要研究方向为通信网信息安全。

余凯(1990—),男,安徽安庆人,硕士研究生。主要研究方向为通信网信息安全。