APP下载

通过Glibc堆信息提取检测house of spirit类型攻击

2024-07-02翟继强王家乾韩旭孙海旭

哈尔滨理工大学学报 2024年1期
关键词:信息提取

翟继强 王家乾 韩旭 孙海旭

摘 要:目前有关堆的取证研究主要是针对Windows系统的堆和NT堆,然而怎样从转储文件中提取出Linux系统Glibc堆信息并没有得到充分的研究。为了重现Linux系统中Glibc堆的内部信息,采用内存对象vtype描述信息中字段偏移定位结合在内存中Glibc堆实现的方法提取Glibc堆内部信息。并基于此方法研发了基于Rekall框架的3个堆信息提取插件。还研究了house of spirit类型的堆攻击,建立了攻击模型并提取其攻击特征。基于提取的攻击特征设计出针对house of spirit攻击的检测算法。在堆信息提取插件的基础上研发了攻击检测插件。实验结果表明本方法可以有效地提取Linux系统进程中堆在内存中的信息,并且基于这些信息结合攻击检测算法成功检测内存中的house of spirit类型攻击。

关键词:Glibc堆;信息提取;堆攻击检测;Rekall框架

DOI:10.15938/j.jhust.2024.01.011

中图分类号: TP319  文献标志码: A

文章编号: 1007-2683(2024)01-0096-11

Detecting House of Spirit Attacks by Glibc Heap Information Extraction

ZHAI Jiqiang, WANG Jiaqian, HAN Xu, SUN Haixu

(School of Computer Science and Technology, Harbin University of Science and Technology, Harbin 150080, China)

Abstract:The current forensic research on heaps mainly extracts information from the heap and the NT heap of Windows However, the study of how to extract the information on the Glibc heap in the Linux from dump files is not sufficient To reproduce the internal information on the Glibc heap, this paper proposes a method to extract the internal information of Glibc heap in the Linux according to the field offset in the vtype description information of memory object combined with Glibc heap implementation in memoryBased on this method, three heap information extraction plugins were developed on the Rekall frameworkIn addition, the House of Spirit heap attack is studied, established an attack model, and extracted its attack featuresA detection algorithm for House of Spirit attack is designed based on the extracted attack features The attack detection plug-in is developed based on the heap information extraction pluginsThe experimental results show that this method can effectively extract the heap information in the memory of the Linux system process, and successfully detect the House of Spirit attack in the memory based on the information combined with the attack detection algorithm

Keywords:Glibc heap; information extraction; heap attack detection; Rekall framework

基金项目: 国家自然科学基金(61403109);国家自然科学基金(61402126);国家自然科学基金(61602133).

0 引 言

近年来,黑客经常通过网络传播恶意程序,当计算机染上恶意程序时,内存会留下痕迹,通过内存取证技术就可以捕获到这些痕迹[1]。堆中含有进程运行时的重要信息,提取出堆中的信息可以了解进程的运行情况[2],因此对堆的内存取证研究在信息安全的防护领域意义重大。

到目前为止,对用户空间进程堆的分析还没有得到足够的重视”[3]。Urrea、Case et al和Light et al主要研究涉及内核相关的工作[4-5]。Leppert和Macht研究的是分析应用程序和它们的堆数据[6-7]。然而他们的分析主要集中在堆中包含的序列化Java对象上,而不是堆对象的管理方式。其他已经存在的插件诸如cmdscan和bash[8],它们分别从Windows的cmd和Linux的bash shell提取命令历史。然而,这些插件的工作原理只是将堆作为一个大的内聚内存区域来识别其中可能存在的信息[9]。

此外,由Light等[10]进行的记事本程序的堆分析是唯一1个使用了堆细节的研究,但它也仅仅与Windows系统有关。在内存取证范围之外,也存在关于堆的基础研究[11],特别是关于Linux进程的堆以及如何管理堆的研究。Ferguson的研究有助于深入理解Glibc的堆实现[12]。然而这项研究更多地集中在利用堆的方式上,因此没有提供足够的信息来可靠地收集内存取证场景中堆的所有相关信息。

为了弥补这些缺陷,本文研究了多个版本的基于Glibc堆实现的Linux系统,并且基于内存中Glibc堆实现,结合字段信息偏移定位的方法,提取堆内部信息。经过测试,该方法能成功提取堆内部信息,并且基于这些信息成功设计出检测house of spirit堆溢出攻击的插件。本文研究的主要内容如下:

1)研究了多个Linux版本的Glibc堆实现及其在内存中的结构及字段的作用;

2)根据内存中Glibc堆实现,结合内存对象vtype描述信息中字段偏移定位实现提取Glibc堆内部信息的方法;

3)分析了house of spirit类型的堆攻击,建立其攻击模型并提取其攻击特征;

4)基于提取的攻击特性设计出针对house of spirit攻击的检测算法。在堆信息提取插件的基础上研发了攻击检测插件;

5)使用本文研发出的插件检测house of spirit攻击。

1 Glibc堆信息提取

1.1 内存中的Glibc堆实现分析

图1显示了正在运行进程的堆布局,重点是各个元素之间的引用。Chunk包含实际的用户/进程数据。通过malloc调用显式分配,这些块位于特定的内存区域中。

1.1.1 内存中的Arena和heap_info结构

主堆是一个连续的内存区域,被分割到vm_area_struct结构体描述的多个连续内存区域中。用于描述Main Arena的malloc_state数据结构存储于映射在内存中的Libc库中,在Main Arena中没有heap_info结构实例。

线程 Arena的malloc_state数据结构与堆块一起存储在同一内存区域中。在属于线程Arena的每个映射内存区域的开始处都存在1个heap_info结构的实例。除此之外,在此之后的heap_info结构最终都位于同一映射内存区域中。

如图2所示,灰色区域是vm_area_struct数据结构所描述的内存区域,蓝色标记的结构和块属于同一Arena,绿色标记的结构和块属于另一Arena。size成员存储的指针标记相对应heap_info结构所描述的内存区域的大小,ar_ptr成员指向其关联的Arena,prev成员指向同一Arena中的上1个heap_info结构。

1.1.2 内存中的已分配堆块

内存中的已分配块如图3所示。用户数据开始于size成员之后,一直到下1个区块的size成员。size成员后面的malloc_chunk结构的所有成员都会被用户数据覆盖。用户数据覆盖范围如图蓝色字段。

如果上一堆块为已释放堆块prev_size字段包含前一个区块的大小。否则prev_size成员为上1个已分配堆块用户数据的一部分。

1.1.3 内存中的已释放块和bins

初始态时,所有bins和fastbins都是空的。对于fastbins,它们的指针都初始化为零,而bins有1个指向它们自己的指针。每个bin都包含1个正向和反向链接。

图4显示了bins 正好包含1个块的情况。可以看到,实际释放的块引用Arena中的虚拟块,该块的fd和bk指针与bin 的指针相匹配。

图5为带有多个块的bins。bin的bk指针指向该bin的最后1个块,fd指针指向第1个块。第1个块的bk指针和最后1个块的fd指针都引用Arena中的虚拟区块,实现了1个循环双链表。

1.1.4 内存中的MMAPPED块

MMAPPED块通常位于vm_area_struct数据结构描述的专用内存区域中。没有来自malloc_state或heap_info等结构的指针引用内存区域或块本身。其大小为页面大小的倍数。此外,由于内核可以放大一个区域,多个MMAPPED块最终可能位于1个vm_area_struct数据结构描述的同一内存区域中。如果1个位于同一区域的两个或多个MMAPPED块之间的MMAPPED块被释放,则连续内存区域将被拆分为两个单独的区域。

1.2 基于Glibc堆实现的堆信息提取方法

本节根据内存对象vtype描述信息中字段偏移定位结合在内存中Glibc的堆实现提出了一种提取Glibc堆内部信息的方法。

1.2.1 堆初始化信息提取方法

当识别出取证文件为Linux系统的转储文件时,使用内存取证框架内置的扫描技术扫描内核空间并定位到task结构体,通过task结构体遍历VMA结构,获取Glibc库在内存中的位置,提取Glibc库中Main Arena的位置。根据内存对象vtype描述信息中字段偏移定位Glibc堆的相关数据结构并提取堆的信息。堆初始化信息提取方法的流程图如图6所示。

该方法可以重现进程运行时,堆的内部信息。该方法首先收集内存中所有的Arena,及其第1个堆块信息以及MMAP块的第1个堆块信息。通过收集到的初始信息,进一步收集内存中已分配及释放的堆块信息,通过bins列表收集bins表信息,从而实现对于堆的初始化信息提取。

1.2.2 堆块信息提取方法

当使用Glibc分配器分配堆块时,其堆块起始地址add加上size成员的值即下1个堆块的地址next_add,堆块size位的标志位PREV_INUSE指示前1个堆块是否为已释放堆块。该方法基于堆初始化信息提取方法所收集到的信息,遍历堆空间,基于malloc_chunk数据结构追踪程序已分配/释放堆块信息。提取的信息有已分配/释放堆块的数量、及堆块内部信息等。该方法执行的步骤如下:

步骤1:基于堆初始化信息提取方法所收集到的信息,定位Main Arenafirst_chunk位置;

步骤2:提取first_chunk地址,通过其地址及malloc_chunk数据结构追踪next_chunk;

步骤3:获取next_chunk相关数据结构的size位,识别标志位PREV_INUSE。判定前一堆块为分配对堆块还是释放堆块,保存在相应堆块列表中,指针保存在相应指针列表中。

步骤4:基于对初始化信息提取方法所收集到的信息,遍历Thread Arena列表,定位线程heap_info结构体位置,获取线程malloc_state,紧接着定位到Thread Arenafirstchunk,获取其地址。

步骤5:重复步骤2和步骤3。

步骤6:统计已分配/释放堆块的数量。

2 house of spirit攻击检测

2.1 house of spirit攻击原理及特征

堆分配器具有广泛的攻击面。一系列攻击的重点是利用分配器算法本身[13],例如特定的fastbin或smallbin实现。攻击者的目标是建立任意指针或任意代码执行[14]。任意指针尤其危险,因为它们可以用来操纵目标程序的控制流[15]。house of spirit攻击便属于此类攻击。

house of spirit攻击原理:①修改1个将被释放的堆指针,使其指向包含全局指针m_ptr的可控内存地址。②在可控内存区域中构建1个伪堆结构,绕过Glibc的检测机制。可控内存可以作为堆块释放到堆块的链表中。③在链表中的可控内存再次被应用后,可以实现m_ptr指针数据的可控性,并且可以写入任意地址。以实现任意地址可控。图7为house of spirit攻击过程的示意图。

因此,当程序中存在1个将要释放的可控堆指针时,意味着该程序满足house of spirit攻击的第1个攻击特征。

其次如果全局指针m_ptr附近存储空间为可控区域,并且在可控内存空间中存在伪造堆块。意味着该程序满足house of spirit攻击的第2个攻击特征。

最后释放受控内存区域,并将其再次分配为堆块。基于堆的特性,m_ptr变为可控数据,意味着满足house of spirit攻击的第3个攻击特征。此时攻击者可以通过修改全局指针数据的值来实现任意地址写入的目的。

2.2 house of spirit攻击分析及特征提取

为了实现对house of spirit攻击的自动检测,需要监控house of spirit攻击劫持控制流的过程,并在程序运行过程中收集程序控制流信息和堆块的操作信息。

为了消除保护机制对检测过程的影响,根据house of spirit的攻击过程设计了相应的数据体现过程,并建立了house of spirit攻击的攻击模型,如图8所示。

如果堆指针P是可控堆指针,则表示该程序满足house of spirit攻击的第1攻击特征。如果m_ptr指针附近的存储区域为可控的,并且在可控内存空间中存在构建的伪造堆块结构。则表示该程序满足house of spirit攻击的第2攻击特征。释放指针P,将包含m_ptr的可控内存空间作为堆块释放到堆链表中,然后再申请,将数据写入新创建的堆块中,修改m_ptr的值,实现任意地址写入,则表示该程序满足house of spirit攻击的第3攻击特征。最终实现控制流劫持。

2.3 house of spirit攻击检测算法

基于Glibc堆信息提取方法,动态追踪内存中程序用户空间进程堆信息。结合house of spirit攻击模型的3个攻击特征,设计针对house of spirit攻击的攻击检测模型,如图9所示。

针对第1攻击特性,本文设计了一种house of spirit第1攻击特征检测算法。基于堆信息提取所收集到的信息,获取已分配堆块列表Achunk和已释放指针列表Fpointer。当已释放指针列表新增释放指针FP时遍历Achunk检测其是否属于之前的已分配堆块,若其不属于之前的已分配堆块,则设置指针FP标志位Is_HouseOfSpirit为true。保存指针FP于特定列表。其所指向堆块保存在特定堆块列表中。

house of spirit第1攻击特征检测算法如算法1所示。

算法1 house of spirit第一攻击特征检测算法

输入:已分配堆块列表Achunk;

已释放堆块指针列表Fpointer;

将被释放的堆指针FP;

输出:house of spirit 第1攻击特征检测标志位

Is_HouseOfSpirit。foreach ( FP ){ if (FP not in Achunk ) {  FPchunk = Getchunk(FP);  FPchunk -> Is_HouseOfSpirit = true;  AddIs_HouseOfSpiritChunkList(FPchunk);  AddIs_HouseOfSpiritPointerList(FP); } else {  FPchunk = Getchunk(FP);  AddFpointer(FP);  DelAchunk(FPchunk);  FPchunk->Is_HouseOfSpirit = false; }

针对第2攻击特性,本文设计了一种house of spirit第2攻击特征检测算法。基于堆信息提取所收集到的信息,定位malloc_state结构体,获取bin表信息。当检测到新增释放指针P时,检索HouseOfSpiritPointer指针列表,当指针P属于该列表时,获取其所指向堆块的相关数据结构,识别该堆块size位的值,确认其属于哪个bin表,遍历该bin表,若存在则设置标志位Is_FakeHeapBlock。

house of spirit第2攻击特征检测算法如算法2所示。

算法2 house of spirit第2攻击特征检测算法

输入:Main Arena数据结构体malloc_state;

第1攻击特征指针列表HouseOfSpiritPointer;

新增释放堆指针P;

输出:house of spirit 第2攻击特征检测标志位

Is_FakeHeapBlock。

foreach (P){ if(P in HouseOfSpiritPointer) {  Pchunk = Getchunk(P);  size = Getsize(Pchunk);  bins = Getbins(malloc_statesize);  if(Pchunk in bins)  {   Pchunk->Is_FakeHeapBlock = true;  Fakechunk = Heapchunkdump(P,size);  }  else  {   Pchunk->Is_FakeHeapBlock = false; Del(HouseOfSpiritPointer(),P) ;  Del(HouseOfSpiritChunk(),Pchunk); } }}

针对第3攻击特征,本文设计了一种house of spirit第3攻击特征检测算法。基于Is_HouseOfSpirit检测组件及其Is_FakeHeapBlock检测组件所提供信息,获取疑似攻击列表。当检测到新增分配指针P时,检索HouseOfSpiritPointer指针列表,获取其所指向的堆块,追踪新分配堆块,在新分配堆块内查找变化指针,其指向控制流,即shellcode。

house of spirit第3攻击特征检测算法如算法3所示。

算法3 house of spirit第3攻击特征检测算法

输入:第1攻击特征指针列表HouseOfSpiritPointer;

新增分配堆指针AP;

输出:house of spirit 第3攻击特征检测标志位

Is_PtrContorl。

foreach (AP){ if(AP in HouseOfSpiritPointer) {  if(AP->Is_HouseOfSpirit = true)  {  if(AP->Is_FakeHeapBlock = true)  {Allochunk = Getchunk(AP); if(Fakechunk != Allochunk)  AP->Is_PtrContorl = true;

基于上述3点,对house of spirit攻击进行识别检测。当程序满足上述3点,被认定为house of spirit攻击。

即:House_HiJack=Is_HouseOfSpirit && Is_ FakeHeapBlock && Is_PtrContorl。

3 插件的设计与实现

3.1 内存取证框架

本文研发的功能插件,都是基于内存取证框架实现的[16]。内存取证框架可以从转储文件和硬件磁盘镜像中解析休眠文件与页面文件信息,通过这两个文件信息的对比能获取隐藏进程的证据,而且还可以使用可执行页面检测算法遍历内存页并恢复可执行页面,帮助调查人员识别代码注入等[17]。

Rekall框架是 Google 开发的内存分析框架,是开源平台,可以提供可视化的系统运行状态,为相关的开发人员提供更多相关的数据和材料。

Rekall中含有各个Windows 10系统版本的配置文件,使用时不需要进行额外的制作[18]。然而Linux操作系统由于其内核版本、子内核版本和定制内核的数量众多,需要使用者自己进行制作[19]。配置文件里面组合了许多vtype 描述信息。在对内存对象进行分析的时候,这些信息可以让Rekall框架对转储文件中的数据进行解析。

3.2 Heapinit插件

Heapinit插件是基于内存取证框架实现的,该插件提取所有的Arena,及其第1个堆块信息以及MMAP块的第1个堆块信息。

Heapinit插件基于堆初始化信息提取方法实现,相关伪代码如下所示:

if profile is Linux:

if taskmmdereference is vaild:  task<—Gettaskstruct  process_as<—Get_process_address_space()  vmas = Get_vmas_for_task(task) if vmas :  Load_libc_profile()  libc_offset = Get_libc_offset(vmas) if libc_offset:   Main_arena = libc_offset    +libc_profilemain_arena_offset   Initialize_arenas(Main_arena)   Initialize_heap_first_chunks()   Initialize_mmapped_first_chunk()   check_and_report_size_inconsistencies()

3.3 Heapchunkinfo插件

该插件输出的信息有已分配/释放堆块的数量、及堆块信息等,Heapchunkinfo插件基于堆块信息提取方法实现,相关的伪代码如下:

Heapinit<—GetHeapinit()

while(Currentchunk.add< Topchunk.add):

KNextchunk <—Currentchunk.add+Currentchunk.size

if(Nextchunk.PREV_INUSE):

Add(MainAllocatedChunk(), Currentchunk)

Add(MainAllocatedchunkPointer(),Currentchunk.add)

MainAllocatedChunkNum++

else:

Add(MainFreedChunk(), Currentchunk)

Add(MainFreedChunkPointer(),Currentchunk.add)

MainFreedChunkNum++

for arena in Theard_Arena:

heapinfo<—arena.heapinfo

Currentchunk<—heapinfo.firstchunk

while(Currentchunk.add< Topchunk.add):

Nextchunk <—Currentchunk.add+Currentchunk.size

if(Nextchunk.PREV_INUSE):

Add(ThreadAllocatedChunk(), Currentchunk)

Add(ThreadAllocedchunkP(),Currentchunk.add)

ThreadAllocatedChunkNum++

3.4 House_HiJack插件

House_HiJack插件用于检测house of spirit攻击。针对house of spirit攻击模型总结出其三种攻击特征。针对三种攻击特征设计针对性的检测组件。

3.4.1 Is_HouseOfSpirit组件

基于house of spirit第1攻击特征检测算法,实现Is_HouseOfSpirit检测组件的相关伪代码如下:

Heapinit<—GetHeapinit()

Achunk<—MainAllocatedChunk()

Fpointer <—MainFreedChunkPointer()

FP<—GetAddMainFreedChunkPointer()

if FP in Achunk:

Del(MainAllocatedChunk(), Getchunk(FP))

Del(MainAllocatedChunkPointer(), FP)

else:

FP.IS_HouseOfSpirit = true

Add(HouseOfSpiritPointer(),FP)

Add(HouseOfSpiritChunk(),Getchunk(FP))

3.4.2 Is_FakeHeapBlock组件

基于house of spirit第2攻击特征检测算法,实现Is_FakeHeapBlock检测组件的伪代码如下:

Heapinit<—GetHeapinit()

main_arena<—Heapinit.main_arena

bins<—GetBins()

P<—GetAddMainFreedChunkPointer()

if P in HouseOfSpiritPointer:

Pchunk<—Getchunk(P)

size<—Pchunk.size

if Pchunk in Bins(size):

P.Is_FakeHeapBlock = true

else:

Del(HouseOfSpiritPointer(),P)

Del(HouseOfSpiritChunk(),Pchunk)

3.4.3 Is_PtrContorl组件

基于house of spirit第3攻击特征检测算法,实现Is_PtrContorl检测组件的伪代码如下:

Heapinit<—GetHeapinit()

P<—GetAddMainAllocatedChunkPointer()

PA<—GetMainAllocatedChunkPointer()

if P in HouseOfSpiritPointer&& P.Is_FakeHeapBlock:

Pchunk<—GetHouseOfSpiritChunk(P)

Heapchunkdump(Pchunk)

PAchunk<—GetChunk(PA)

Heapchunkdump(PAchunk)

if Pchunk != PAchunk:

P.Is_PtrContorl=true

shellcode<—GetPointer(PAchunk)

else:

Del(HouseOfSpiritPointer(),P)

Del(HouseOfSpiritChunk(),Pchunk)

4 测试与分析

测试分为堆信息提取测试和house of spirit攻击检测测试两部分,堆信息提取测试是为了验证插件能否在内存空间中有效提取堆的相关信息,house of spirit攻击检测测试是为了验证插件是否能有效检测出house of spirit攻击。实验环境如下:

主机操作系统为Linux内核版本4.9.5-5.7.17 64位,CPU为220GHz,内存大小8G,硬盘容量2T。

4.1 堆信息提取测试

选取init进程和gnome-keyring-d进程作为实验对象,在495版本、5312版本、5717内核版本的Linux系统中运行gnome-keyring-d程序,随后分别对系统内存进行转储生成转储文件,使用本文研发好的3个堆信息提取插件分别提取init进程和gnome-keyring-d进程中的堆信息。

以init进程pid=1为例,图10显示了Heapinit插件的运行来获取Main Arena的位置及其定位的主堆第一个堆块位置及信息。

同样以init进程pid=1为例,图11显示了Heapchunkinfo插件获取的进程的部分已分配堆块的位置信息。

表1显示了对于不同进程,Heapchunkinfo插件运行后收集到的堆块相关信息。

从表1中可以看到该插件可以有效地提取出不同版本Linux系统不同进程用户空间进程堆中的堆块相关信息。

实验结果表明本文研发的插件能成功地提取出不同Linux版本的用户空间进程堆信息。随着Linux系统的更新,用户空间进程堆及其结构中字段位置发生了一些变化,当使用vtype描述信息解析堆时,根据信息名称就能进行解析,因此本文研发的插件具有较强的兼容性。

4.2 堆溢出攻击检测测试

House_HiJack使用堆信息提取插件所收集的信息。检测是否触发house of spirit攻击时存在的3个攻击特性:Is_HouseOfSpirit、Is_FakeHeapBlock和Is_PtrContorl。如果该程序只包含某些特征,则意味着该程序包含house of spirit攻击,但危害程度较低,或者该程序不包含house of spirit攻击。如果该程序包含所有三个攻击特征,则意味着该程序不仅包含house of spirit攻击,还包含危险程序。

4.2.1 house of spirit攻击检测测试

以house_of_ spirit_text程序的自动检测和追踪为例,演示House_HiJack的检测过程。图12显示了house_of_ spirit_text测试程序的关键触发代码。

如代码所示,将数据写入输入指针时存在溢出漏洞。可以溢出并修改bin[0]的值,以写入指向任何内存地址的输入指针。然后通过输入数据来构造1个伪堆块结构,当程序释放bin[0]时,会触发house of spirit攻击。此时,当程序应用相同大小的堆块时,可以将目标内存作为堆块结构应用,攻击者可以修改关键指针的数据,以达到任意地址写入的目的。

通过监视程序即将释放的堆指针。当堆指针即将释放时,Is_HouseOfSpirit组件触发第1攻击特性检测算法以检查指针变化。如果释放指针不属于已知已分配堆块,则触发house of spirit第1攻击特征。如图13所示。检测到了house of spirit第1攻击特征。

在检测到house of spirit第1攻击特征后,在程序内存空间中搜索堆内存,若发现伪造堆块则检测到house of spirit第2攻击特征。识别的伪造堆块如图14所示。

在检测到house of spirit第2攻击特征后,将检查关键指针数据的可控性。如果指针数据是符号值,则表示关键指针数据发生了变化,追踪控制流。指针数据变化检查结果如图15所示。

4.2.2 house of spirit攻击检测测试结果

本文从shellphish / how2heap测试集中选取5个具有堆溢出漏洞的实验程序进行验证。

为了更好地反映系统的效果,比较了插件与现有漏洞攻击检测技术的差异。在实验期间,每个测试程序都提交给House_HiJack和CRAX系统进行测试。

CRAX系统是SKHuang等提出的一种基于动态符号执行和着色分析技术研发的house of spirit类型攻击检测工具[20]。通过监控程序的动态运行过程来检测IP劫持的状态,使用动态符号执行和着色分析技术来监视程序运行过程中的程序控制流和数据流状态信息,对触发house of spirit漏洞触发点的符号数据的关键信息进行监控,构造触发house of spirit攻击的数据约束,并求解约束条件,可有效的对该类型攻击进行检测。

测试用例生成如表2所示。其中t1表示系统完成实验样本分析与检测所需的时间,t2表示系统完成控制流追踪所需的时间。

表2中的结果表明,CRAX系统和本文研发的系统都可以成功检测全部5个house of spirit类型的堆溢出攻击。

通过比较t1与t2的数据可以看出。CRAX系统对测试程序的分析时间短于本文提出的检测方法,但CRAX系统无法为所有五个测试程序追踪控制流。House_HiJack系统为其中3个程序成功追踪控制流代码。

这表明CRAX系统虽然能快速的检测其是否为house of spirit类型堆溢出攻击,但无法定位其最终的自由指针变化过程,无法追踪其shellcode。而本文研发的系统可以成功定位该类型攻击的控制流,通过控制流获取shellcode。这表明本文提出的检测方法是有效的。

House_HiJack插件对每个测试程序的检测过程进行详细记录和分析,结果如表3所示。

从表3可以看出,对于pwn200、shaxian和house_ of_spirit_test 3个测试用例,插件可以检测到house of spirit第1攻击特征、第2攻击特征和第3攻击特征3个关键特征。因此,可以在3个攻击特征检测的同时追踪构造相应的伪堆块和关键指针数据变化,从而追踪控制流,以获得最终的shellcode代码。house_ of _spirit和example测试用例只能检测house_of _spirit第1攻击特征和第2攻击特征,但无法检测到第3攻击特征,表明测试用例已经实现了对要释放的指针数据的修改,并伪造了堆块结构,但没有进一步的指针利用,因此无法追踪控制流。

5 结 论

本文提出了一种在Linux下检测house of spirit类型攻击的技术。该技术利用动态追踪用户空间进程堆信息。为了提取出Glibc堆中的信息,本文分析了Glibc在内存中的堆实现,堆结构中含有的字段并结合内存取证框架和字段在结构信息中的偏移量,设计出提取Glibc堆及其内部信息的功能插件,这些插件可以解析Linux系统中用户空间进程堆内部含有的信息。

在此基础上,提出了一种house of spirit型堆溢出漏洞自动检测模型。基于该模型,实现了house of spirit型堆溢出漏洞的检测与控制流追踪。

实验结果表明本文提出的方法可以重现进程运行时堆及其内部组件在内存中的分配情况,进而反映进程中堆内存信息,通过利用这些信息成功的检测出Linux平台下house of spirit类型攻击的存在并追踪控制流。

参 考 文 献:

[1] MOSLI R, LI R, YUAN B, et al. Automated Malware Detection Using Artifacts in Forensic Memory Images[C]//2016 IEEE Symposium on Technologies for Homeland Security (HST). USA :IEEE, 2016:1.

[2] JEONG D, LEE S. Forensic Signature for Tracking Storage Devices: Analysis of UEFI Firmware Image, Disk Signature And Windows Artifacts[J]. Digital Investigation, 2019, 29:21.

[3] CASE A, RICHARD G. Memory forensics: The path forward[J]. Digital Investigation, 2017,20:23.

[4] 张瑜,刘庆中,李涛,等.内存取证研究与进展[J].软件学报,2015,26(5):1151.

ZHANG Yu, LIU Qingzhong, LI Tao, et al. Research and Development of Memory Forensics[J]. Journal of Software, 2015,26(5):1151.

[5] HEDBERG T D, KRIMA S, CAMELIO J A. Embedding X.509 Digital Certificates in Three-Dimensional Models for Authentication, Authorization, and Traceability of Product Data[J]. Journal of Computing & Information Science in Engineering, 2017,17(1):011008.

[6] KIM D, KWON B J, DUMITRA T. Certified Malware: Measuring Breaches of Trust in the Windows Code-Signing PKI[C]//2017 ACM SIGSAC Conference on Computer and Communications Security.New York: ACM, 2017:1435.

[7] UGARTE-PEDRERO X, GRAZIANO M, BALZAROTTI D. A Close Look at a Daily Dataset of Malware Samples[J]. ACM Transactions on Privacy and Security, 2019,22(1):1.

[8] 翟继强,陈攀,徐晓,杨海陆.面向Windows 10系统段堆的内存取证研究[J].西北工业大学学报,2021,39(5):1139.

ZHAI Jiqiang, CHEN Pan, XU Xiao, Yang Hailu. Research on Memory Forensics for Windows 10 System Segment Heap [J]. Journal of Northwestern Polytechnical University,2021,39(5):1139.

[9] Description of User Account Control and Remote Restrictions in Windows Vista [EB/OL]. (2020-9-18)[2020-12-09].

[10]Sigcheck v2.81[EB/OL].(2020-9-17)[2020-12-09].

[11]UROZ D, RICARDO J. On Challenges in Verifying Trusted Executable Files in Memory Forensics[J]. Digital Investigation, 2020,32:300917.

[12]SYLVE J T, MARZIALE V, RICHARD G G. Pool Tag Quick Scanning for Windows Memory Analysis[J]. Digital Investiga-tion, 2016,16:25.

[13]翟继强,徐晓,陈攀,等.基千元数据和指令流的 64 位 Windows 堆栈取证[J].哈尔滨理工大学学报,2021,26(5):51.

ZHAI Jiqiang,XU Xiao,CHEN Pan,et al.Stack Forensics Based on Meta Data and Instruction Flow of 64-bit Windows [J].Journal of Harbin University of Science and Technology,2021,26(5):51.

[14]ZHANG N, ZHANG R, SUN K, et al. Memory Forensic Challenges Under Misused Architectural Features[J]. IEEE Transactions on Information Forensics & Security, 2018,13(9): 2345.

[15]ZHU W T, LIN J. Generating Correlated Digital Certificates: Framework and Applications[J]. IEEE Transactions on Information Forensics & Security, 2016, 11(6):1117.

[16]PANDEY A K, TRIPATHI A K, KAPIL G, et al. Current Challenges of Digital Forensics in Cyber Security[J]. Critical Concepts, Standards, and Techniques in Cyber Forensics, 2020: 31.

[17]PARIDA T, DAS S. PageDumper: a Mechanism to Collect Page Table Manipulation Information At Run-time[J]. International Journal of Information Security, 2021, 20(4): 603.

[18]VOLATILITY: An Advanced Memory Forensics Framework[EB/OL].(2020-11-11)[2021-6-18].

[19]ZHAO X, HUANG S, PAN Z, et al. Buffer Overflow Vulnerability Detection Based on Unsafe Function Invocation[J]. Journal of Physics: Conference Series, 2020, 15(9):1145.

[20]HUANG S K, HUANG M H, HUANG P Y, et al. Crax: Software Crash Analysis for Automaticexploit Generation by Modeling Attacks as Symbolic Continuations[C]// In 2012 IEEE Sixth International Conference on Software Security and Reliability, IEEE, 2012: 78.

(编辑:温泽宇)

作者简介:王家乾(1997—),男,硕士研究生;

韩 旭(1997—),男,硕士研究生.

通信作者:翟继强(1972—),男,博士,教授,硕士研究生导师,E-mail:zaijiqiang@163.com.

猜你喜欢

信息提取
建筑电气设计中BIM技术的应用研究
基于Clang的AST提取结构体数据库插件的实现
改正通告检查中若干问题的分析研究
改正通告检查中若干问题的分析研究
改正通告检查中若干问题的分析研究
改正通告检查中若干问题的分析研究
基于ICA面向对象的耕地信息提取
享游景区服务系统的开发和研究
Excel函数在学生日常管理中的应用
基于遥感数据的雾物理属性信息提取