3.1 基于软件的内存获取技术和工具
基于软件的内存镜像获取方式依赖于操作系统提供的物理内存访问技术,这是在线取证中获取物理内存镜像的关键技术。
在较低版本的操作系统中,一般都提供了直接访问系统物理内存的对象或设备,基于此,取证人员可以直接在用户模式下读写系统物理内存数据。随着系统对安全性需求的不断增长,较高版本的操作系统中,不再支持上述对象或设备的访问。而运行在核心态的驱动程序,能将虚拟地址空间映射为物理地址空间,从而访问物理内存地址。如果还想在用户模式下读写系统物理内存数据,就需要自己开发相应驱动或内核扩展程序实现对内存数据的访问。因此,按照实现原理划分,获取内存镜像的软件可分为两类:利用对象或设备直接读取物理内存的软件和利用驱动或内核扩展读取物理内存的软件。
3.1.1 利用对象或设备直接读取物理内存的软件
在Windows XP系统中,各种资源以对象(Object)的形式组织。Windows XP提供了一个位于\Device路径下的Section内核对象PhysicalMemory。使用sysinternals(引用网址)工具查看到的此对象如图3-1所示。通过系统提供的应用程序编程接口(API,ApplicationProgramming Interface)函数对该对象进行读取,用户程序就实现了对物理内存的访问。在内存取证研究的初期出现了一些在用户空间内获取内存数据的软件,其中较为出名的是2009年Garner为FAU套件编写的Data-Dumper(dd)、mdd、dumpmmf,它们都可以通过访问\Device\PhysicalMemory获取内存数据[6]。
图3-1 /Device/PhysicalMemory对象
最初的Linux和Mac操作系统中,内存获取方法并不需要第三方软件,操作系统本身提供了可以读写物理内存的特权应用程序。调查人员可以使用dd读取/dev/mem设备来获取Linux/Mac OS物理内存,并将物理内存以文件的形式进行存储或者通过网络传输的形式传输至取证机器。
(1)Windows系统下获取内存的软件
①dd
当用户以管理员权限运行dd时,工具通过调用内建的\\.\Device\PhysicalMemory内存区对象来创建目标机器的内存dump文件。
②process dumper utility
此工具能够转储一个正在运行的进程内存空间,包括该进程空间内所有的数据和代码。除此之外该工具使用元信息描述不同的映射并保存进程环境和状态。
③mdd
mdd是ManTech International Corporation开发的获取Windows系统物理内存镜像的工具,它可以获取Windows 2000、Windows XP、Windows Vista和Windows Server系统的内存镜像,对于Windows XP SP1及其以下版本的内存镜像的获取,它是通过读取\\.\Device\PhysicalMemory内存区对象实现的。
(2)Linux\Mac OS下获取内存的软件
①/dev/mem
/dev/mem是操作系统提供的一个对物理内存的映射。首先使用open函数打开/dev/mem设备,然后使用mmap映射到用户空间实现应用程序对内存信息的读取。然而/dev/mem的映射区域有限,只映射了RAM的896 MB地址,通过它无法完全获取更大的RAM。因此,目前较为主流的Linux版本不再支持此设备的映射。Mac OS X 10.4以后的版本也删除了/dev/mem文件。
②/dev/kmem
和/dev/mem不同的是,/dev/kmem是虚拟内存的映射,使用者可以以用户态直接访问内核虚拟地址空间。这样会给系统安全带来隐患,因此目前Linux主流发行版已经禁止使用/dev/kmem设备。
③Ptrace
Ptrace[7]是Linux本身提供的用户态调试接口,此接口适用于对某个进程的内存空间信息获取,而不是对全部内存信息的获取。首先通过读取/proc//maps获取指定进程的地址空间范围,然后对内存信息逐页获取存至磁盘。
④/proc/kcore
/proc/kcore文件将内核的虚拟地址空间以ELF(Executable and Linking Format)文件的形式导出在用户空间,在32 bit系统中,获取地址局限在896 MB以内。不过通过此文件获取内存的步骤较为繁琐,需要专门的工具配合使用获取内存信息。
随着操作系统对安全权限等的重视,现在主流操作系统上,运行在用户态的程序已经无法获取完整的物理内存镜像。
3.1.2 利用驱动或内核扩展读取物理内存的软件
用户模式的进程不允许执行CPU的一些指令,对系统数据、地址空间以及硬件的访问是受到严格限制的。因此,从用户模式访问系统的全部物理内存数据,需要将一个内核模式驱动程序装载到系统中并调用它,从而利用驱动拥有的权限对底层硬件(物理内存)信息进行读写操作。以下介绍常见的软件工具。
(1)Windows下获取内存的软件
①win32dd
win32dd是由suiche开发的一款运行于内核级的内存获取工具(可从moonsols网站下载),该工具的运行要求用户具有管理员权限,通过MmMapIoSpace()映射函数实现对内存的映射。
②Memoryze
Memoryze是一款由Mandiant开发的免费的内存取证软件(可从mandiant网站下载)。它可以帮助取证调查人员镜像内存或从实时内存中分析关键信息。
③Windows Memory Reader
Windows Memory Reader[8]是一款由National Institute of Justice提出的免费获取物理内存的命令行工具,该工具支持对32 bit和64 bit Windows XP-Windows 8系统物理内存的获取。调查人员可以通过该工具获取设备的内存映射数据,如共享的video设备的内存。
除此之外,还有很多提供了内存镜像功能的软件,如Encase(可从Guidance Software官网获得)和FTK Imager(可从Access Data网站下载)等。
(2)Linux\Mac OS系统下获取内存的软件
①Memdump
虽然使用dd或者dc3dd可以通过读取/dev/mem获取Linux系统物理内存,不过Linux系统版本众多,物理内存管理机制不尽相同,在使用dd的过程中出现不兼容或者获取不全的情况。针对此问题,Coroner取证包中的Memdump工具跳过内存映射将系统内存转储到标准输出流,且可以在Solaris、FreeBSD、RedHat、OpenBSD以及SunOS等多个系统中使用。
②fmem
为了解决/dev/mem无法获取较大内存的问题,fmem(可从github下载)通过加载一个名为/dev/fmem的内核驱动来访问物理内存空间。和/dev/mem相比,/dev/fmem在获取前通过调用page_is_ram函数检查所获取的物理页是否为系统物理内存后再进行获取,防止调查人员意外读取设备所占用内存或未映射的物理地址而引起系统崩溃。/dev/fmem可以获取较大范围的物理内存。/dev/fmem存在的不足在于调查人员需要手工通过读取/proc/iomem文件获取系统物理内存的范围,如下所示,操作系统版本为Ubuntu14.04(3.13.0-32-generic)、内存大小为0x12F800000的系统内存地址范围如下。
③SecondLook
SecondLook是一款商业安全产品,可以用于Linux系统的内存取证和完整性扫描,并对物理内存中存在的未知和潜在恶意代码进行报警。SecondLook提供了本地和远程两种内存获取方式,本地获取方式通过在本机中运行命令行脚本获取物理内存,远程获取方式通过调用目标系统中的内存获取代理程序目标系统中的物理内存信息。除了提供内存获取功能外,SecondLook也可以通过分析检测系统中存在的恶意程序、隐藏的rootkit以及后门等恶意行为来实时分析系统物理内存。
④LiME
LiME(Linux Memory Extractor)是目前使用较为广泛的内存获取工具(可从github下载),是一种可加载内核模块(LKM,Loadable Kernel Module),以此获得Linux设备中易失性存储器中的内容。使用LiME时首先加载一个内核驱动,然后在用户态调用内核驱动获取内存信息,减少了获取过程中用户和内核空间进程之间的互动,提高了获取性能。另外,在获取过程中,LiME通过枚举内核中的iomem_resouce链表获取物理内存段信息,按照分段信息的起始和终结地址依次获取内存,且可以处理物理内存较大的目标设备。
LiME提供了3种获取内存格式:raw、padded和lime。raw格式是指获取全部物理内存段的物理内存;padded是指除获取物理内存段物理内存外,其他段以0填充;lime除获取物理内存外,每段内存段前附加了格式为lime_header结构体的数据。
⑤Mac Memoryze
Mac Memoryze(可从mandiant网站下载)可以获取Mac OS X 10.6~Mac OS X 10.8的内存。该软件输出raw格式的内存转储文件。
除了内存获取功能,Mac Memoryze具有基本的内存分析功能:获取进程链表、转储进程内存空间、显示每个进程加载的库和建立的网络连接、获取加载的内核扩展、分析系统调用表hook。
⑥Mac Memory Reader
Mac Memory Reader是一款镜像Mac OS X物理内存的免费(非开源)命令行工具(可从cybermarshal下载)。该软件支持Mac OS X 10.6~Mac OS X 10.8版本。
Mac Memory Reader包括一个用户级的组件和一个内核扩展。加载成功后,内核扩展创建两个设备文件。
/dev/mem:该设备的操作原理与原来存在于Mac OS X的/dev/mem类似,它导出物理内存内容,使用户级别的组件可以访问物理内存。
/dev/pmap:该设备导出物理内存范围。
用户级工具首先通过访问/dev/pmap文件获取物理内存范围的偏移和大小;然后通过读取/dev/mem获取相应数据内容。Mac Memory Reader通常将内存样本保存为Mach-O文件格式,该格式将在Mac OS X内存分析技术一章(第9章)中进行详细讲解。除了支持导出Mach-O文件格式的内存转储文件,该软件还通过某些选项的支持导出其他格式的内存转储文件。
H:使用MD5、SHA-1、SHA-256或SHA-512计算内存样本散列值,在获取工作完成后,该值被写入stderr。
p:将物理内存以raw格式写入转储文件,但是不会填充RAM区域之间的空白区域。这就导致了物理内存中的物理偏移地址与内存转储文件的物理偏移地址是不一致的。因此,一般的物理内存分析工具无法从该格式的内存转储文件中分析出结构化的信息。
P:将物理内存以raw格式写入转储文件,会填充RAM区域之间的空白区域。该格式文件可以被物理内存分析工具分析,但是比较浪费磁盘空间(对同一物理内存来讲,该格式的内存转储文件占用的磁盘空间要大于Mach-O文件格式的内存转储文件)。
k:创建/dev/mem和/dev/pmap文件的专用模式,该模式下,不获取内存转储文件。借助这两个文件,取证人员可以使用其他工具来读取正在运行的系统中的任意内存区域。
⑦OSXPMem
OSXPMem是rekall开发包中pmem套件的一部分,它能快速便捷地获取基于Intel的Mac OS物理内存镜像,该工具支持多种输出格式:Mach-O、ELF、AFF4和zero-padded RAW。
AFF4(Advanced Forensic Framework 4)是由Michael Cohen、Simson Garfinkel、Bradley Schatz所设计的一种取证文件格式。传统的文件格式存在某些缺陷,具体如下。
·EWF格式难以实现和解释。
·dd文件格式在不压缩时非常大,并且没有元数据、数字签名和密码学算法的支持。
·传统的文件格式被设计为存储单一的数据流,然而,在实际调查取证工作中,某些时候需要同时获取多元数据并存储在同一个证据卷中。
·传统的文件格式仅处理数据,并没有结合文件说明构建一个统一的证据管理系统。
基于此,提出的AFF文件格式支持密码算法、数字签名、压缩以及外部引用。AFF4是AFF的一个扩展,是一个面向对象的结构,因此,可以通过唯一的名字来访问它。例如,一个AFF4对象可命名为urn:aff4:f3eba626-505a-4730-8216-1987853bc4d2。