发布日期:2025-01-04 15:35 点击次数:91
网络与信息技术的加速渗透和深度应用以及软件漏洞不断涌现,导致网络攻击和网络犯罪频发,造成了严重的网络安全威胁.计算机取证是打击计算机与网络犯罪的关键技术,其目的是将犯罪者留在计算机中的“攻击痕迹”提取出来,作为有效的诉讼证据提供给法庭,以便将犯罪嫌疑人绳之以法[1].
然而,由于反取证技术[2]、系统运行与内存交换机制等原因,使传统基于文件系统的取证技术难以有效提取相关数字证据,主要体现在3个方面:
(1) 反取证技术中的数据隐藏、数据转换、数据伪造等技术[3],更改了原始数字证据,导致取得伪证.
(2) 操作系统内核通常会及时释放内存页面,使暂存于内存或交换页面文件中的相关证据信息在关机后消失,造成事后无证可取.比如,Jason等人[4]的研究表明,为了确保系统的正常运行,Windows系统内核总是试图释放内存页面,多数应用程序内存页面的存留时间少于5分钟.
(3) 内存中通常存放有诸如解密密钥、应用程序口令、恶意代码、进程信息、注册表信息、网络连接、系统状态等敏感数字证据,传统取证方法难以获取,只有通过分析物理内存镜像和页面交换文件的二进制数据才能够获取.
以上事实提示:为了有效而全面地提取与网络攻击或网络犯罪相关的数字证据,需及时、规范地进行内存取证.
内存取证作为计算机取证科学的重要分支,是指从计算机物理内存和页面交换文件中查找、提取、分析易失性证据,是对传统基于文件系统取证的重要补充,是对抗网络攻击或网络犯罪的有力武器.当系统处于活动状态时,物理内存中保存着关于系统运行时状态的关键信息,比如解密密钥、口令、打开文件、进程信息、网络连接、系统状态信息等.进行内存取证,就是通过获取物理内存和页面交换文件的完整拷贝,并在另一台计算机中进行内存数据分析,重构出原先系统的状态信息.因此,内存取证技术研究对于完善计算机取证方法、规范取证流程(模型)、提取完整数字证据、洞悉网络攻击机理、快速进行应急响应、遏制打击网络犯罪等方面意义重大.
相对于传统基于文件系统的取证,内存取证研究起步较晚,始于2005年夏季著名的DFRWS(Digital Forensic Research Workshop,数字取证研究工作组)发起的针对Windows系统的内存取证分析挑战赛[5],以鼓励内存取证分析研究和相关取证工具开发.DFRWS于2008年又发起了针对Linux系统的内存取证分析挑战赛.之后,几乎每年的DFRWS大会都有内存取证分析的讨论议题.此外,著名黑客大会(Black Hat,Def Con,ShmooCon等)从2006年也开始举办内存取证分析专题研讨会.
工业界和政府部门同样关注内存取证分析研究.美国联邦调查局FBI下属的RCFL(Regional Computer Forensics Laboratory)自2006年开始了内存取证研究[6].2012年,美国国防部高级研究计划署DARPA[7]发起了对隐匿恶意软件的内存取证分析专题研讨.美国国土安全部DHS[8]为应对网络犯罪而进行了恶意软件内存取证研究.与此同时,相关内存取证工具相继出现,比如Guidance公司的WinEn、HBGary公司的FastDump、Mantech开发的MDD、Agile Consulting开发的Nigilant32等.
目前,国内对内存取证的关注和研究相对较少.上海交通大学[9]、电子科技大学[10]、吉林大学[11]、重庆邮电大学[12]等高校已相继开展内存取证分析研究,相关内存取证软件工具主要有:上海盘石的“SafeImager盘石计算机现场取证系统”[13]、厦门美亚柏科的“取证大师”[14]、山东省科学院计算中心的“计算机在线取证系统”[15,16]、重庆市公安局研制的“内存取证系统”[17]等.
作为一种实时提取数字证据、对抗网络攻击、打击网络犯罪的有力武器,内存取证已成为信息安全领域研究者所共同关注的热点,但目前国内尚未有详细而全面介绍内存取证机理与研究成果的综述论文.为深入理解内存取证机理和发展趋势,总体把握内存取证研究进展,并促进国内在该方向上的研究,综述内存取证研究进展工作非常必要.
本文第1节介绍内存取证的起源和发展演化过程.第2节概述Windows内存管理相关机制,是理解内存取证相关技术与方法的理论基础.第3节讨论内存数据获取方法.第4节探讨内存数据分析方法.第5节讨论目前内存取证存在的问题,并展望内存取证的未来发展趋势和进一步的研究方向.
1 内存取证的起源与发展
1.1 内存取证技术的起源与发展
内存取证概念最早出现在美国空军特别调查办公室的Kornblum发表在2002年DFRWS的主题报告《Preservation of Fragile Digital Evidence by First Responders》[18]中.为了处理网络应急响应所面临的问题,Kornblum提出了需要调查易失性内存信息,以全面而准确地获取网络攻击和网络犯罪证据.真正意义上的内存取证研究,始于2005年夏季DFRWS发起的针对Windows系统的内存取证分析挑战赛.通过分析DFRWS给定的一个Windows 2000物理内存转储文件,要求参赛者提取该文件中所包含的隐匿进程及其隐匿方式、网络攻击者如何攻击以及何时、何处发起攻击等相关攻击时间轴信息.3位参赛者脱颖而出,赢得了挑战赛的胜利:Betz[19]通过逆向分析Windows 2000内核,获取其重要的内核数据结构,并研发了内存取证工具MemParser,详细地提取了该内存转储文件中所蕴含的信息;Garner和Mora团队[20]通过分析虚拟机中Windows 2000崩溃转储文件的重要内核数据结构,开发了内存取证工具KNTList,详尽地获取了该内存转储文件中的信息.DFRWS于2008年又发起了针对Linux系统的内存取证分析挑战赛.
此后,内存取证研究获得计算机取证安全社区的极大关注并得以迅速发展,各种内存取证技术方法相继出现,呈百花齐放之势.回顾内存取证研究的发展历程,我们可将其划分为3个阶段:① 内存取证研究起步探索阶段(2002年~2005年);② 内存取证研究快速发展阶段(2006年~2010年);③ 内存取证研究准成熟阶段(2011年~至今).内存取证研究起源与发展时间轴如图 1所示.
Fig. 1 Timeline of memory forensics research图 1 内存取证研究时间轴
在内存取证起步探索阶段,研究人员主要侧重于提出各种内存取证源和相关研究思路,为加快内存取证研究发展奠定了思想和理论基础.在此期间,Eoghan[21]提出了将网络连接信息作为一种取证源,Carvey[22]提出了Windows注册表可作为取证源,Andreas[23]提出了将系统内存池作为内存取证源,Dolan-Gavitt[24]提出了将VAD(virtual address descriptor,虚拟地址描述符)作为内存取证源,Kornblum[25]提出了将页面交换文件数据作为内存取证源.同时,Kornblum[18]提出了在网络应急响应时需保存易失性内存数据,以提取尽可能多的攻击信息;Carrier和Spafford[26]提出了应将物理内存作为数字证据调查源,以全面获取相关网络攻击信息.
在内存取证快速发展阶段,研究者提出了各种内存数据获取和分析方法,迅速提升了内存取证研究水平及应用范围,使内存证据开始为相关执法者所采用.Andreas[27]详细分析了Windows内存转储文件中的进程和线程信息、阐述了Windows虚拟地址转译机制、重建了内存二进制文件、利用内存池分配机制提取了网络套接字连接信息.Dolan-Gavitt[24,28]提出了利用VAD树提取内存进程和线程信息的方法,详尽地分析了内存注册表数据结构,提出了内存注册表键值信息提取方法.Kornblum[18]提出了一种虚拟地址转换方案,即,使用无效PTE获取被换出至页面交换文件中的内存数据,以尽可能多地获取内存数据;还提出了重建内存可执行文件映像的方法.Arasteh和Debbabi[29]提出了从内存堆栈中提取进程执行历史信息的方法.
在内存取证研究准成熟阶段,研究者在掌握了各种内存取证方法的基础上,开始侧重于研究各种内存取证及评价系统框架与集成方案,以期实现内存取证研究的系统化、模块化、通用化.Petroni等人[30]提出了一种模块化的、可扩展的Volatility Framework,通过对低层内存数据获取的封装而向上提供数据接口,从而使取证研究者专注于高层的内存数据分析与挖掘.Volatility Framework的模块化设计,使其能够轻松地支持诸如Windows,Linux,Mac OS及Android等系统,使研究者能针对不同取证需求而增加相应算法和取证插件,已成内存取证研究领域的一种事实上的标准系统框架.此外,针对各种内存取证工具软件的测评需求,Voemel等人[31]提出了一种内存取证软件的评价平台模型.
1.2 内存取证工具软件的发展过程
内存取证工具软件通过捕获内存数据、分析内存数据,从而提取具有法律效力的数字证据,是内存取证研究的核心载体.随着网络攻击和网络犯罪技术的不断演化,研究者有针对性地开发出相应的内存取证工具软件,以不断适应对网络安全威胁的有效、全面、完整的取证要求.
早期的内存取证是作为磁盘取证的必要补充而提出的,因此,早期的内存取证工具主要侧重于搜索磁盘取证工具难以提取到的内存字符串(比如口令、用户名、IP地址等).比如,德国X-Ways公司的WinHex是一款通用的16进制编辑器,可用于查找、修改内存数据.然而,随着网络攻击和网络犯罪技术的不断更新与演化,证据的内存化趋势已非常明显.这从客观上要求必须提出新的内存取证研究思路,研发新的内存取证工具软件.以2005年著名DFRWS的内存分析挑战赛为起点,计算机取证安全社区掀起了内存取证研究的热潮.此后,各种内存取证方法和相应的内存取证工具软件不断被提出和开发,已呈百花齐放之势.
此时,内存取证工具主要以操作系统内核数据结构为特征,通过搜索匹配内存转储文件,从而提取出其中蕴含的相关证据.比如,Betz基于Windows 2000内核数据结构,研发了内存取证工具MemParser[19];Garner和Mora团队通过逆向分析Windows 2000崩溃转储文件的重要内核数据结构,开发了内存取证工具KNTList[20]; Andreas基于Windows内核进程和线程结构开发的内存进程与线程取证工具PTFinder[32],基于Windows内存池分配机制研发了枚举内存进程与线程的PoolTools[33];Dolan-Gavitt通过分析VAD树结构开发的借助遍历VAD树来枚举内存进程与线程信息的取证工具VADTools[34].此外,一些公司也开始推出内存取证工具软件,比如,Mantech公司开发的Memory DD(mdd)、Agile Consulting公司开发的Nigilant32、Mandiant公司开发的Memoryze.
随着内存取证技术的发展,相关内存取证工具软件已向系统化和集成化方向发展,比如,美国Guidance Software公司开发的WinEn、美国AccessData公司的FTK取证工具、美国HBGary公司的Responder Pro、德国X-Ways software公司的X-Ways Forensics、韩国FinalData公司的Final Forensics、澳大利亚Nuix公司的FBI Forensic Desktop、Matthew Shannon开发的F-Response、MoonSols公司的Windows Memory Toolkit.这些内存取证工具软件可分析提取Windows休眠文件、完整内存转储文件、完整系统崩溃转储文件、虚拟机内存转储文件等多种文件,并将提取出的相关内存证据以图形化形式呈现,促进了内存取证技术的推广应用.
在系统化和集成化的同时,内存取证工具软件开发也在向模块化、框架化方向发展.比如,Volatile System开发的Volatility Framework[35]是一款用Python编写的内存取证工具,支持32位或64位的Windows,Linux,Mac,Android等平台.Volatility以Windows符号和数据结构定义特征码,通过扫描内存查找这些特征码,提取出相关信息.Volatility真正可称赞之处在于其可扩展框架,取证调查人员可利用此框架的核心功能编写自己的插件,以满足不同类型的内存取证研究需要.比如,对于内存恶意代码取证,开发了MalFind,Kernel_Hook,Usermode_ Hook等相关插件;对于内存数据恢复,开发了FileObjScan,DriverScan,ObjTypeScan,CryptoScan,ModDump等插件;对于内存进程线程取证,开发了PsTree,Suspicious等插件.
从上述发展轨迹中我们可以看出,内存取证技术的发展紧随着网络攻击和网络犯罪等网络安全威胁的变化.作为内存取证技术载体的内存取证工具软件,也顺应这种网络安全威胁形势而不断发展更新自身的功能.在模块化、通用化、可扩展的内存取证框架软件(如Volatility)基础上,针对各种网络安全威胁类型,研发相应的内存取证功能插件,以促成内存取证研究的可持续化发展.
2 内存管理机制
操作系统内存管理机制是内存取证研究的理论基础与发展基石.鉴于Windows操作系统的应用广泛性和代表性,本文将以Windows系统为例来阐述操作系统内存管理机制.Windows内存管理可概括为三大机制[36]:① 虚拟地址空间管理;② 物理页面管理;③ 地址转译和页面交换.
2.1 虚拟地址空间管理机制
在早期的计算机系统中,程序员负责管理内存,后来,为了减轻程序员的负担,改由操作系统负责管理内存.这是程序设计发展史上的一次重要变革.在多进程运行环境中,为支持每个进程拥有逻辑上独立的地址空间,操作系统需使各进程地址空间相互隔离,互不干扰.
Windows虚拟地址空间管理目的是实现各进程地址空间隔离,所以进程所见的是虚拟地址空间.虚拟地址也称为线性地址,是Windows在保护模式下所使用的逻辑地址,其空间大小取决于地址总线的宽度,比如,在32位系统上,虚拟地址空间大小为232字节,然而CPU实际访问的却是物理地址空间.所谓物理地址,是RAM中存储单元的索引,CPU通过这组地址线与RAM相连,并通过在这些地址线加上电平信号来读写相应内存单元.换言之,在程序设计时使用虚拟地址,而程序执行时则使用物理地址.因此,Windows需要对各进程虚拟地址进行管理,以便各进程互不干扰地运行于相同的物理内存中.
Windows的进程虚拟地址空间是通过VAD来管理的.VAD描述的是一段连续的地址空间范围,被设计为一棵平衡二叉树,以便Windows快速定位一段虚拟地址空间.随着进程的运行,不断地有地址范围被保留或提交,该进程的VAD树便逐渐形成.因此,借助于VAD不仅能够获取进程所使用的虚拟地址空间信息,还可以获取该进程的其他相关信息.
2.2 物理页面管理机制
Windows既需管理虚拟地址,也需管理物理地址所在的物理内存页面.毕竟,Windows的进程都是在物理内存中执行的.Windows系统使用PFN(page frame number database,页帧编号数据库)来描述物理内存各页面的状态.PFN数据库中的每个PFN项对应于一个物理页面,记录了该页面的使用情况,包括其状态、对应页表项的地址等信息.此外,Windows还维护着一组链表,分别将相同类型的页面链接起来,主要包括零化链表、空闲链表、备用链表、修改链表、坏页面链表等.Windows的虚拟地址转译和页面交换机制是基于这些数据结构实现的.
2.3 地址转译和页面交换机制
(1) 地址转译
由于程序使用虚拟地址,而CPU则使用物理地址,因此,需借助于CPU芯片硬件和操作系统软件配合来实现从虚拟地址到物理地址的转换.这就是Windows系统的虚拟地址转译机制.转译机制是由CPU芯片硬件提供,而转译中所使用的数据结构则由Windows操作系统管理.
Windows系统采用页式内存管理,虚拟地址空间是按页(page)来管理的,物理地址空间是按帧(frame)来管理的,页和帧的大小相等.因此,进程的虚拟地址页面可实现离散分配,即,虚拟地址空间中连续的页面对应于物理地址空间的页帧无需连续.
采用页式内存管理后,虚拟地址在结构上分为两部分:页索引和页内偏移.其中,页索引是指该虚拟地址在地址映射时的索引编号,页内偏移则指该地址在页面内部的具体位置.Intel x86采用分级页表来管理地址映射. 32位虚拟地址中的页索引部分又被分成页目录索引(10位)和页表索引(10位)两部分.
因此,Intel x86在解析一个虚拟地址时,首先根据最高10位在页目录中定位其页目录项PDE(page directory entry),它指向一个页表;其次,根据接下来的10位在页表中定位其页表项PTE(page table entry),此页表项指定了目标页面的物理地址;最后,在此物理地址基础上加上页内偏移量,得到最终的物理地址.Windows虚拟地址转译机制如图 2所示.
Fig. 2 Virtual address translation mechanics图 2 虚拟地址转译机制
如果CPU寄存器中的分页标志位被设置,那么在执行内存操作机器指令时,CPU会自动根据页目录和页表中的信息,把虚拟地址转换成物理地址,完成该指令操作.因此,借由Windows的地址转移机制,可将进程中所使用的虚拟地址转换为物理内存中的物理地址,从而完成内存数据的定位,为内存数据获取提供支持.
(2) Windows页面交换
当进程所需的内存数量大于计算机所安装的RAM时,Windows采用页面交换机制予以处理.Windows页面交换有两种情况:① 进程使用了某个尚未得到物理页面的虚拟地址;② 进程工作集限制其不能拥有更多物理页面.
第1种情况将导致页面换入,首先由CPU触发页面错误异常;然后,Windows在页面错误处理例程中为其分配页面,并设置相关的页表项和页面之间的对应关系;最后,进程就可以透明地访问该地址.
第2种情况将导致页面换出,在内存紧缺时,Windows将不紧急进程的部分代码或数据存放到硬盘文件Pagefile.sys中,腾出物理内存以供他用;当内存紧缺得以缓解时,再将硬盘上的进程代码或数据换入内存,使之继续运行.
由此可见,页面交换文件是物理内存的一种自然延伸.就其数据内容而言,页面交换文件与物理内存是同等的,只不过受页面调度影响而在不同时刻位于不同物理位置.所以,完整的内存数据应包括两部分:物理内存数据和页面交换文件数据.
(3) 进程和线程数据结构
在Windows中,进程是系统各种资源的容器,它定义了一个地址空间作为其基本执行环境;线程是指令执行序列,它直接访问所属进程中的资源.由于Windows内核采用层次结构,进程和线程在微内核层和执行体层上都有对应的数据结构.
Windows内核使用NtCreatProcess函数创建一个进程的过程如下:首先,创建一个执行体层进程对象EPROCESS和内核层进程对象KPROCESS;然后,创建一个初始的执行体层线程对象ETHREAD和内核层线程对象KTHREAD;最后,设置好初始执行环境并参与进程(线程)调度.
在微内核层上,进程和线程的数据结构分别为KPROCESS和KTHREAD,其中包含了系统资源管理和多控制流并发执行所涉及的基本信息.进程对象KPROCESS提供了线程的基本执行环境,包括进程地址空间和一组进程范围内公用的参数;线程对象KTHREAD提供了为参与线程调度而必需的各种信息及其维护控制流的 状态.
在执行体层上,进程和线程的数据结构分别为EPROCESS和ETHREAD.它们涉及操作系统各方面信息,不仅内嵌了内核层上的进程和线程对象,而且还包括了更多涉及进程与线程管理的信息.比如,在EPROCESS中,包含进程的标识、映像文件、配额限制、锁、与进程的物理内存和虚拟内存相关的成员等;在ETHREAD中,包含线程的标识、启动地址、执行时间、安全属性等.Windows内核中的进程与线程间相互关系如图 3所示.
Fig. 3 Relationship between process and thread图 3 进程与线程的关系
由于上述内核数据结构都保存在内存中,这提示可通过内存取证获取相关进程或线程的信息.而系统中发生的任何攻击行为,总是进程(线程)执行的结果.由图 3可知,选择从一个表头出发,采用顺藤摸瓜的方式,能够遍历所有Lists,枚举出重要信息.因此,通过分析、提取此类信息,能够获取相关攻击行为证据数据.这也是内存取证的重要依据和理论基础.
3 内存获取方法
内存取证研究的首要问题是如何完整地获取内存数据.完整的内存数据包括两部分:物理内存数据和页面交换文件数据.物理内存通常是一个特殊的内核对象,比如,在Windows系统中,物理内存是内核内存区对象,即\\Device\\PhysicalMemory;在Unix/Linux系统中,物理内存为/dev/mem和/dev/kmem.只要能读取该内核对象,就能获取物理内存数据.
目前,获取物理内存数据的方法很多[37,38],一般利用操作系统的相关机制和特性,通过不同方法获取物理内存数据.这些方法可概括为两大类:基于硬件的内存获取和基于软件的内存获取.
3.1 基于硬件的内存获取
根据所面向的硬件体系和操作系统的不同,基于硬件的内存获取方法可分为两类:(1) 面向Intel架构桌面操作系统(Windows,Linux,Mac OS等)的内存获取;(2) 面向ARM架构智能终端操作系统(Android,iOS等)的内存获取.
(1) 面向Intel架构桌面操作系统的内存获取
此类基于硬件的内存获取方法主要通过插入硬件卡,利用DMA(direct memory access,直接内存访问)指令去获取物理内存的拷贝.在拷贝物理内存时,目标系统的CPU将暂停,以避免因操作系统的执行而改变内存数据.目前有4种类型的硬件卡:① 基于PCI卡拷贝物理内存(hardware card based technique),比如Carrier等人提出的Tribble[39]、Petroni等人提出的Copilot[40]、BBN Technologies提出的FRED[41]、Hulton提出的Cardbus[42]等物理内存提取卡;② 基于IEEE 1394火线接口拷贝物理内存(hardware bus based technique),比如,Ruff[43],Bock[44],Boileau[45],Piegdon等人[46]提出了利用IEEE 1394火线接口进行物理内存拷贝;③ 基于固件的物理内存拷贝(firmware based technique),比如Alessandro等人[47]提出的SMMDumper、Wang等人[48]利用PCI网卡中的SMM(system management mode,系统管理模式)固件获取物理内存和CPU寄存器内容;④ 基于网卡拷贝物理内存(network card based technique),比如,Štefan[49]利用网卡的NDIS(network driver interface specification,网络驱动程序接口规范)来获取物理内存;⑤ 基于雷电接口Thunderbolt拷贝物理内存(Thunderbolt based technique),比如,美国的TALINO[50]数字取证工作室已就Thunderbolt接口取证展开了相关研究.
此类方法的优点是:① 在基于Intel架构的操作系统(Windows,Linux,Mac OS等)中,都可以利用该方法获取物理内存;② 采用DMA方式能够在不干扰操作系统和CPU的情况下,较为准确地获取物理内存拷贝.其缺点是:① 如攻击者对主板上的北桥芯片进行重新编程,则很容易欺骗此类方法;② 早期的PCI硬件卡须事先插入主板中,这对于遭受实时攻击的系统来说是不现实的;③ 新版BIOS对SMM模式进行锁定,限制了利用固件获取物理内存的应用;④ 如果攻击者对NDIS库进行劫持,就能篡改通过网卡传送的物理内存数据;⑤ 只能获取物理内存RAM,不能获取页面交换文件.
(2) 面向ARM结构智能终端操作系统的内存获取
面向智能终端的硬件获取方法主要通过硬件与终端设备相连接,以获取智能终端设备的内存数据.目前,基于硬件的内存获取方法主要有两种[51]:① JTAG(joint test action group,联合测试行动小组)技术;② 芯片摘取(chip-off)技术.
· JTAG技术是通过在印刷电路板上与特定的JTAG接头相连以连接智能终端设备中的CPU,在向电路供电后,再借助JTAG软件转储整个内存数据.该方法的优点是无需获得智能终端设备的Root访问权限即可实现内存数据获取,但其缺点是,如果JTAG焊接点出错或供电电压错误,则将导致JTAG无法使用,且对智能终端设备造成严重损坏.
· 芯片摘取(chip-off)技术是将内存芯片从智能终端设备中取出,再通过特殊的硬件设备读取其中存储的数据.该方法的优点是可绕过智能终端设备的口令保护,还能修复已遭毁坏的智能终端设备中的数据;但其缺点是把内存芯片取出和重新装入印刷电路板,将可能损坏内存芯片.
目前,尽管基于硬件的物理内存获取方法仍易受到Inception等工具的攻击和存在损坏物理硬件的风险,但因其采用DMA方式,无需操作系统和CPU的干预,无需智能终端设备Root访问权限,减少了对内存数据的改变,从而确保所获内存数据的真实性与实时性.因此我们认为,基于硬件的物理内存获取方法将是未来内存取证的重要研究方向.
3.2 基于软件的内存获取
基于软件的内存获取方法主要利用软件去获取内核内存区对象,并借助于操作系统的内核数据结构和相关机制去解析重构内存数据[52].目前主要有7种方法[37]:(1) 基于用户模式程序的内存获取(user level applications);(2) 基于内核模式程序的内存获取(kernel level applications);(3) 基于系统崩溃转储的内存获取(crash dump technique);(4) 基于操作系统注入的内存获取(operating system injection);(5) 基于系统休眠文件的内存获取(hibernation file based technique);(6) 基于系统冷启动的内存获取(cold booting);(7) 基于虚拟机的内存获取(virtualization).
(1) 基于用户模式程序的内存获取方法
该方法通过用户模式的应用程序读取目标系统中内核内存区对象,即Windows系统中的\\.\Device\ PhysicalMemory对象、Linux/Unix系统中的/Dev/mem和/Dev/Kmem对象、Android系统中通过DDMS(dalvik debug monitor service)模块,以此获取物理内存数据[46].比如,Garner[53]开发的Data-Dumper、Klein[54]编写的Process Dumper Utility等都是此类工具软件.这种物理内存获取方法尽管实现简单,但存在如下缺陷:① 只能用于特定的操作系统和计算机体系结构中;② 该应用程序在内存中的运行会破坏部分内存信息;③ 该方法依赖于系统提供的系统服务,易被Rootkit劫持而导致所获取数据失真.
(2) 基于内核模式程序的内存获取方法
该方法通过内核模式驱动程序读取目标系统中内核内存区对象,比如Windows系统中的\\.\Device\ PhysicalMemory对象、Linux/Unix系统中的/Dev/mem和/Dev/Kmem对象,以此来获取物理内存数据.相对于用户模式应用程序易受限于操作系统安全机制,内核模式驱动程序位于系统内核层,可轻松绕过系统安全机制而完整读取内存区对象.目前,使用此类方法获取物理内存数据的工具软件很多,比如Mantech公司的Memory DD[55]、MoonSols公司的Windows Memory Toolkit[56]、Mandiant公司的Memoryze[57]、Guidance Software公司的WinEn[58]、AccessData公司的Forensic Toolkit[59]、GMG Systems公司的KnTDD[60]、HBGary公司的Fastdump Pro[61]等.但是,该方法也存在如下缺陷:① 程序一旦在内存中运行,就必定会破坏部分内存信息,因此我们认为,如果能将内存获取作为操作系统一个内核模块,通过按键操作来获取内存镜像,则将有助于内存取证分析;② 如果攻击者采用DKOM(direct kernel object manipulation,直接内核对象操纵)技术直接修改内存中执行体内核及其所使用的内核对象,则将导致所获取的内存数据失真.
(3) 基于系统崩溃转储的内存获取方法
一般而言,当操作系统崩溃时,系统总是试图记录下有关当前系统的状态的信息,以帮助找出是哪个组件导致了这次系统崩溃[62].这给物理内存获取提供了线索.基于系统崩溃转储的内存获取方法就是利用操作系统的这种机制,通过获取系统崩溃时刻的系统内存纪录而获得物理内存数据.对于Windows系统而言,每次崩溃都会在\Windows\Minidump目录中生成一个文件,只需用Windbg来打开该崩溃转储文件进行相关分析,就可解析出其中所蕴含的信息.其实,无需等到系统崩溃也能转储内存,通过Windows系统内置的CrashOnCtrlScroll功能即可获取崩溃转储内容[63].对于Linux系统来说,系统提供了多种内核崩溃内存转储机制,比如LKCD(Linux kernel crash dump),Diskdump,Netdump,Kdump(kernel dump),MKdump(mini kernel dump)等,一旦系统崩溃开关被触发,则会在当前目录中生成一个mydumpfile内存转储文件,再利用Crash工具就能分析该内存转储文件.该方法缺点是:因崩溃而对目标系统可能会造成灾难性破坏,从而不利于开展后续相关的取证工作.
(4) 基于操作系统注入的内存获取方法
该方法通过向目标系统注入一个独立的操作系统,再冻结目标系统以获取当前系统快照.目前,采用这种方法实现内存数据获取的工具软件为数不多,只有Bradley[64]提出了概念验证原型系统BodySnatcher,用以获取Windows 2000下的内存镜像.尽管该方法能够较为精确地获取内存数据,但其缺陷也显而易见:在单处理器模式下,将花费很多时间进行写操作、消耗大量内存、且只支持在串口模式的I/O操作.
(5) 基于系统休眠文件的内存获取方法
休眠(hibernate)是指系统将内存中的数据全部转储到硬盘上一个休眠文件中,然后切断对所有设备的供电,并在下次开机时,系统会将硬盘上的休眠文件内容直接读入内存,并恢复到休眠之前的状态.由于休眠文件中保存的是休眠时刻系统的内存记录,因此,系统休眠文件也成了获取内存数据的一种方式.在Windows系统中,当系统进入节能休眠模式时,会自动生成休眠文件Hiberfil.sys且存放在Windows系统根目录下[65].在Linux系统中,休眠文件保存在swap分区中.在Mac OS系统中,休眠文件保存在/var/vm/sleepimage中.基于系统休眠文件的内存获取方法,就是利用操作系统这种机制来获取内存数据.该方法尽管实现简单,但存在如下缺陷:① 由于系统休眠时保存的物理内存RAM中的数据,未包括页面交换文件数据,导致无法获取全部内存数据;② 需要与物理内存RAM大小相同的硬盘空间,以存储休眠文件;③ 不同操作系统的休眠文件格式未知,且压缩存放,这给取证分析该文件带来了困难;④ 该方法除了需要BIOS支持以外,还需要外围硬件设备能够支持节电状态,且这些设备驱动必须能够接收电源管理指令.
(6) 基于系统冷启动的内存获取方法
该方法的原理如下:在系统关机后,物理内存RAM用于保存数据的电磁信号并没有即刻消失.通过利用液氮冷却相关物理内存条,则其中所保存信息的消磁时间将会延长.在冷启动后,利用专门定制的内核模块就能获取物理内存中残留的信息[66, 67, 68].该方法尽管能够获取部分物理内存数据用于事后取证分析,但存在如下缺陷:
① 受环境温度影响大,易丢失信息;② 要求操作及时,实现较困难;③ 无法适用于实时内存取证.
(7) 基于虚拟机的内存获取方法
虚拟机技术已经在云计算、灾难恢复和系统安全等领域得到了广泛应用,因此,基于虚拟机的内存获取方法也随之得到迅速的关注与研究.目前,虚拟机的实现可概括为两类[69]:① 基于软件仿真,即,用软件来模拟计算机软硬件环境,通过共享宿主机的部分硬件以及宿主机CPU模拟的部分虚拟硬件,建立完整的系统运行环境;② 基于硬件支持,即,利用Intel-VT技术或AMD-V技术,在CPU和芯片组等硬件虚拟化技术支持下建立硬件辅助虚拟机.因此,对于基于虚拟机的内存获取也可分为两类:① 基于软件仿真虚拟机的内存获取;② 基于硬件辅助虚拟机的内存获取.
对于前者,由于在虚拟机中运行的程序,其在虚拟客户机内存中的代码与数据等内容都存储在宿主机的磁盘文件上,所以内存获取方法相对简单、快捷.比如,基于VMWare虚拟机在暂停或挂起时,内存状态信息会保存在以.Vmss为扩展名的文件中;在建立系统快照时,包括内存在内的系统状态信息会保存在以.Vmsn为扩展名的文件中;而虚拟客户机的所有内存信息会保存在以.Vmem为扩展名的文件中[70].
对于后者,由于VMM(virtual machine manager,虚拟机管理器)存在着两种模式:Root模式和Non-root模式,这两种模式的转换须通过VMCS(virtual machine control structure,虚拟机控制结构)和“客户虚拟地址GVA®客户物理地址GPA®宿主虚拟地址HVA®宿主物理地址HPA”来实现.因此,该类内存获取方法遵循的原理是:利用VMCS结构和相应地址转换机制来获取内存数据.比如,Mariano等人[71]研究了基于Intel-VT技术虚拟机的内存取证框架,并实现了利用VMCS进行内存数据获取工具Actaeon:可在宿主机内存中定位Hypervisor、分析嵌套虚拟环境配置信息以及在嵌套虚拟环境中运行的各个客户虚拟机间的关系.
以上两类基于虚拟机的内存获取方法存在不足:① 尽管基于软件仿真的虚拟机内存获取方法容易获取内存数据,但由于.Vmem或.Vmss等文件格式未知,在进行相应文件格式转换时可能会造成数据丢失,这将给后续的内存数据取证分析带来困难;② 随着诸如Intel-VT等硬件辅助虚拟化技术的推出,从CPU虚拟化、芯片组虚拟化和网络虚拟化等方面提高了虚拟机的安全性和运行性能,降低了开发虚拟机的难度,然而也给全面完整的内存数据获取带来了困难,尤其在Intel VT-d技术推出后.Intel VT-d技术是一种基于北桥芯片的硬件辅助虚拟化技术,通过在北桥中内置提供DMA虚拟化和IRQ虚拟化硬件,实现了新型的I/O虚拟化方式.Intel VT-d能够在虚拟环境中极大地提升I/O的可靠性、灵活性与性能,但是Intel VT-d技术中的DMA重映射为设备访问内存提供硬件隔离:通过不同的I/O页表,使得每个硬件设备分配到特定的域;当设备尝试访问系统内存时,DMA拦截访问,并且判断是否允许该访问.
随着云计算等虚拟机技术的迅猛发展,越来越多的应用将转移至虚拟计算环境中.因此我们预计,基于虚拟机的内存获取技术将成为未来内存取证研究的重要领域和发展方向之一.
3.3 内存获取方法的评估
尽管内存获取方法和相关工具较多,但对这些方法和工具的性能评估研究相对较少.为了客观而准确地测评相关内存获取方法和工具的性能,研究不同内存获取方法和工具的评估模型与方法具有重要的理论价值和实际意义.
目前,有关内存获取的评估研究工作已开展,研究者从不同角度提出了对于内存获取的测评理论与原则.从内存镜像的真实性与完整性方面,研究者利用不同方法尝试评估系统在进行内存镜像获取时状态变化的程度.比如,Wang等人[72]提出了一个概率统计模型,以计算在内存镜像被加载至RAM中时内存区域的改变概率; Walters等人[73]通过建立快照基线,对比内存获取前后系统状态的变化,尝试去评估内存镜像在获取时的被破坏程度;Sutherland等人[74]提出了实证内存快照建立时系统状态变化的方法;Inoue等人[75]提出了一种能揭示内存镜像中系统错误的可视化技术.
此外,为了准确地评估相关内存获取方法的可靠性,研究者也提出了相应的测评原则,即,某种内存获取方法如满足某些测评原则,则认为该方法是可靠的.比如,Schatz[64]提出了3个通用的、理想的测评原则——精确性(precision)、可用性(availability)、可靠性(reliability);Bradley[76]提出了类似的3个测评原则——精确性(fidelity)、可靠性(reliability)、可用性(availability);Vömel等人[31,37]提出了内存获取评估平台架构,并提出了3个测评原则——正确性(correctness)、原子性(atomicity)、完整性(integrity).
我们认为,无论哪个测评原则,都需要满足内存数据获取的真实性(authenticity)和完整性(integrity).真实性表征通过相关方法或工具获取的某时刻内存镜像与该时刻保存在内存区域中数据完全相同,即,该内存镜像真实地反映了该时刻内存状态.完整性表征所获取的内存镜像的全面性和未被修改性,这里的完整性有两个方面的涵义:① 获取的内存镜像全面完整,既包括物理内存RAM,也包括页面交换文件;② 获取的内存镜像未被修改,即,通过某方法或工具获取的某时刻内存镜像未被更改.综合相关测评原则,上述内存获取方法在真实性和完整性两个方面的性能测评见表 1.
Table 1 Overview of memory accquisition techniques [37,64]
表 1 内存获取技术概览[37,64]
根据上述内存获取方法的性能比较和相关方法的原理分析,目前多数内存数据获取方法存在数据完整性问题,主要体现在3个方面:① 易受Rootkit隐遁攻击等内存视图伪装技术的欺骗,致使获取的内存数据不完整;
② 基于硬件的内存获取方法未能完整地获取内存数据,完整的内存数据既包括物理内存RAM中的数据,还包括页面交换文件中的数据;③ 基于软件的内存获取方法或多或少存在着干扰、破坏内存原始数据的问题,导致获取的内存镜像与获取时刻真实的内存区域数据存在一些细微的差异.因此,从严格意义上说,目前无论采取基于软件还是基于硬件的内存获取方法,都难以全面、完整地获取内存数据.我们预计,解决上述内存数据获取存在的问题,是未来内存取证研究的重要课题之一.
4 内存分析方法
在获取了内存数据之后,就需要对其进行深度分析,解析、重建出内存数据中所蕴含的网络攻击和网络犯罪证据信息.传统的内存数据分析主要采用字符串搜索方法,通过搜索内存中用户名、口令、IP地址等文本字符串,以获取部分取证辅助信息.尽管该方法操作简单、使用方便,能够提取部分内存信息,但却不能有效分析与网络攻击和网络犯罪相关的进程、注册表、解密密钥、网络连接、可执行文件、系统状态等信息.
为了全面地进行内存数据分析,需依据操作系统内核数据结构和相关机制去解析与重建内存数据所蕴含的信息,进而提取相关网络攻击和网络犯罪证据.目前,内存数据分析研究还处于起步阶段,已有研究可分为6种[37]:① 进程信息分析;② 注册表信息分析;③ 密钥恢复分析;④ 网络连接分析;⑤ 可执行文件分析;⑥ 系统状态信息分析.
4.1 进程信息分析
任何网络攻击和网络犯罪行为,总是内存中进程执行的结果.通过内存中进程信息取证分析,有助于还原网络攻击和网络犯罪行为、理解其攻击机理与行为动机.内存进程取证分析主要通过定位内存进程中的相关内核数据结构,并依据进程EPROCESS结构和线程ETHREAD结构及其相互关系(如图 4所示),从中提取相关进程信息.目前主要有3种方法:① 基于EPROCESS对象的取证分析[12,25,27];② 基于KPCR(kernel processor control region,内核处理器控制域)的取证分析[16,76];③ 基于VAD的取证分析[24, 27, 77, 78, 79].
Fig. 4 Relationship between EPROCESS and KPRCB图 4 EPROCESS与KPRCB的关系
基于EPROCESS对象的取证分析方法如下:在Windows内核中,每个运行的进程都有一个与之相对应的EPROCESS结构,以存储与该进程运行相关的各种资源信息.所有活动进程的EPROCESS都连接在一起,构成一个双向链表.通过表头PsActiveProcessHead,就能枚举该链表中的所有进程.该方法的不足是:如果攻击者利用DKOM技术修改进程内核对象EPROCESS结构中希望隐藏进程的FLINK和BLINK指针,从而将其从列表中删除,则将无法查找到被隐藏的进程.
基于KPCR的内存取证分析是通过KPCR®KPRCB®_KTHREAD®_KAPC_STATE®EPROCESS的顺序找到当前执行进程的EPROCESS结构,再根据此结构中的FLINK和BLINK指针遍历PsActiveProcessList链表,找到所有的运行进程.此方法与基于EPROCESS方法的区别在于查证的起点不同,但殊途同归,因此其缺点也一样:无法查找到利用DKOM技术隐藏的进程.
基于VAD的内存取证分析方法如下:对于每个进程,Windows内存管理器维护了一组VAD,由它们来描述该进程地址空间的状态.Windows使用平衡二叉树来管理VAD对象.进程EPROCESS结构中的VadRoot域指向此树的根.通过该树中的MMVAD类型节点,能够得到一个重要的指向控制区对象的指针ControlArea.而控制区对象与文件对象、内存区对象都是互指的,因此通过该指针顺藤摸瓜,能够获取与当前执行进程相关的可执行文件信息.该方法的不足是:无法查证到利用DKOM技术隐藏的VAD树节点信息.
4.2 注册表信息分析
注册表是一个Windows系统中各类配置信息的数据库,保存有大量与系统和用户相关的信息,比如系统中运行的进程列表、用户和系统交互过程等.此外,注册表的内存镜像中还包含只在系统启动时创建的、系统关机后便不复存在的配置单元信息.因此,注册表的内存镜像也是取证网络攻击与网络犯罪证据的一座金矿[22].
Windows注册表在逻辑上是以树形层次结构组织的,在物理上是由一组HIVE文件构成的.一个HIVE文件由多个巢箱(BIN)组成,HIVE文件的首部有一个文件头(基本块base block),用于描述这个HIVE文件的一些全局信息.一个BIN由多个巢室(CELL)组成,用于存储不同的注册表数据(如图 5所示).
Fig. 5 Structure of a registry Hive图 5 注册表Hive的结构
注册表包括5种类型单元:健(key)单元、值(value)单元、子健列表(subkey list)单元、值列表(value list)单元、安全描述符(security descriptor)单元.其中,健单元的特征符是kn,值单元的特征符是kv,安全描述符单元的特征符是ks.在内存取证分析中可利用这些特征符,在获取的内存映像和页面交换文件中找寻到有关注册表键值信息.Windows配置管理器使用类似于Intel x86处理器的页表映射方式来解决Cell地址转译,如图 6所示.
Fig. 6 Structure of registry cell index图 6 注册表巢室索引结构
内存注册表信息取证分析主要是通过相关特征符定位内存中的注册表数据结构,并从中提取有关注册表键值等信息.比如,Anand利用WinDbg研究了将Cell index转换为虚拟地址的方法[80];Brendan研究了Windows配置管理器对注册表的低层操作方法,对内存取证注册表信息作出了突出贡献[81, 82, 83, 84];Stevens[85]从中提取出最近运行程序列表;Carvey[86,87]从中提取出最近添加到系统中的设备记录、无线网络连接信息.该方法的不足在于无法查证利用DKOM技术、通过修改HiveList指针而隐藏的Hive结构.
4.3 密钥恢复分析
密码技术的深度应用,确保了网络系统文件安全.对于密码技术,密码算法是公开的,但相关密钥却是保密的,甚至是加密的.对于已加密的密钥,通常会在程序运行时在内存中进行自动解密.因此,要想解密相关的应用系统,就需从内存中获取相关密钥信息[88].
内存取证密钥恢复分析主要通过解析相关密码算法的内存存储格式,从中还原出密钥信息.目前,关于密钥恢复分析已经开展,研究者从不同角度提出了不同内存密钥取证方法.比如,Hargreaves和Chivers[89]提出了利用线性内存扫描法获取密钥信息,该方法无需深入理解底层系统,简单易行,但对于分段存放的密钥却无能为力; Klein[90]利用私钥和证书通常以标准格式存储的特征,提出了从内存进程信息中恢复密钥的方法;Kaplan[91]基于密钥仅存于物理内存的实际情形,提出了从非换页内存中提取密钥的方法;Halderman,Muller等人[66,92]提出了利用冷启动从内存提取密钥的方法;Tsow,Maartmann-Moe[93,94]分别提出了从内存提取密钥的算法.
4.4 网络连接分析
网络攻击和网络犯罪行为通常会产生网络连接信息,比如IP地址、端口号等.使用诸如TCPView,Netstat等工具,就能获取相关网络连接信息.然而,很多与网络连接相关的数据一般只存在于内存中,而且此类数据会随系统中进程运行而不断更替、消失.因此,进行内存网络连接信息取证[21],及时而有效地提取有关网络攻击和网络犯罪的辅助证据,将有助于深入了解网络攻击和网络犯罪真实场景.
在内存中进行网络连接信息分析主要通过分析Windows系统的网络驱动程序Tcpip.sys,从中提取相关网络连接信息.为提取TCP和UDP网络连接信息,需解析存储在Tcpip.sys中的两个重要结构:_TCPT_OBJECT和_ADDRESS_OBJECT(如图 7所示).
Fig. 7 Structure of _TCPT_OBJECT and _ADDRESS_OBJECT list图 7 _TCPT_OBJECT和_ADDRESS_OBJECT链表的结构
目前,取证研究者已提出了一些网络连接取证分析方法,比如,Schuster[23]基于非换页内存池的相关特征,通过扫描非换页内存池和逆向Tcpip.sys驱动程序,提出了一种提取监听套接字列表进而获取相关网络连接信息的算法;Ligh[95],Okolica等人[96]提出了遍历Tcpip.sys中的_AddrObjTable和_TCBTable列表获取相关网络连接信息的方法(如图 8所示).
Fig. 8 Enumerating of network socket object图 8 网络套接字对象枚举
然而在Windows vista/Win 7/Win 8系统中,网络驱动程序Tcpip.sys中却没提供_TCPT_OBJECT和_ADDRESS_OBJECT这两个重要结构,因此需要通过其他方法进行网络连接的内存取证分析.Wang等人[97]提出了基于Tcpip.sys中的数据结构TcpEndpointPool来提取网络连接信息的方法.
此类借助链表来获取网络连接信息方法的缺点是易被DKOM技术欺骗,即,通过修改_TCPT_OBJECT和_ADDRESS_OBJECT结构中Next指针或TcpEndpointPool结构中的FLINK和BLINK指针来隐藏相关对象.
4.5 文件分析
网络攻击内存化已成网络犯罪的发展趋势,最主要的表现是无磁盘文件,目标系统关机后,攻击进程所对应的可执行文件映像自我删除.因此,重建并分析与网络攻击或网络犯罪进程相对应的可执行文件,是理解网络攻击或网络犯罪的关键.此外,当实施网络攻击或网络犯罪的进程运行时通常会加载其他模块、打开相关文件,而分析这些加载模块、打开文件,也成为理解网络攻击或网络犯罪的重要线索.因此,这里的文件分析主要是指与攻击进程相对应的可执行文件、进程加载的模块文件、进程读写的文件.
内存文件取证分析主要利用Windows系统的进程结构EPROCESS、虚拟地址描述符VAD及其他内核结构所蕴含的信息及其相互关系信息(如图 9所示),提取与该进程相关的文件信息.目前,内存文件取证分析可概括为两类方法:① 基于进程对象EPROCESS提取相关文件信息;② 基于进程虚拟地址描述符VAD(virtual address descriptor)还原相关可执行文件信息.
Fig. 9 Relationship between EPROCESS,VAD and other objects图 9 EPROCESS,VAD与其他对象的关系
· 基于进程对象EPROCESS可提取的文件信息主要包括读写的文件名及路径、加载的DLL模块及其基址等,比如Schuster[98,99]提出的利用EPROCESS提取相关文件信息的方法.但此类方法易被Rootkit隐遁攻击所欺骗.
· 基于VAD可获取与当前执行进程相关的可执行文件信息,比如,Dolan-Gavitt[56]首先提出并实现了基于VAD的文件信息提取方法;Schuster[99],Kornblum[100],Van Baar等人[101]相继提出了各种重建可执行文件的方法.该方法同样无法查证到利用DKOM技术隐藏的VAD树节点信息.
4.6 系统状态信息分析
系统状态信息是Windows系统在运行相关进程时必须保存的有关该进程运行状态的信息,包括CPU寄存器信息、进程自身信息、系统缓存中的信息等.此类信息可使取证调查者了解当前系统中软/硬件和网络的运行状态,对于理解网络攻击和网络犯罪有重要的参考价值与辅助意义.
由于系统状态信息涵盖较为广泛的信息范围,导致所采用的分析方法相对较多.比如,Schuster[78],Dolan- Gavitt[102]等人利用进程对象EPROCESS提取出有关进程启动退出时间、进程句柄表、进程在内存映像中的基地址、进程文件名、进程环境块PEB、进程VAD等;Stevens等人[103]提出了从内存中提取Windows命令行历史记录信息的方法;Simon[104],Gao[105],Markus[106],Drinkwater[107]等人相继研究了从内存中恢复相关应用软件数据的方法;Okolicia[108]等人提出了从内存中提取Windows剪贴板内容的方法;Zhao[88],Hejazi[109]等人从内存中取证各类敏感数据.
5 内存取证讨论
随着网络攻击和网络犯罪技术的发展,内存取证作为计算机取证研究的重要分支,对于获取、分析内存数据、提取网络攻击和网络犯罪证据、重构网络攻击和网络犯罪场景具有重要理论价值和实用价值.依据上述分析和掌握的最新资料,我们将总结目前内存取证存在的问题、展望内存取证发展趋势、探讨内存取证进一步研究方向.
5.1 内存取证现有问题
尽管内存取证研究已取得了长足发展与广泛应用,但现有内存取证技术目前仍存在如下不足与缺陷[31,37].
(1) 内存数据获取的完整性
“巧妇难为无米之炊”.内存数据获取始终是内存取证的首要问题,全面、完整的内存数据则是内存取证分析的关键.随着虚拟机技术的发展和云计算平台的兴起,虚拟机内存数据已成为内存取证和数字调查必不可少的证据源.但目前的内存取证工具与方法多侧重于原始主机的物理内存数据和页面交换文件数据的获取,而对搭载于原始主机之上的虚拟机内存数据的获取则未予以足够的重视.
(2) 内存数据分析的完备性
在完整获取内存数据之后,需依据相关环境与机制进一步深入解析、还原内存数据所蕴含的信息,以完备提取网络攻击和网络犯罪相关证据.目前的内存取证工具与方法在内存数据分析方面存在着完备性问题,具体表现在3个方面:① 根据前面的分析可知,内存数据获取方面存在完整性问题,致使内存分析所需数据不全面,从而导致内存数据分析同样不全面、不完备;② 未能从系统不同层次分析内存镜像数据,对于利用DKOM等内存视图伪装技术的隐遁网络攻击或网络犯罪,无法有效解析出相关进程信息;③ 对于无磁盘文件仅存在于内存中的隐遁网络攻击或网络犯罪,未能有效地重建与攻击进程相对应的可执行文件映像,导致攻击证据提取不全.
(3) 内存证据存储的通用性
目前,内存证据数据存储格式多且难以相互转换.尽管数字取证研究工作组DFRWS于2006年开展了通用证据存储格式的研究,但因缺乏相关的存储格式源支持,导致该工作组终止相关研究工作.
(4) 内存取证研究的滞后性
从攻防博弈的角度,内存取证属于防御技术的范畴.与攻击技术快速发展相比,内存取证针对新类型和新平台的网络攻击和网络犯罪的威胁而进行的研究与开发仍具有一定的滞后性.
5.2 内存取证发展趋势
内存取证技术随着网络攻击和网络犯罪技术的发展而不断发展与演化.
· 在内存数据获取方面,除了完整地获取内存数据(包括物理内存数据和页面交换文件数据)之外,还需确保所获内存数据的真实性和实时性.
· 在内存数据分析方面,如何防止DKOM等内存视图伪装技术欺骗、完备分析内存中的可知性文件映像以满足内存数据分析的完备性?此外,目前内存取证分析所得的证据数据存储格式不统一,造成证据数据相互转换、传输困难.这些仍是内存取证未来发展亟需解决的问题.
· 在内存取证技术开发方面,需采用模块化、可扩展的内存取证框架,以利于内存取证研究深入、快速 发展.
· 在内存取证技术应用方面,针对新类型和新平台的网络安全威胁的内存取证技术,比如针对云计算平台和智能手机平台的内存取证技术,仍是计算机取证社区需要继续发展与解决的问题.
5.3 内存取证进一步研究方向
综合上述讨论与分析,我们认为,内存取证技术领域的进一步研究方向包括:
(1) 内存数据的完整获取
内存数据的完整获取是内存取证研究的首要问题.随着虚拟机技术和云计算平台的迅猛发展,虚拟机内存数据已成为内存取证和数字调查必不可少的证据源.因此,包括原始主机和虚拟机的内存数据完整获取,将是未来内存取证领域进一步研究的重要课题.
(2) 内存数据标准格式存储与整合的研究与开发
为了便于内存证据数据间相互转换、传输,未来需建立内存证据数据标准存储格式:存储证据数据及其相关联的元数据,以减少内存取证时间,增加内存取证可用的数据量,增加内存证据的可靠性.在这方面,Volatility 2.4通过支持多种内存数据存储格式,比如Windows系统的Crash Dump崩溃转储文件、Hibernation休眠文件,Mac系统的MachO文件,VMware的Snapshot快照文件,Linux系统的LiME文件等,在同一框架中整合了这些内存数据存储格式.因此我们相信:随着内存数据获取途径的多样化,内存数据格式的整合与标准存储将是未来内存取证领域进一步的研究方向.
(3) 虚拟计算环境和智能手机平台的内存取证分析
随着云计算和智能手机的快速发展与广泛应用,很多应用业务将迁移至云虚拟计算环境和智能手机平台中,也导致其中会发生更多的网络攻击和网络犯罪会.这将从客观上促使针对虚拟计算环境和智能手机平台的内存取证分析技术发展.
(4) 模块化、图形化、可扩展的内存取证框架的研究与开发
采用模块化、可扩展的内存取证框架,将使研究者在标准的内存取证平台上针对不同应用研究开发不同取证插件,快速提取相应内存证据.而友好的图形界面使操作者易于理解原理、快速掌握内存取证方法,便于内存取证分析技术的推广应用.在这方面,Volatility Framework,FATKit等已在内存取证的框架化、模块化方向进行了相关研究工作,但在内存取证的图形化方向的研究还不多.我们相信,内存取证的模块化、图形化、框架化将是未来内存取证研究的重要方向.
6 结束语
内存取证作为计算机取证科学的一个重要分支,在预防网络攻击、调查网络犯罪等方面有重要且不可替代的作用和应用前景,已成为信息安全研究者所关注的热点研究领域.本文从技术的角度探讨了内存取证原理、内存数据获取与分析方法,并在此基础上展望了内存取证的未来发展趋势和进一步的研究方向.从本质上分析,内存取证技术沿用的是攻防博弈的对抗性思维,因此,内存取证技术将随着网络安全威胁的演化而不断发展与更新.
致谢 我们向对本文工作给予支持和建议的同行,尤其是美国Sam Houston State University的Lei Chen博士、Bing Zhou博士、Lijen Shannon博士表示感谢.