G.O.S.S.I.P 阅读推荐 2022-04-13 LOGICMEM

admin 2022年4月13日14:56:20评论57 views字数 2932阅读9分46秒阅读模式

今天给大家推荐的论文是来自加州大学河滨分校尹恒研究组投稿的对内存快照分析的工作LOGICMEM: Automatic Profile Generation for Binary-Only Memory Forensics via Logic Inference,该工作目前已经被NDSS 2022录用。


G.O.S.S.I.P 阅读推荐 2022-04-13 LOGICMEM


内存分析与取证是计算机取证科学的重要分支。通过对内存数据的分析,可以重构出原系统中运行程序状态,进程信息,网络连接,系统状态等等敏感数字证据。此类信息传统取证方法难以获取,只有通过分析物理内存镜像与页面交换文件的二进制数据才能获得。

内存分析与取证工具利用内核符号(函数地址,数据结构地址)和内核数据结构的内部结构(layout)实现从内存快照中直接读取信息进行取证。在内存分析与取证中, 内核符号和数据结构的layout又被称为内核profile。通常来讲,内核profile可以通过编译可加载内核模块时产生的调试符号表获得。然而,此种方法生成的profile虽然准确,但其可行性取决于是否有内核源码,内核编译环境, 以及当前内核编译配置 (configuration)。然而,在实际内存分析与取证过程中,往往只提供内存快照(memory dump/snapshot)。例如,在犯罪现场调查中,为确保证据完整性,调查者会对电子设备进行内存快照并基于快照展开分析。又比如,对于IoT设备,或者服务器生产环境,由于权限,编译工具不存在, 内核头文件是否存在等原因,通过编译内核模块的方法来生成profile往往是不可行的。因此,不依赖源码编译(binary-only)的profile生成方法尤为重要。

生成内核profile最主要的步骤是生成内核数据结构的内部layout, 即结构体成员的偏移位置(offset)。现有的方法基本上都通过分析内核函数的二进制代码来获得偏移位置(offset)。在内核函数访问结构体成员时,会通过结构体基址加偏移的指令来访问,此时偏移位置可在函数的二进制码中获得。现有方法通过静态分析内核函数二进制指令或者动态模拟执行内核函数来获得结构体成员的偏移位置。然而,实验结果表明,此类方法难以实现很高的准确率和召回率。


方法介绍

本文提出了一种基于逻辑规则推理的profile生成方法。通过预先分析结构体成员符合的特征,将其总结为逻辑规则,并利用自动化逻辑推理工具,从而定位出结构体成员在二进制内存中的位置。相比于现有解决方案,该方法无需依赖内核源码,编译工具,及内核编译配置(configuration),可直接对内存快照进行分析,并且分析结果有很高的准确率和召回率。


步骤1, 内核结构体演变分析

Linux内核作为一个大型开源项目,经历过无数次更新于维护。通过对47个不同版本的内核进行分析,我们发现用于内存取证的结构体及其成员在历次内核更新中几乎无变化。因此,我们总结了这些内核成员的三种稳定特征:

  1. 类型特征:此类结构体成员的类型在内核升级中保持不变。

  2. 顺序特征:此类结构体成员的相对位置顺序保持不变。

  3. 范围特征:此类结构体成员在结构体中的大致位置保持不变。

我们对用于内存取证的56个不同的内核结构体以及其中220个结构体成员进行分析(表一),并总结其在内核升级过程中的稳定特征,将其转换为逻辑规则,用于推理这些结构体成员在内存中的位置。


G.O.S.S.I.P 阅读推荐 2022-04-13 LOGICMEM


步骤2. 收集逻辑事实 

内存快照由二进制数据组成。在此步骤中,我们将二进制数据转换为可用于逻辑分析的逻辑事实。如图四,逻辑事实为三类基本数据类型,指针(pointers),字符串(strings),与数字(numbers)。

  1. 指针:对于一个8字节的数据,如果其可以被翻译成一个有效的物理地址,我们将及认定为一个指针数据。

  2. 字符串:内核结构体中的字符串往往代表进程名称或模块名称。因此,如果其每一个字节都符合命名规则,并以NULL结尾,我们将其认定为一个字符串数据。

  3. 数字:如果该数据不属于指针或字符串类型,我们将其认定为一个简单的数字。


G.O.S.S.I.P 阅读推荐 2022-04-13 LOGICMEM


步骤3. 定义逻辑规则

基于上述特征,我们定义了七种逻辑规则。利用这些规则,我们在所收集的逻辑事实中定位符合规则的结构体成员。

  1. 类型规则:结构体成员的数据类型不变。例如,pid为一个四字节整数,comm为一个字符串,代表进程名称。

  2. 结构体类型规则:某些指针结构体成员指向另一个结构体。因此,我们可以对其指向的结构体定义规则。例如,active_mm指向mm_struct,通过对mm_struct定义一套规则,可以帮助我们更好的定位active_mm这一成员的位置。

  3. 顺序规则:结构体中成员间的相对顺序保持不变。例如,在task_struct这一结构体中,parent成员被定义在tasks成员之后。因此当我们推理出tasks成员的位置后,我们只需要在tasks成员之后的逻辑事实中定位parent成员。

  4. 相邻规则:某些结构体成员定义位置相邻,并在内核代码升级中保持不变。例如,pid和tgid成员在结构体定义中相邻,因此,其在内存中的相对位置固定为4字节。又如,mm和active_mm成员相对位置固定为8字节。

  5. 结构整体规则:某些结构体成员数量少,并在内核升级过程中整体无变化。因此,其结构体成员位置已知并可以直接作为逻辑规则使用。

  6. 范围规则:内核升级可能对结构体成员进行增删,但结构体大小仍在一个大致范围内。通过对范围进行约束,可减小逻辑推理过程中的搜索空间。

  7. 数值规则:某些结构体成员间存在数值上的关系。例如,arg_start和 arg_end两个成员分别指向程序参数的开始和结尾。因此,arg_start在数值上会小于 arg_end。


G.O.S.S.I.P 阅读推荐 2022-04-13 LOGICMEM


实验结果:

  1. Linux发行版

    我们首先对主流Linux发行版进行了分析(表二),其中包括不同版本的Centos,Debian,和Ubuntu。实验结果表明,对于主流Linux发行版,Logicmem可以实现100%的准确率和recall。


    G.O.S.S.I.P 阅读推荐 2022-04-13 LOGICMEM


  2. 随机配置内核 (kernel compiled with random configuration)

    为了验证Logicmem对不同内核的有效性,我们手动编译了10种不同的内核,每种内核在编译时采用随机的配置(configuration)。因此,每种内核中同样的结构体layout随机变化。在此数据集上,Logicmem仍能实现100%准确率和95%召回率(结果见表三)。


  3. 运行开销分析:

    实验结果表明(图五), Logicmem可高效的完成分析。针对不同Linux发行版的1GB内存快照,Logicmem的平均分析时间为110秒。


G.O.S.S.I.P 阅读推荐 2022-04-13 LOGICMEM


论文下载:https://www.cs.ucr.edu/~heng/pubs/LogicMem-ndss22.pdf




投稿作者介绍:

亓震霄 加州大学河滨分校 

UC Riverside计算机学院在读博士生,其研究方向专注于利用程序分析,虚拟化,逻辑推理等技术解决计算机安全相关问题,包括漏洞挖掘,内核安全分析等等,多次将研究成果发表在NDSS,RAID等国际安全顶级会议。

主页:https://enlighten5.github.io/


原文始发于微信公众号(安全研究GoSSIP):G.O.S.S.I.P 阅读推荐 2022-04-13 LOGICMEM

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年4月13日14:56:20
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   G.O.S.S.I.P 阅读推荐 2022-04-13 LOGICMEMhttps://cn-sec.com/archives/907888.html

发表评论

匿名网友 填写信息