楼主: 张杰2026
643 1

面向缓解机制评估的自动化信息泄露方法 [推广有奖]

  • 0关注
  • 0粉丝

硕士生

36%

还不是VIP/贵宾

-

威望
0
论坛币
21 个
通用积分
8.9992
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
2166 点
帖子
79
精华
0
在线时间
58 小时
注册时间
2014-3-26
最后登录
2022-11-11

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

源自:软件学报  作者:杨松涛 陈凯翔 王准 张超

摘要

自动生成漏洞利用样本(AEG)已成为评估漏洞的最重要的方式之一, 但现有方案在目标系统部署有漏洞缓解机制时受到很大阻碍. 当前主流的操作系统默认部署多种漏洞缓解机制, 包括数据执行保护(DEP)和地址空间布局随机化(ASLR)等, 而现有AEG方案仍无法面对所有漏洞缓解情形. 提出了一种自动化方案EoLeak, 可以利用堆漏洞实现自动化的信息泄露, 进而同时绕过数据执行保护和地址空间布局随机化防御. EoLeak通过动态分析漏洞触发样本(POC)的程序执行迹, 对执行迹中的内存布局进行画像并定位敏感数据(如代码指针), 进而基于内存画像自动构建泄漏敏感数据的原语, 并在条件具备时生成完整的漏洞利用样本. 实现了EoLeak原型系统, 并在一组夺旗赛(CTF)题目和多个实际应用程序上进行了实验验证. 实验结果表明, 该系统具有自动化泄露敏感信息和绕过DEP及ASLR缓解机制的能力.

关键词

信息泄漏    自动生成漏洞利用样本    动态分析    污点分析    内存画像   

自动生成漏洞利用样本(automatic exploit generation, AEG)[1, 2]已经成为评估漏洞的最重要方式之一. 给定一个有漏洞的二进制程序以及触发漏洞的POC (proof-of-concept)样本, AEG系统可以自动分析目标二进制程序并生成漏洞利用样本. AEG不仅可以辅助生成攻击, 同样可以辅助防御. 例如, 软件供应商可以使用AEG工具来评估软件漏洞的威胁级别, 并确定漏洞修复的紧迫性.

近年来, 研究人员已提出许多AEG方案. 早期工作[3−8]主要关注对栈和格式化字符串漏洞的分析, 其漏洞利用模式相对固定、有效. 而近年来的工作[9−15]更注重堆等复杂类型漏洞, 需要更复杂的利用技巧, 例如堆内存布局操控, 以构建可行的漏洞利用样本. 然而, 现有AEG工作很少考虑目标环境中部署有漏洞缓解等防御机制的场景, 这些漏洞缓解机制为漏洞利用带来极大的挑战. 事实上, 随着现代操作系统广泛部署各种漏洞缓解机制, 若攻击者想在如今的生产服务环境中进行实际攻击, 突破目标环境中的防御机制是必须解决的重要问题.

现代操作系统中广泛部署了3种著名的防御机制, 包括数据执行保护(NX/DEP)[16]、栈保护变量(Canary/ Cookie)[17]和地址空间布局随机化(address space layout randomization, ASLR)[18]. 数据执行保护DEP的目标是, 防止内存中写入的数据被当作代码来执行. 设置栈保护变量Canary可以在栈缓冲区溢出漏洞覆盖栈帧中的函数返回地址时检测到该破坏行为. 地址空间布局随机化ASLR则将内存中的代码段、数据段、堆栈等的基地址随机化, 使攻击者难以找到可用的重要数据和代码的地址, 从而使得攻击变得更加困难. 除此之外, 还有一些其他漏洞利用缓解措施, 包括控制流完整性解决方案[19−21]等, 也可以有效缓解漏洞利用. 但是由于性能和兼容性等各种问题, 厂商尚未广泛部署这些保护措施. 因而, 自动生成漏洞利用样本的AEG方案目前主要需要考虑DEP、ASLR、Canary等防御机制绕过即可.

在当前的AEG工作中, 部分方案[4, 5, 22, 23]假设目标环境和程序没有启用防御机制, 部分方案[8, 12−14]可以绕过数据执行保护但无法对抗地址空间布局随机化, 部分方案[3, 6, 7, 24−26]可以通过栈漏洞绕过地址空间布局随机化保护, 或在没有数据执行保护的情况下通过堆漏洞绕过地址空间布局随机化. 目前, 尚未有工作研究通过堆漏洞绕过数据执行保护和地址空间布局随机化的防御.

绕过地址空间布局随机化防护的关键在于泄漏被随机化的内存地址. 目前部署在现代操作系统中的地址空间布局随机化防御基于大尺寸的内存段, 包括栈、堆和共享库, 粒度相对较粗. 其中, 每个段内的偏移是不受随机化影响的固定值. 绕过地址空间布局随机化的最有效策略是泄漏某个段的地址, 从这个地址可以推断出攻击者所需的所有在同一段内的其他地址, 其位于固定偏移处. 因此, 我们需要找到一个包含随机化后地址的指针进行泄漏. 常见的方法包括借用目标二进制程序本身的语义或构建新的输出功能, 触发输出函数以打印出该地址. 通过这个泄漏的随机地址, 攻击者可以推断其他代码地址并基于此完成漏洞利用.

本文提出了一种面向缓解机制评估的自动化信息泄漏系统EoLeak, 可以通过堆漏洞同时绕过数据执行保护和地址空间布局随机化, 达成利用效果. EoLeak首先通过对触发漏洞的POC的运行时内存执行过程进行动态分析, 定位敏感信息的变量位置, 然后自动地为敏感信息变量构建信息泄漏, 并根据泄漏的信息生成漏洞利用样本. 为了定位内存中的重要变量, 方案通过构建内存画像来记录所有有关信息并搜索可能的泄漏路径. 为了构建泄漏能力, 方案通过堆漏洞分析模型来实现对堆漏洞的初步攻击, 扩展了内存利用能力. 方案还执行了一种轻量级动态污点策略, 通过监控内存缓冲区的传输操作来搜索具有用户可控参数的库函数调用, 降低了插桩开销. 对于最终的漏洞利用, 方案遵循相似的策略来构建用户可控的库函数调用, 并妥善处理了泄漏失败的特殊情形.

我们在基于QEMU的记录和重放平台PANDA[27]上实现了该系统, 并通过17个CTF堆漏洞二进制程序和5个真实世界软件对其进行了评估. 结果表明, 系统成功生成了15个自动泄漏样本和14个最终利用样本.对于真实软件, 系统可以自动分析、定位敏感信息的运行时内存地址和相关指针.

1 研究案例

针对堆漏洞绕过数据执行保护和地址空间布局随机化的AEG解决方案面临着与分析人员手工构造利用样本相同的问题. 本节中, 我们通过对一个实际的堆漏洞利用案例进行研究, 来概述所面临的挑战和本文所提出的泄漏系统解决方案.

1.1 堆漏洞利用案例

如图 1所示, 目标程序逻辑简化后可以表示为图 1所示代码(level参数确保合法), 其中存在一个释放后使用(use after free)的堆漏洞. 程序在第20行调用堆块释放函数时未检查指向目标堆块的buf指针是否合法, 也未在堆块被释放后将指向堆块的buf指针置零.

图 1 堆漏洞示例代码

POC通过构造重叠的堆块内存布局来触发漏洞. 如图 2所示, 矩形代表堆块头部和堆块区域, 侧方的矩形条代表对应堆块指针buf的当前指向区域. 当依次执行: (a) 创建小堆块; (b) 释放小堆块; (c) 创建大堆块; (d) 释放小堆块; (e) 创建小堆块; (f) 创建中堆块之后, 不仅所有堆块所对应的存在指示都被置为真, 且大堆块指针和小堆块指针发生了重叠, 都指向了(f)中小堆块的起始地址, 还让大堆块指针指向的区域可以对包括小堆块区域、中堆块头部、中堆块区域在内的内存区域进行覆盖. 这样, 对大堆块的写入可以造成对中堆块头部的堆溢出.

图 2 输入漏洞触发样本时程序执行过程中堆内存布局变化示意  

当攻击者试图利用这类启用了地址空间布局随机化防护的漏洞时, 其首先尝试泄漏libc库的随机化后的地址. 通过在小堆块中创建一个伪造的堆块并执行safe unlink攻击, 指向小堆块的指针将被篡改为一个略低于该指针本身地址的值, 小堆块包含了指向大堆块的指针. 此时, 便可以通过依次修改小堆块和大堆块的内容, 先后篡改大堆块指针的值及其指向内存区域的数据, 实现任意地址写. 攻击者可以借助任意地址写原语用输出库函数的过程链接表地址替换全局偏移表中的某个libc库函数地址, 并在触发该函数调用时以任意libc库函数指针为第1个参数, 从而实现了泄漏libc库函数地址. 借助该泄漏地址, 攻击者可以计算libc库中system函数和“/bin/sh”字符串等信息的实际运行时地址, 将其写回堆块中并触发system函数调用, 以完成漏洞利用.

1.2 攻击模型

本文假定在目标环境中启用了3种广泛部署的防御机制, 包括数据执行保护[16]、栈保护变量[17]和地址空间布局随机化[18]. 同时还假定目标二进制程序中存在一个常见的堆漏洞可以利用, 例如释放后使用或堆溢出.

此外, 本文假定攻击者拥有一个可以触发堆漏洞的漏洞触发样本, 广泛发展的漏洞发现工具可以满足这一要求. 由于现代AEG解决方案通常都允许用户提供对应的漏洞利用输入模板[28], 本文允许攻击者对漏洞触发样本做一些划分以辅助跟踪分析. 本文还假定攻击者可以通过最近的一些堆布局操纵工作[9−11]掌握堆风水能力, 以便通过漏洞触发样本提供一个相对方便而确定的堆布局, 辅助进一步分析.

1.3 研究挑战

在漏洞利用过程中, 攻击者需要找到一个随机化后的libc库函数地址进行泄漏, 然后依据泄漏的地址信息生成漏洞利用样本. 泄漏和利用生成都要求以攻击者控制的参数调用某些特定的库函数(包括打印数据和系统函数). 为了实现这一目标, 需要解决以下多个挑战.

(1) 挑战1: 哪些重要的敏感信息值得泄漏, 又如何定位其在内存中的位置? 例如, 要绕过地址空间布局随机化, 需要通过信息泄漏来获得一个随机化后的地址. 在仅给定目标二进制文件和POC时, 需要对运行过程中的内存结构构建内存画像;

(2) 挑战2: 如何泄漏所定位的敏感信息? 用户只能通过向程序提供输入来影响二进制程序的执行过程. 为了实现信息泄漏, 攻击者需要确定正确的输入以触发打印特定位置数据的功能;

(3) 挑战3: 如何根据泄漏的信息生成漏洞利用样本? 即便信息遭到泄漏, 仍与漏洞利用存在一定的距离, 需要额外工作来跨越这其中的障碍.

1.4 自动泄漏方案

为了解决上述挑战, 本文提出了一种新颖的解决方案EoLeak, 来自动执行面向漏洞利用的敏感信息泄漏和相应的漏洞利用样本生成. 总的来说, 方案对二进制程序执行迹进行动态分析, 对运行时内存结构构建内存画像, 定位有价值的数据变量, 构建用户可控的读写能力, 并生成绕过地址空间布局随机化和数据执行保护的堆漏洞利用样本.

方案使用给定的POC来分析二进制文件的运行过程, 并识别参与计算的指针和敏感变量, 将相关内存信息及时间戳记录在图中, 从而可以找到通往指定内存位置的一条嵌套指针链条.

为了构建泄漏能力, 方案首先基于堆内存模型, 利用堆漏洞来获得更广泛的内存操纵能力. 通过执行轻量级动态污点分析来跟踪用户输入字节, 方案分析用户可控内存区域, 从二进制程序执行路径中提取抽象的堆操作信息, 并从预先设定的堆利用模板列表中检查相符合的堆漏洞利用条件是否被满足. 为了减少污点分析性能开销, 并直接获得用户输入和内存数据之间的联系, 本文采用的污点分析只考虑内存传输操作作为传播策略.

构建漏洞利用样本遵循与构建泄漏能力相似的策略. 方案通过任意或可控的内存写来以指定的参数调用目标库函数, 执行漏洞利用. 对于自动泄漏失败或二进制文件受到其他高级防御机制保护的情形, 方案还尝试使用相应的堆漏洞利用技术来直接生成漏洞利用样本.

2 系统设计

本节介绍了EoLeak方案的设计细节. 如图 3所示, 主要有3个步骤.

图 3 自动化信息泄漏系统总览

1、敏感信息定位. 给定一个有漏洞的二进制程序和一个触发堆漏洞的POC, 方案首先分析程序执行迹, 提取指令语义, 通过恢复指针和有价值的内存对象来定位它们的位置. 我们通过内存画像来记录变量地址并维护一个指针图来搜索到特定地址的泄漏路径;

2、构建信息泄漏. 方案利用堆模型, 通过堆漏洞利用模板来实现漏洞推断, 以扩展内存操纵能力并执行轻量级动态污点分析, 来研究用户输入与库函数调用参数之间的关系. 通过构建读写功能来实现参数受控, 方案可以构建泄漏原语来打印出敏感信息;

3、生成利用样本. 方案通过与构建泄漏能力类似的策略来依据泄漏信息生成目标二进制文件的最终利用样本. 如果无法触发选定参数的漏洞利用库函数调用, 方案还会使用相应的模板来处理特定的堆漏洞利用情形作为补充.

2.1 敏感信息定位

EoLeak方案的第1步是使用POC运行给定的有漏洞的二进制程序, 并在执行过程中探索敏感信息.

2.1.1 重要数据

在程序的整个执行过程中会产生许多指针和内存对象参与计算. 其中, 我们认为以下3种信息值得注意.

1、程序执行中使用的代码指针, 尤其是位于可写内存区域的代码指针;

2、内存对象指针, 包括由堆分配函数返回的堆块指针;

3、程序执行中频繁访问的变量, 或作为函数调用参数的变量.

可写代码指针在漏洞利用中非常宝贵, 因为通过篡改这些指针, 攻击者可以劫持控制流. 并且可写代码指针在随机化后的代码空间中为推理共享库的基地址提供了参考. 敏感数据通常作为成员变量被存储在内存对象中, 内存对象的地址空间在堆管理器控制之下, 我们通过堆块指针来掌握运行时堆的状态, 从而推理内存对象在内存空间中的分布. 部分变量, 如数据结构的起始指针经常参与后续数据结构的运算, 或常作为参数被应用程序接口调用. EoLeak方案认为这些变量对漏洞利用生成也很重要, 记录了这类变量的访问频率.

2.1.2 内存画像

为了识别和定位上述敏感信息, EoLeak方案在执行动态程序执行迹分析时构建了内存画像: 对每条指令进行反汇编以获取其操作码和操作数信息, 并从执行迹中提取对应操作数的运行时变量值. 通过分析寄存器和内存操作数的寻址模式, 方案识别指针并对访问进行计数, 然后将数据添加到全局内存指向映射中, 该映射保存了所有记录的内存位置和变量声明周期时间戳.

为了定位保存libc等库函数地址的指针, EoLeak方案首先查找所有属于该库内存段的运行时地址变量值.通过一个单独的进程监控器来获取内存段的地址区域信息后, EoLeak方案记录所有运行时间接调用和跳转目标, 检查并过滤出属于该内存段的那些地址, 并执行一个单独的验证过程来比对确认每个库地址确实对应于一个库函数符号.

如图 4所示, 样例程序的指针内存画像中包含了两个指针的嵌套: 位于0x6020b0处的pS指针指向包含指针pM和pH的内存区域0x602098, 而pM和pH这两个指针又分别指向单独的内存区域. 当pH指向的以0x175e010为起始地址的内存区域中包含一个有价值的敏感数据时, 便可以通过使用两个连续的泄漏读取来构建对该重要数据的泄漏: 先读取*pS+0x10处pH指针的值, 再读取*pH+0x8处的敏感信息变量. 由于内存中的偏移量是相对固定的, 只要知道第1个位于0x6020b0处的pS指针地址, 就可以沿着链条打印出整个链上的每一个节点.

图 4 样例漏洞程序部分运行时指针内存画像


在收集到的内存分析图中, 我们将内存描述为一系列由指针指向的嵌套内存区域, 每个指针都位于特定内存区域的某个偏移处. 给定一个用户可以读取的已知地址指针和一个漏洞时间范围, EoLeak方案可以自动搜索到指定目标变量的指针泄漏链条, 从而通过连续任意读功能应用这条泄漏路径.






二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:信息泄露 自动化 Generation Automatic address

沙发
chmlx 发表于 2023-12-9 22:52:45 |只看作者 |坛友微信交流群

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加JingGuanBbs
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-6-25 17:23