1.4 内存取证
直接在可疑或者目标系统中运行各种工具的在线取证方式,大大破坏了计算机取证的现场——内存。这种方式只保留了取证后得到的结果,却并没有保存证据原始的数据,如果有新的在线取证需求提出,会毫无办法;取证的结果受到质疑时,无法根据原始数据进行验证。因此,一种特殊的在线取证方式——内存取证(Memory Forensics)开始进入计算机取证研究者的视线。
内存取证先获取内存镜像文件,再通过分析镜像文件,提取在线取证所需的各种信息。
从内存镜像文件中获取信息,最简单和直接的方法就是使用strings和grep等工具或更为强大的应用软件(如WinHex)进行明文字符串的查找、模式匹配。这种方法有时也被称为非结构化内存取证,因为它仅将内存镜像文件看作一个字节流的文件。这种简单的方法可以获取账户信息、文档数据等有用的信息,但是这种方法不能提供信息的上下文环境,无法知道匹配的字符串来自哪个进程的地址空间,无法得知这些信息是如何被系统使用的。而且,一些数据通过简单的编码或者加密,就可以使这种方法失效。因此,这种直接提取信息的内存取证方法,远远不能满足计算机取证的要求。
真正意义上的内存取证的研究工作始于2005年。数字取证研究组(DFRWS,Digital Forensic Research Workshop)推出了一项名为“内存分析挑战”(Memory Analysis Challenge)的物理内存分析竞赛活动。该活动提供了Windows 2000操作系统的物理内存镜像文件,要求参赛者分析并且回答文件中所包含的隐匿进程及其隐匿方式、网络攻击者如何攻击以及何时、何处发起攻击等相关攻击时间轴信息。Betz和Garner以及Mora给出了详细的解答,并最终获得优胜。Betz通过逆向分析Windows 2000内核,获取其重要的内核数据结构,并研发了内存取证工具MemParser,详细地提取了该内存转储文件中所蕴含的信息;Garner和Mora开发了kntlist工具,通过进程链数据结构PsActiveProcessList,顺序对比所给的有隐匿进程的镜像样本和另外一台可信的对比镜像样本的进程信息,也得到了最后的结果。自此,计算机取证领域开始了一波内存取证研究的热潮。各种内存取证方法和相应的内存取证工具不断出现,至今仍是计算机取证研究的热点之一。
内存取证的对象是存储系统运行时保存在线数据的文件,主要是指物理内存的镜像。通过内存镜像,将运行系统的物理内存中的所有数据以二进制文件的形式保存到固定的存储介质上(通常保存到硬盘上),将易失性的证据固化为非易失性的证据(数据),保留了取证原始现场。另外,内存取证的对象还包括一些操作系统中存储在磁盘中的文件,如虚拟机内存快照等静态的内存、操作系统进行内存管理产生的文件(如Windows操作系统的pagefile.sys、hiberfil.sys文件,Linux系统的swap文件等)和其他内存转储文件。
内存取证的任务就是以操作系统内核数据结构为特征,通过结构化、逻辑化的分析,从这些文件中提取所需的信息,并对这些文件中保留的系统运行状态进行相应的描述,最大限度地构建电子证据以及其存在的状态。这种内存取证与分析使用一定的结构来解析内存镜像文件,也被称作结构化的内存取证。内存取证的主要研究内容可以用图1-2描述。
图1-2 内存取证的主要研究内容
相比传统的在线取证,内存取证技术有以下优点。
(1)符合传统物证技术的要求。
传统的在线取证模型中,在线取证的各个阶段很难划分清楚。内存取证使易失性的证据固化为非易失性的证据(数据),保留了取证原始现场。调查和分析都依赖于所获得的物理内存映像文件,便于验证分析调查工作的正确性,比传统的在线取证方式更符合物证技术的要求。
(2)内存取证能够评估计算在线证据的可信性。
传统的在线取证需要在目标系统上运行各种取证软件,导致在线获取的电子证据可信性非常差。内存取证将在线证据的可信性问题聚焦于内存获取这一点,使评估在线证据的可信性成为可能。在此基础上,展开在线证据的可信性研究,可有效提高在线证据的可信性和证明力,对于推动取证技术研究的规范化、科学化将起到重要的引导作用。
(3)内存取证最大限度地减少对目标系统的影响。
专用的内存获取软硬件工具可以在较短的时间内完成获取内存的工作,对目标系统造成的影响很小,同时由于仅内存获取过程这一点能对目标系统造成影响,有利于把对目标系统的影响最小化,更符合计算机取证的原则。
以上主要是从在线取证可信性的角度,说明内存取证的一些优点。在实际取证工作中,内存取证有其独特的优势。
系统中的各种信息(如进程、服务、应用、网络浏览历史、编辑的文档、图片、发送和接收的网络数据、运行的程序、剪贴板、用户名和密码、注册表、屏幕显示的内容等)从创建到使用和销毁的每一个比特都需要经过内存。在获取到的内存中,取证人员几乎可以分析出操作系统正在做的所有事情。
特别是,当有些数据不存在于磁盘等静态存储介质时或者很难从磁盘中获取有用数据时,内存取证分析技术更是大有用武之地。例如,恶意程序会通过种种技术手段隐藏自己,经常通过API HOOK技术、替换系统服务、DKOM修改内存数据结构等方法隐藏自己的运行进程,使一般的检测工具难以发现其运行;另外,恶意程序还会通过注册表插入、远程线程插入、文件加密等方式,使其在磁盘中不留痕迹,给检测与分析带来极大困难。此时,内存取证分析会发挥其独特作用,因为无论恶意代码怎么隐藏自己,也必须以解包后的可执行方式在内存(RAM)中运行,必然会在内存中留下痕迹,此时,内存取证和分析技术就成为检测和分析恶意代码强有力的武器。
再如,系统工作在磁盘全盘加密模式时,无法从磁盘中获取数据。但加密的内容在使用时必须经过解密,解密过程仍然要经过内存。内存分析就能够获取磁盘解密的密钥。同样,内存中也存有各种系统和应用软件的账号和密码信息,如Wi-Fi的密钥、Windows的SAM文件、浏览器上网时登录网站的账号密码等,都可以通过内存取证技术获取和分析。
另外,内存中的数据往往比其在磁盘上的数据要新,仅依赖磁盘上的数据,会给取证人员的相关分析带来偏差。例如,Windows注册表、NTFS文件系统的MFT表等,往往先在内存中更新数据,过一段时间后才存储到磁盘。特别是在Windows取证工作中,常常会用到系统的Shim机制,内存中数据和硬盘数据文件的时间差异更加明显。微软使用Shim Cache来识别应用程序的兼容性问题。缓存数据能够追踪文件路径、大小、最后修改时间和最后一次运行的时间。如果一个文件以Windows进程的形式执行过,那么它的信息将会被记录到Shim Cache中。Shim Cache缓存是加载在内存中的,系统重启时才会更新磁盘中的数据。如果目标系统很久没有重启,仅依赖于硬盘文件记录的时间,就会大大影响取证分析的准确性。
总之,如果取证或者信息安全研究人员将内存看作一个数据或者信息流的整体背景,从系统中所有的操作和数据都离不开内存这点出发,就会发现,内存显然是一个更易于发现异常事件和痕迹的场所,同时,还不会受到操作系统的种种功能限制。内存取证技术为计算机取证和信息安全从业人员提供一个独特的视角来检视正在运行的系统,帮助他们解决信息安全中的实际应用问题,而不仅仅局限于获取系统的在线证据。
当然,内存取证也存在自身的局限性,主要体现在内存数据易于变化和丢失、内存取证和分析会受到软硬件发展的限制、内存分析技术还有待进一步研究等方面。
首先,内存中的数据特征是其易失性,很多类型的数据在内存中存留的时间很短。进程的所有信息会一直留在内存中直到运行结束,许多关键的数据在程序结束后也仍然存在于内存中,如最近的聊天记录、网络通信和其他用户活动。但是,当操作系统接受了新的内存空间分配请求时,就很可能会覆盖这些存有关键信息的内存区域。内存取证获取的仅是程序读取到内存作为缓存的数据,对整个程序数据的获取是不完整的。
其次,内存取证的前提条件是稳定完整地获取内存的镜像文件,而现代信息系统越来越重视对数据的保护、隔离和访问控制。在实际应用中,内存的获取受到各种各样的限制。例如,硬件获取内存模式会受到计算机外围接口、架构、功能设定、获取设备等的限制,有很大局限性。而且新的技术往往使原来的方法和工具失效,如通过硬件设备以DMA方式读取支持VT-d技术的计算机物理内存,获取的数据仅是该硬件设备被允许访问区域内存数据,并且该数据位置与实际计算机物理内存位置也不是对应的。例如,VT-d技术引发的系统安全性使通过DMA方式读写Mac OS X内存变得不可行。Intel引入的SGX技术也给内存的获取和分析带来极大的挑战。软件获取模式下,操作系统基于安全考虑,对用户模式访问系统内存做了一些限制,使获取镜像的难度加大。除安全和访问权限的限制外,技术的发展也会给获取完整内存镜像带来一些难度,如多核架构下,给内存获取工具的设计带来了一定的复杂度。RAM容量的增大造成软件获取内存镜像时会出现“拖尾”效应(Page Smearing)。即在获取到页表时和根据页表数据实际获取内存数据之间,存在一个时间差,当根据页表获取内存数据时,其数据已经发生了变化,因此会造成内存获取不稳定。智能移动设备的普及,给内存内容的获取带来了更大的挑战。Android系统的智能手机RAM中内存获取时往往需要root权限,解锁bootloader,针对各种各样的设备编译内核模块。而对于比较新的iOS系统的苹果手机,几乎无法用软件方法获取内存数据。
最后,在内存分析技术方面,仍然有很多工作要做。例如,结合内存交换文件(pagefile.sys)的内存分析;硬件、操作系统的更新也需要研究新的内存分析技术;针对更多用户应用(如浏览器、即时通信工具)的内存分析技术,需要更多的研究等。安卓智能手机的内存分析,目前大部分的方法还是基于Linux内核的内存分析。这种方法依赖很多条件:需要获得手机的内核源代码,需要获得目标系统中的内核符号表、内存空间分配的配置等信息。因此,现有方法离实践需求还有一定的差距,有待进一步深入研究。
本书在后续的章节中,将介绍内存取证主要的技术原理和实现,研究如何获取Windows、Linux、Mac和安卓操作系统的内存镜像文件,并从中分析得到系统中的进程、注册表、网络连接、服务等各种相关信息。帮助读者掌握内存分析和内存数据提取背后的原理和逻辑,在内存取证的实践中做到知其然,也知其所以然。
最后,本书用比较多的篇幅论述了内存取证技术的实践应用问题。①探讨了内存取证在云安全中的应用,通过获取和分析宿主机物理内存,检测出宿主机中正在运行的虚拟机,实现了从宿主机物理内存中提取虚拟机物理内存信息。在此基础上,对虚拟机逃逸行为检测和基于旁路的云安全威胁监控技术进行了描述和讨论。②论述了在未知PIN码、无法获取uKey硬件的情况下,利用内存分析技术绕过目标计算机对uKey的认证机制,并解除目标计算机上USB接口禁用的方法。③通过实例,介绍了Windows、Linux和Mac OS X中基于内存分析的恶意代码检测方法,从中读者可以体会到内存分析的检测方法与传统检测方式相比,有其独特优势。④详细介绍了内存分析技术最为实用的应用之一——利用内存取证技术对Windows、Mac、Linux操作系统下系统登录密码进行破解的方法。