一种轻量级的Android 内核保护监控器
2014-12-02钱振江
杨 永,钱振江,黄 皓
(南京大学 a.计算机软件新技术国家重点实验室;b.计算机科学与技术系,南京 210046)
1 概述
随着Android 系统在移动操作系统市场的快速发展,对Android 系统的攻击也是层出不穷。为了防御各式各样的攻击,目前工业界和学术界都展开了较多的研究。有研究者通过对Android 市场的应用程序进程审计,分析应用程序中的恶意行为,阻止应用程序对系统的攻击,防止用户隐私泄漏[1-2]。有研究者通过对Android 用户程序框架进行增强,以修补Android 安全机制的缺陷,来阻止恶意代码对隐私的访问[3-4],还有一些研究者从基于Linux 内核的框架做修改增加Android 的安全[5-6]。虽然上述研究成果对Android 基于应用程序的攻击有很好的防御效果,但是针对Android系统内核的攻击,现有的防御机制都是基于传统Linux 内核的保护方法,但大部分保护方法本身在操作系统内部,攻击者很容易绕过或者篡改[7]。利用硬件虚拟化保护机制能很好隔离和监控系统的各种威胁[8-9],但是这些都是针对特定平台的,如Intel-VT 等。而对Android 所搭载平台的ARM硬件虚拟化的研究工作目前较少,主要有Xen on ARM[10]和KVM for ARM[11],它们实现了对DomainU 系统的监控。但是Domain0 和DomainU 共存的方式并不利于现有移动设备简单方便的使用体验,并且对性能的影响较大。Cells 采用名称空间的方法,安全独立地运行多个操作系统。虽然性能上很好,但是由于操作系统内核并未隔离,因此对内核的攻击将会威胁到所有的系统[12]。L4Android 将修改后Android 系统作为一个用户空间的进程运行在微内核之上,不同的Android 系统用于不同的场合,具有很好的隔离效果[13],但是对系统的攻击仍然无法检测和阻止。
本文结合ARM 处理器的硬件虚拟化机制,实现一种基于ARM 平台轻量级的hypervisor 监控器架构。保护操作系统内核关键对象,以及快速检测Rootkit 威胁来阻止针对基于Linux 内核的Android 系统级的攻击。
2 DroidVisor 架构
ARMv7 硬件虚拟化扩展,增加了一种工作在普通区域的HYP 模式。HYP 模式拥有普通区域的最高权限。而其他的模式分别是:(1)特权模式,包括快速中断模式、中断模式、系统管理模式、数据终止模式、未定义指令终止模式、超级用户模式;(2)用户模式。
HYP 模式拥有更高的特权,对资源的控制能力超过普通区域。因此,将DroidVisor 的核心监控代码位于该区域。被监控的操作系统内核运行于普通区域的特权模式,用户程序运行在普通区域的用户模式。DroidVisor 对被监控操作系统的改动很小,监控程序也比较简单,有利于保证监控程序本身的安全性验证。
DroidVisor 的设计架构如图1 所示。
图1 DroidVisor 架构
DroidVisor 监控器设计基于以下2 点:(1)两阶段内存地址转换,从VA->IPA->PA。其中,第二阶段对于被监控的操作系统是透明的,只有监控器能控制第二阶段内存转换的页表结构。(2)处于HYP 模式的监控器能对资源拥有最高的访问权限,能访问被监控系统的页表目录基址寄存器、控制寄存器、以及异常向量地址寄存器等。监控器可以通过修改需要保护的页面的访问权限属性,来阻止恶意代码对内核关键对象的修改以及内核控制流的篡改。而不需要更改被监控的操作系统。同时由于监控器拥有更高的权限,因此能看到被监控系统整个内核空间的完整视图,能有效地检测Rootkit 的存在。
3 DroidVisor 关键技术
3.1 内核完整性保护
DroidVisor 保护内核关键对象不被恶意程序篡改和破坏,并能第一时间阻止此类恶意代码的攻击。Linux 内核中存在的关键对象主要有基本内核代码、内核模块代码、异常向量表、系统调用表和内核导出函数等。
DroidVisor 基于ARM 虚拟化扩展机制提供的两阶段地址转换过程,如图2 所示。第一阶段转换过程由MMU使用被监控的操作系统的页表结构进行地址转换,该页表结构由被监控的操作系统控制;第二阶段地址转换由DroidVisor 控制,并且该页表结构对被监控的系统是透明的。因此,通过第二阶段的页表来控制操作系统对内存的操作,而被监控的系统中的恶意代码无法感知,有很好的隔离效果。
图2 两阶段地址转换过程
Linux 提供LKM 的机制来扩展内核功能,而该功能正是恶意代码利用的手段。研究表明,60.4%的内核攻击来自不信任的第三方内核模块。DroidVisor 对内核模块的加载和卸载进行监控,对于第三方不信任模块的运行,使用一套新的第二阶段地址转换页表结构,该页表结构在页表项上有严格的访问控制权限,对不信任模块的内存隔离,并能及时报告和处理模块中恶意代码对关键内核对象的破坏。
DroidVisor 通过监控器代理模块获取关键对象的虚拟地址。Linux 内核提供了system.map 文件,保存了内核导出符号对应的虚拟地址,如图3 所示。
图3 DroidVisor 关键对象的页面属性
保护设置的过程如下:
(1)监控器请求获取关键对象的虚拟地址;
(2)代理模块解析system.map 获取关键对象的虚拟地址;
(3)代理模块将虚拟地址传给监控器;
(4)监控器使用被监控系统的页表结构获取虚拟地址对应的IPA;
(5)监控器利用第二阶段转换页表获取IPA 对应页表项;
(6)设置PTE 的访问属性。
ARM 虚拟化扩展第二阶段地址转换使用大物理地址扩展(LPAE),使用64 位长度的页描述符。其中,bit[7:6]为访问控制位AP[2:1],第二阶段的访问属性如表1 所示。
表1 AP 模型访问控制属性
在要保护的关键对象的第二阶段地址转换对应的页表描述符上,设置相应的访问控制属性,当恶意代码修改被保护的关键对象,在第二阶段地址转换便会产生异常,DroidVisor 捕获该异常,确认是由不信任模块中的恶意代码修改了保护的对象后,DroidVisor 请求代理模块完成一些复杂的功能,如信息打印等。并将该异常注入到被监控系统的异常处理程序,由操作系统结束有恶意行为的进程或者报告给用户。异常注入过程为:(1)读取异常向量表的地址;(2)将异常信息填写到异常状态寄存器中;(3)将异常处理程序地址填入ELR_hyp 寄存器,异常处理地址等于异常向量表地址+特定异常偏移;(4)执行eret 指令。DroidVisor 也使用了同样的方式来执行代理模块的功能,代理模块实现了一个类似的功能向量表。
3.2 Rootkit 检测
在3.1 节中阐述了利用DroidVisor 来保护内核完整性,该方法虽然能阻止恶意代码修改,如系统调用表、异常向量或者内核代码等关键对象。但此方法对某些直接对象操作(DKOM)的rootkit 不适合,如模块隐藏、进程隐藏等,因为系统中有很多的内核对象如模块链表、进程链表,并且这些链表结构随着模块的动态加载和卸载、进程创建和退出时刻发生变化,若对每个结构都进行3.1 节中所示的保护,会触发很多异常,并且严重影响了系统的性能。因此,为了权衡系统安全性和性能,不必对这些链表进行保护,但必须能在系统被入侵后较快的时间内检查出威胁。本节对隐藏的模块和进程检测证明利用DroidVisor 能迅速地检测到rootkit。
为了能迅速地检测到系统受到的威胁。因此,必须在很短的时间段执行一次检查。DroidVisor 选择进程切换时作为检查点。理由是进程切换必须更改页目录基址寄存器,该寄存器为CP15 协处理器的C2 寄存器,并且能在恶意程序还没有再次运行前就可以检测到该类的隐藏行为。ARM硬件虚拟化支持设置CP15 访问控制,当客户机特权级和用户级对CP15 特定的寄存器访问时,将触发陷阱,并由DroidVisor 截获该异常。
在处理该异常时,DroidVisor 获取被监控系统的模块视图,对比模块在加载和卸除时登记的信息可以检测出系统是否存在隐藏模块信息的rootkit。检测过程如下:
由于Linux 内核地址使用虚拟地址到物理地址的转换只是加上一个偏移,因此对第一阶段的地址转换不需要使用页表进行转换。同时虚拟机监控器将IPA 直接映射到物理地址上,只是在访问权限上做一些设置,因此由IPA 到PA 的转换过程也不需要进行第二阶段页表转换。上述从虚拟地址到物理地址的转换代价是O(1),而链表遍历过程的代价是O(n),因此,这个过程对系统的性能主要受到模块数目的影响。
同样在进行进程切换的同时,检测将要运行的进程是否在tasks 链表中,如果该进程不在进程链表中则可以判定该进程为被隐藏的进程,说明系统中存在此类的rootkit。检测函数如下:
该函数主要的代价是进程链表的遍历,同上被监控系统的虚拟地址到物理地址的转换过程代价为O(1),对链表的遍历代价为O(n),n是系统中进程的数量。可见,该检测函数对系统的性能影响也主要受到系统中进程数目的影响。
3.3 DroidVisor 自身保护
DroidVisor 在普通区域中有着至高的权利,能完全地访问各种资源,控制被监控系统的各阶段地址转换。因此,监控器自身的安全也相当重要。监控器要尽量简单,因为越复杂隐藏的缺陷就越可能越多。并且轻量级的监控器,方便对其进行形式化验证。DroidVisor 除了使用简单、轻量级的设计策略之外,还使用了内存隔离和基于TrustZone 的硬件保护机制。
监控器为了简单的目的,没有实现对设备的模拟,而是直接使用被监控程序的驱动程序对设备进行驱动。DroidVisor 将客户机第一阶段地址转换的IPA 直接映射到相应的物理内存中,只是在页表项增加了访问控制权限等。为了保护监控器的安全,从内存上进行隔离,bootloader 给被监控系统内核传递参数时,隐藏了监控器的物理地址空间。如图4 所示为整个系统内存隔离视图。
图4 DroidVisor 内存布局
除了在给内核传递参数时进行内存隐藏,DroidVisor还控制第二阶段地址转换,防止恶意代码暴力枚举内存空间,并将其映射到操作系统内核空间对监控器进行攻击。
此外,DroidVisor 要获得被监控系统的关键信息以及监控行为的信息输出。必须与代理模块紧密交互,可见,代理模块对整个监控过程至关重要,决定了监控器是否能正确设置某些策略。因此,对代理模块的保护也是很必要的。首先要确定加载时该代理模块就是信任的模块,其次在系统运行过程中要保证该模块不能其他恶意代码修改。
代理模块验证,在模块加载时监控程序捕获模块加载的过程,并请求TrustZone 安全保护技术提供的服务对模块进行检测,本文在TrustZone 的可信服务中主要使用白名单摘要验证方法,当且仅当该模块的摘要存在白名单中,该模块为信任模块。经过验证的模块才能与监控器进一步通信,监控器并登记代理模块信息和功能函数表,以便后续过程进程功能请求调用。
此外,还必须保护代理模块在运行中不被恶意程序破坏和篡改。使用3.1 节中使用内核对象保护方法,但是区分当前系统是否有不可信模块而有所区别。当代理模块加载前,系统中无不可信的模块,则直接加载,不做任何保护,因为此时系统在加载时被验证是可信的。当代理模块加载前,系统中存在不可信的内核模块,而此时系统使用的是增强了安全属性的第二阶段地址转换页表结构,这就要求在代理模块加载完成后,修改代理模块的地址空间页表属性,防止其他恶意代码修篡改代理模块。
4 实验及结果分析
目前,ARM 虚拟化扩展支持的处理有Cortex-A15。三星电子正式发布了Exynos525,Galaxy S4 手机就是基于Cortext A15 的。可以预见在不远的将来,就会有大量基于ARMv7 并支持硬件虚拟化的手机在市场中出现。
本文的实验是基于ARM FastModel。FastModel 解决嵌入式系统的软件开发周期可因等待昂贵的开发硬件而产生的延迟。并且加快在完全验证的系统上开发全功能软件的速度。它能在功能性上精确地模拟ARM 硬件,但无法精确模拟处理器速度。实验中用FastModel 对Cortex A15 进行模拟。
4.1 功能测试
本文实验1 针对Android 系统的rootkit[14]进行测试,在4 个rootkit 中,其中,3 个修改sys_call_table;1 个修改swi 软件中断跳转偏移。上述4 个rootkit 都能被DroidVisor立刻阻止其恶意行为,保护系统调用表和异常向量表不被篡改,实验结果如图5 所示。
图5 DroidVisor 对关键内核对象的保护
本文参照Adore-ng 的原理实现了一个基于Android 平台的内核级rootkit,并加载到Android 的内核空间,该rootkit能完成模块隐藏和进程隐藏的功能,实验证明。DroidVisor能及时地检测到此类威胁。实验2 为对模块隐藏的检测,实验3 为对进程隐藏的检测。
实验2 对DroidVisor 的模块隐藏检测功能进行测试,如图6 所示。图6(a)中模块hello 对helloa 模块进行隐藏。图6(b)中模块隐藏时被检测到。结果显示,DroidVisor 能快速地觉察到系统中隐藏的模块。
图6 隐藏模块检测
实验3 对DroidVisor 的进程隐藏检测功能进行测试,如图7 所示。图7(a)、图7(b)在无rootkit 检测的环境中对ping 进程进行隐藏,该进程在后台继续运行,使用ps 命令无法查看到被隐藏进程的信息。图7(c)、图7(d)中DroidVisor立刻检测到即将要运行的进程为隐藏的进程。结果证明DroidVisor 有快速地觉察到系统中隐藏进程的功能。
图7 隐藏进程的检测
4.2 性能测试
由于FastModel 不能精确地进行处理器性能进行仿真。为了测试DroidVisor 对被监控系统的性能影响,实验采用与未使用DroidVisor 的系统进程切换时switch_mm 的时间代价进行比较。分别为没有使用DroidVisor 的性能、使用DroidVisor 但未开启Rootkit 检测功能的性能,以及使用DroidVisor 并开启Rootkit 检测功能的性能。如图8 所示,是一次运行过程中,每次进程切换时switch_mm 的时间消耗对比,图9 是10 次运行进程切换switch_mm 平均的时间消耗的对比。
图8 每次进程切换switch_mm 的时间消耗
图9 10 次运行switch_mm 的平均时间消耗
从实验数据分析得知,在不使用DroidVisor 的rootkit检测功能时,DroidVisor 对被监控的系统的性能影响很低,平均增加时间为0.000 005 s 以下。使用DroidVisor 的rootkit的检测功能,对性能的影响开始变大,由于每次执行监测都要遍历进程和模块链表,因此影响性能的主要因素与进程和模块的数目有关。对10 次测试结果可以看到,性能影响最坏的时间增量为0.000 09 s。
5 结束语
本文通过分析当前对操作系统内核保护方法,提出一种基于ARM 硬件虚拟化技术的移动操作系统的监控保护方案DroidVisor,主要保护操作系统内核关键对象以及检测rootkit 威胁。实验结果证明,DroidVisor 能立刻阻止对监控对象的篡改,并且能快速地检测到系统中的rootkit 威胁。后续工作将继续研究对系统内核所有关键对象的监控,以阻止破坏操作系统完整性的威胁。同时,将减少监控过程对系统性能的影响。
[1] Enck W,Gilbert P.TaintDroid:An Information-flow Tracking System for Realtime Privacy Monitoring on Smartphones[C]//Proceedings of the 9th USENIX Conference on Operating Systems Design and Implementation.[S.1.]:IEEE Press,2010:393-407.
[2] Grace M,Zhou Yajin,Wang Zhi,et al.Systematic Detection of Capability Leaks in Stock Android Smartphones[C]//Proceedings of NDSS’12.[S.1.]:IEEE Press,2012:107-201.
[3] Enck W,Ongtang M,McDaniel P.On Lightweight Mobile Phone Application Certification[C]//Proceedings of ACM Conference on Computer and Communications Security.[S.1.]:ACM Press,2009:235-245.
[4] Nauman M,Khan S,Zhang X.Apex:Extending Android Permission Model and Enforcement with User-defined Runtime Constraints[C]//Proceedings of ACM Conference on Computer and Communication Security.[S.1.]:ACM Press,2010:328-332.
[5] Bugiel S.Towrads Taming Privilege-escalation Attacks on Android[C]//Proceedings of ISC’10.[S.1.]:IEEE Press,2010:346-360.
[6] Shabtai A,Fledel Y,Elovici Y.Security Android-powered Mobile Device Using SELinux[J].IEEE Security &Privacy,2008,8(3):36-44.
[7] NVD.CEV-2007-6562[EB/OL].(2013-04-17).http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2007-6562.
[8] Seshadri A,Luk M,Qu Ning,et al.SecVisor:A Tiny Hypervisor to Provide Lifetime Kernel Code Integrity for Commodity OSes[C]//Proceedings of ACM SOSP’07.[S.1.]:ACM Press,2007:335-350.
[9] 李 珣,黄 皓.一个基于硬件虚拟化的内核完整性监控方法[J].计算机科学,2011,38(12):68-72.
[10]Hwang Joo-Young.Xen on ARM:System Virtualization Using Xen Hypervisor for ARM-based Secure Mobile Phones[C]//Proceedings of the 5th IEEE Consumer Communications and Networking Conference.[S.1.]:IEEE Press,2008:257-261.
[11]Dall C,Nieh J.KVM for ARM[C]//Proceedings of Linux Symposium.[S.1.]:IEEE Press,2010:45-56.
[12]Andrus J,Dall C,Hof A V,et al.Cells:A Virtual Mobile Smartphone Architecture[C]//Proceedings of ACM SOSP’11.[S.1.]:ACM Press,2011:173-187.
[13]Lange M,Liebergeld S.L4 Android:A Generic Operating System Framework for Secure Smartp-hones[C]//Proceedings of SPSM’11.[S.1.]:ACM Press,2011:39-50.
[14]You Dong-Hoon.Android Platform Based Linux Kernel Rootkit[EB/OL].(2013-04-17).http://www.phrack.com/issues.html?issue=68&id=6.