

英语原文共 8 页,剩余内容已隐藏,支付完成后下载完整资料
模块检查器:云端内核模块完整性检查
摘要
内核模块是大多数操作系统(OS)的组成部分,因为它们提供了向内核添加新功能(例如文件系统或硬件支持)的灵活方式,而无需重新编译或重新加载整个内核。除了在用户和硬件之间提供接口之外,这些模块保持系统的安全性和可靠性。恶意内核级别漏洞(例如代码注入)为攻击者访问整个系统的系统的特权级别提供了一个网关。可以通过执行代码完整性检查来检测这样的攻击。几个商品操作系统(例如Linux版本和MS Windows)在数据库中维护不同内核代码片段的签名,以便进行代码完整性检查。然而,维护代码中合法动态更改的数据库(例如常规模块更新)很快就变得麻烦和耗时。在本文中,我们提出了模块检查器,它可以实时检查内存内核模块的代码完整性,而无需维护哈希数据库。我们的解决方案适用于具有多个虚拟机(VM)的虚拟环境,这些虚拟机运行相同版本的操作系统,这是大型云服务器中常见的环境。模块检查器比较云中的VM池中的内核模块。我们彻底评估了Mod Checker的有效性和运行时性能,并得出结论,Mod Checker能够在对客户操作系统性能影响最小或没有影响的情况下检测内核模块头和可执行内容的任何变化。
关键词:Xen;云计算;内核模块;恶意软件;代码完整性;虚拟机;
- 简介
动态内核模块用于扩展操作系统中的静态内核的功能,例如添加对新硬件的支持。这些模块(通常称为驱动程序)可以从内核动态附加或分离,而无需重新启动系统或重新编译内核。通过仅保留运行操作系统所需的主要功能,静态内核可以保持较小[ 1 ]。大多数现代操作系统,如Linux版本(FreeBSD或Solaris)和Microsoft(MS)Windows都支持动态可加载内核模块。这提供了比重新编译内核以添加额外功能,同时保留与编译到内核[ 1 ] 中的代码相同的能力的传统方法的更多灵活性。尽管如此,可以利用动态内核模块来向内核添加恶意功能或颠覆整个操作系统。例如,rootkit [ 2 ]就像一个内核模块,可以隐藏目录,文件,进程和网络连接。因此,为了防止内核被破坏,内核模块必须被信任,并且其完整性不能被破坏。
一个最先进的解决方案维护一个受信任的内核模块的加密散列的字典[ 3 ],[ 4 ],并通过匹配其哈希与存储的值验证内核模块的有效性。例如,MS Windows注册和维护内核模块的数字签名,MS Windows用于在将模块加载到内存时验证模块的完整性[ 3 ]。但是,Windows不会检查模块的恶意内容,并且不会使用签名执行任何完整性检查后,模块加载到内存中。此外,维护用于内核更新[ 5 ],第三方驱动程序和有效的定制模块的字典是麻烦的。
在本文中,我们提出了模块检查器,它可以实时检查内核模块的完整性,而无需维护散列的字典。模块检查器在多个虚拟机具有相同操作系统运行的虚拟化环境中工作。通过比较VM中的模块的哈希值,模块检查器验证模块的完整性。仅检查实际加载到内存中的模块。模块文件包含模块加载器在加载到内存时用相应的绝对地址替换的相对虚拟地址。通过将相对虚拟地址添加到模块的基地址(即,存储器加载模块的第一字节的地址)来计算绝对地址。由于模块一旦被加载到存储器中就经常被重定位,所以其绝对地址相应地变化。这使得计算完整的内存中模块的哈希值不合适。因此,模块检查器提取模块的所有头和只读可执行内容,并分别计算它们的哈希值。模块检查器在云计算环境中进行评估[ 6 ]。这个云为我们提供了一个现实的环境,其中多个相同的VM同时运行[ 7 ]。为了基准模块检查器,几种内核利用技术被用来利用MS Windows XP SP2下的几个系统模块。结果表明,模块检查器可以检测各种类型的内核漏洞,对客户操作系统的性能影响最小。
本文的其余部分组织如下:第二部分总结相关工作。第三节介绍模块检查器并详细说明其架构假设。第四节概述了实施情况,第五节是评价。第六节总结本文。
- 相关工作
已经发布了大量关于内核完整性监控的工作,特别关注控制流完整性,以及数据和代码完整性。本节包含与模块检查器最相关的现有方法和工具。
Rutkowska提出了系统 - 维护性验证器(SVV)[ 8 ],验证系统驱动程序和动态链接库(DLL)的内存中代码段的完整性。它将内存中的代码与磁盘上相应的(引用)可移植可执行文件(PE)文件进行比较。SVV和模块检查器是相似的,因为它们基于跨视图方法并且具有验证内存模块的完整性的相同目标。与模块检查器不同,SVV必须部署在系统中。此外,大多数恶意软件首先感染磁盘上的文件,然后将感染的文件加载到内存[ 9 ]。因此,当内存和文件包含相同的被感染的代码时,SVV无法确定感染。另一方面,模块检查器更强大,因为它使用来自单独的隔离系统的交叉视图。除非云中的所有VM都受到威胁,否则模块检查器可以有效地检测代码完整性违规。
商品操作系统,如MS Windows和几个Linux版本,支持数字签名的内核模块[ 3 ],[ 4 ]。这意味着他们计算和维护内核模块的加密哈希值的数据库。操作系统在将模块加载到内存之前使用此哈希值来验证模块的完整性。但是,当模块最初签名时,此机制不会检查模块中的恶意内容,也不会在模块加载到内存后保证模块的完整性。
Garfinkel et al。提出了LIVEWIRE [ 10 ],其是基于虚拟机监视器(VMM)的入侵检测系统,其具有检查诸如sshd,ietd和syslogd的众所周知的用户程序的完整性的能力。Livewire保留已知良好程序的散列,并定期将其与内存中代码段的散列进行比较,以检测代码完整性违规。Livewire方法也适用于众所周知的内核模块和动态链接库。然而,由于具有存储器代码的良好哈希的基本要求,它不能被概括。
Loscocco et al。目前的Linux内核完整性监视器(LKIM)[ 11 ],它验证静态内核代码与加密散列的完整性,并检查动态数据结构,以验证函数指针的完整性。LKIM不维护模块哈希值列表来检查内核模块完整性,因为模块在运行时重新定位,并且关键数据结构的地址在重定位之前无法知道。为了解决这个问题,LKIM修改了Linux内核,为其提供模块的加载信息(即,它的名称和每个段的地址)。为了评估模块的完整性,LKIM使用此信息以及代码的未保存副本来模拟加载过程。
Arvind et al。提出Pioneer [ 12 ],它验证代码完整性,并确保代码在不可信环境中执行期间保持完整。先锋基于调度器(外部可信实体)和不可信计算环境之间的挑战 - 响应协议。调度器发送一个挑战,以便调用一个计算代码的校验和的自检功能,并将其发送回调度器。调度程序具有用于验证校验和正确并在预期时间内接收的代码的副本。这保证调度器在不受信任的环境中存在“动态信任根”。
Neugschwandtner et al。提出dAnubis [ 13 ],它动态分析恶意的MS Windows设备驱动程序。它包括通过将他们置于监督下的司机的完整性检查。在完整性违规的情况下,它匹配内核函数地址与从Windows调试符号获得的地址。地址的差别有助于识别已经打补丁的函数。
- 内核模块完整性检查器
在完全虚拟化的环境中,如云[ 14 ],VMM是该环境的核心[ 7 ]。VMM允许多个操作系统在固有地在同一计算机硬件上同时运行的VM上运行。这种类型的基础架构允许一个VM通过虚拟机内省(VMI)[ 15 ] 监视其他VM的各种运行时资源(内存,磁盘等)。当在主要的特权虚拟机下运行时,模块检查器通过VMI获取其他虚拟机的内存访问,并跨VM池的交叉匹配模块的内容,以验证模块的完整性。模块检查器的功效基于以下现实假设。
A.假设
我们假设一个典型的云计算环境,包括硬件,VMM(或管理程序,如Xen [ 4 ]),客户虚拟机和特权虚拟机(模块检查器通过内省访问访客虚拟机的内存内容)。
B. 模块检查器架构
模块检查器设计简单,有效,易于部署。它运行在特权虚拟机上,通过内省它对客户虚拟机的内存执行只读操作。
图1显示了模块检查器的架构,它包含三个组件:模块搜索器,模块解析器和完整性检查器。
1)模块搜索器
模块搜索器是模块检查器访问客户虚拟机内存的唯一组件。它找到活动模块的列表,然后查找正在检查完整性冲突的模块。如果模块在内存中,模块检查器从客户VM的内存中提取整个模块,并将其传递到模块解析器,该模块解析器提取头和可执行内容。
图1. 模块检查器架构
2)模块解析器
模块解析器在从模块搜索器接收模块之后处理模块。当模块被加载到存储器中时,其通常保持特定格式,其指定其头部和内容信息。格式取决于操作系统平台。例如,在MS Windows中,模块具有可移植可执行(PE)格式。模块解析器提取头和可执行内容,并将它们传递给完整性检查器,以评估其完整性。
3)完整性检查器
完整性检查器有两个主要功能。首先,它计算模块的头部和内容的哈希值,并将它们与加载到其他VM中的同一模块进行比较。其次,它调整可执行内容中的相对虚拟地址(RVA)。RVA是基地址(加载到存储器中的模块的第一个字节)的偏移量。一旦内核模块加载器加载模块,它将基地址添加到RVA以获得它们的绝对虚拟地址。加载器用其绝对地址替换RVA,并且使得相同的可执行内容在多个VM之间不一致。I完整性检查器通过计算RVA并用其对应的RVA替换绝对地址来反转这些更改。此功能对于匹配从其他VM获取的相同可执行内容的哈希是必不可少的。
讨论
完整性检查器将VM的模块与其他模块进行比较 式 VMs(其中 式是云中运行相同版本的客户机操作系统的机器总数),以确定该模块是否已更改或感染。它跟踪所有标题和内容的哈希已成功匹配的次数。如果成功的次数式 从总比较数中占多数 式,完整性检查器断定模块尚未更改。这种方法只有在大多数VM运行原始(或未感染)模块时才有效。然而,有些情况下,恶意软件,如SQL Slammer 1 [ 16 ]可以迅速感染网络中的大多数机器,这可能会使上述方法引发假警报。但是,在上述任何一种情况下,模块检查器都能够检测到VM之间的差异,从而可以触发更全面,更深入的分析工具,以便进一步调查和清理。此外,在虚拟化环境中,可以保持VM的干净的快照,并且在检测到任何差异时,机器可以恢复到其清洁状态以冲洗感染。
图2.内存中内核模块的双链表
- 实施
模块检查器设计可移植到任何支持VM内省的VMM(例如Xen,KVM或VMware ESX)。为了证明概念,我们开发了一个具有MS Windows XP(Service Pack 2)VM运行的Xen [ 4 ] 上的模块检查器的原型。我们使用libVMI库[ 15 ]来观察Windows XP虚拟机的内存。此外,我们使用OpenSSL [ 17 ]库来获得对计算MD5消息摘要的支持。
本节进一步描述模块检查器组件的低级实现细节。
A.模块搜索器
模块搜索器在内存中查找正在检查完整性的模块。活动模块的列表(当前加载到存储器中)被保持为双向链表(参见图2)。列表中的每个节点由结构LDR_DATA_TABLE_ENTRY表示,其中包含模块名称BaseDllName和基址DllBase(即模块在内存中的起始字节)。它还包含指向下一个F LINK和先前BLINK模块的指针,用于在向前和向后方向上遍历列表。模块搜索器使用系统全局变量PsLoadedModuleList获取列表中第一个元素的指针,并遍历列表以查找按名称检查完整性违规的模块。一旦在列表中找到模块,模块搜索器获得该模块的基地址,并将整个模块从虚拟机的存储器复制到本地缓冲区,然后将缓冲区指针传递给模块解析器。
B.模块解析器
模块解析器从模块搜索器接收模块,并开始提取报头和内容。MS Windows中的模块格式是可移植的可执行文件。图3显示了可移植可执行头文件之间的关系。模块解析器开始IMAGE_DOS_HEADER。模块的前两个字节是DOS头中的e_magic
图3.便携式可执行标头之间的相关性
幻数(特别是“MZ”)。标题具有指向的字段e_lfanew IMAGE_NT_HEADER。NT头有一个四字节签名(其前两个字节是“PE”)和指向IMAGE_FILE_HEADER和IMAGE_OPTIONAL_HEADER的指针(FileHeader和OptionalHeader)。FILE头包含可选头SizeOfOptionalHeader的大小和NoOfSectionsNT头后面的段数。一个部分有一个部分标题IMAGE SECTION_HEADER和部分数据。节头部具有相同的大小并且位于序列中。每个段头都有一个唯一的名称Name,一个指针VirtualAddress到它的段数据和该段数据的大小VirtualSize。它还包含描述段数据的特征(例如只读或可执行代码)的特征字段。模块解析器使用此信息来标识包含可执行代码的段数据。
图4. RVAs调整图。text section - Hello World内核模块的数据。虚拟机VM1和VM2的模块(32位)基本地址为“00 20 CC F8”和“00 C0 D0 F8”。
在验证了DOS头中的幻数后,模块解析器获取指针IMAGE_NT_HEADER。它访问NT标头,后跟FILE和OPTIONAL标头。节头部紧跟在NT头部之后。模块解析器提取NoOfSections段头并进一步处理它们以获得它们对应的段数据。然后,模块解析器将头和段数据传递到完整性检查器。算法1表示用于提取报头和段数据的模块解析码。
算法1从内核模块中提取头和段数据
C.完整性检查
完整性检查器计算每个头和段数据(包含可执行代码)的MD5哈希,并将它
剩余内容已隐藏,支付完成后下载完整资料
资料编号:[137402],资料为PDF文档或Word文档,PDF文档可免费转换为Word
您可能感兴趣的文章
- 饮用水微生物群:一个全面的时空研究,以监测巴黎供水系统的水质外文翻译资料
- 步进电机控制和摩擦模型对复杂机械系统精确定位的影响外文翻译资料
- 具有温湿度控制的开式阴极PEM燃料电池性能的提升外文翻译资料
- 警报定时系统对驾驶员行为的影响:调查驾驶员信任的差异以及根据警报定时对警报的响应外文翻译资料
- 门禁系统的零知识认证解决方案外文翻译资料
- 车辆废气及室外环境中悬浮微粒中有机磷的含量—-个案研究外文翻译资料
- ZigBee协议对城市风力涡轮机的无线监控: 支持应用软件和传感器模块外文翻译资料
- ZigBee系统在医疗保健中提供位置信息和传感器数据传输的方案外文翻译资料
- 基于PLC的模糊控制器在污水处理系统中的应用外文翻译资料
- 光伏并联最大功率点跟踪系统独立应用程序外文翻译资料
