CN115168871A - 一种攻击利用组件的自动生成方法和装置 - Google Patents
一种攻击利用组件的自动生成方法和装置 Download PDFInfo
- Publication number
- CN115168871A CN115168871A CN202210925870.4A CN202210925870A CN115168871A CN 115168871 A CN115168871 A CN 115168871A CN 202210925870 A CN202210925870 A CN 202210925870A CN 115168871 A CN115168871 A CN 115168871A
- Authority
- CN
- China
- Prior art keywords
- path
- contribution
- layout
- directed graph
- vulnerability
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/57—Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
- G06F21/577—Assessing vulnerabilities and evaluating computer system security
Landscapes
- Engineering & Computer Science (AREA)
- Computer Hardware Design (AREA)
- Computer Security & Cryptography (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Computing Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明提供一种攻击利用组件的自动生成方法和装置。方法包括:基于预先定义的内存访问安全原则定位崩溃路径中的漏洞点,并分析漏洞点的布局贡献有向图确定漏洞点的状态;其中布局贡献有向图是基于目标对象和指针与目标对象间指向关系的布局贡献指令得到的,用于描述目标对象的内存状态和贡献指令;根据漏洞点的布局贡献有向图,使用模糊测试方法探索分支路径;采用污点分析方法搜索分支路径的可利用状态,确定可利用的分支路径;采用控制流完整性绕过技术的缝合方法,将崩溃路径和可利用的分支路径进行缝合得到利用路径;利用符号执行收集利用路径的相关约束,并通过求解相关约束生成攻击利用组件。本发明能够提高漏洞利用的成功率。
Description
技术领域
本发明涉及计算机网络技术领域,尤其涉及一种攻击利用组件的自动生成方法和装置。
背景技术
评估漏洞可利用性的方法是生成一个有效的攻击利用组件(也称漏洞利用组件)。目前已有的攻击利用组件的生成方法有:Sean Heelan提出的使用动态分析和符号执行来生成经典缓冲区溢出漏洞的攻击利用组件;AEG和Mayhem提出的通过端到端的系统来发现漏洞,并在可能时自动生成攻击利用组件,分别用于源代码和二进制的方式;Q和CRAX可以在给定POC输入的前提下为二进制文件生成攻击利用组件等。
上述现有的攻击利用组件的自动生成方法的工作流程大体近似,基本包括:首先使用动态分析法对崩溃路径中的漏洞进行详细分析,然后在崩溃路径中搜索崩溃路径中的可利用状态,进而利用符号执行来分别收集路径可达性约束、漏洞触发约束和漏洞构建约束,最后用SMT求解器求解这些约束,并生成攻击利用组件。
然而,上述现有的攻击利用组件的自动生成方法只能解决一小部分问题,普遍还存在以下几个问题:
1.利用可导出性问题:崩溃输入可能将程序引导成不可利用的状态,基于此状态无法导出利用;
2.符号执行瓶颈:符号执行固有的问题难以解决,可能会出现路径爆炸问题,也可能会直接漏掉可利用的情况;
3.堆漏洞难题:堆管理功能复杂,现有的程序分析技术难以分析,而且堆管理函数对堆的损坏有着一系列的安全检查。
发明内容
本发明提供一种攻击利用组件的自动生成方法和装置,用于解决现有攻击利用组件的自动生成方法存在的问题。技术方案如下:
第一方面,本发明实施例提供一种攻击利用组件的自动生成方法,包括:
基于预先定义的内存访问安全原则定位崩溃路径中的漏洞点,并分析所述漏洞点的布局贡献有向图确定所述漏洞点的状态;其中所述布局贡献有向图是基于目标对象和指针与所述目标对象间指向关系的布局贡献指令得到的,用于描述所述目标对象的内存状态和贡献指令;
根据所述漏洞点的布局贡献有向图,使用模糊测试方法探索分支路径;
采用污点分析方法搜索所述分支路径的可利用状态,确定可利用的分支路径;
采用控制流完整性绕过技术的缝合方法,将所述崩溃路径和所述可利用的分支路径进行缝合得到利用路径;
利用符号执行收集所述利用路径的相关约束,并通过求解所述相关约束生成攻击利用组件。
可选地,所述方法还包括:
在创建所述目标对象时为所述目标对象生成唯一的第一标签,以及为所述目标对象的指针生成唯一的第二标签,且所述第一标签和所述第二标签唯一对应;
所述基于预先定义的内存访问安全原则定位崩溃路径中的漏洞点,包括:
对每一个内存读写操作进行内存访问安全性检测;
当检测到所述目标对象的指针访问了与其不对应的含有不同标签的其他对象时,和/或所述目标对象的指针访问了错误状态的目标对象时,确定当前操作为内存违例操作,当前指令为所述漏洞点。
可选地,基于以下原则,对每一个内存读写操作进行内存访问安全性检测:
访问指令只能访问对应的对象;
加载指令不能访问已释放或者未被初始化的内存;
保存指令不能访问已释放的内存。
可选地,所述模糊测试方法为通过扩展AFL实现的模糊测试方法;
所述根据所述漏洞点的布局贡献有向图,使用模糊测试方法探索分支路径,包括:
在AFL原有的代码覆盖率为导向基础上,基于内存布局导向,以所述漏洞点的布局贡献有向图中的指令序列为额外的导向,驱动模糊器探索接近所述崩溃路径的分支路径。
可选地,从以下方面,对AFL进行了扩展:
跟踪引导片的命中次数;
将具有最长公共子序列的种子中,命中次数小于第一阈值、执行速度大于第二阈值的种子确定为进行变异的种子。
可选地,所述方法还包括:
将使用模糊测试方法探索得到的分支路径与所述崩溃路径对齐,并定位负责创建异常对象的指令;
采用与所述崩溃路径相同的方式,通过逆向切片从所述分支路径构造所述异常对象的新的布局贡献有向图;
比较所述新的布局贡献有向图和所述崩溃路径中漏洞点的布局贡献有向图中,每个节点的内存标记和创建者指令的地址,确定出能够匹配所述崩溃路径中漏洞点的布局贡献有向图的新的布局贡献有向图;
筛选出能够匹配所述崩溃路径中漏洞点的布局贡献有向图的新的布局贡献有向图的分支路径。
可选地,所述采用污点分析方法搜索所述分支路径的可利用状态,包括:
将每个对象创建操作标记为污染源,并为其分配唯一的污染标签;
在每个敏感指令处,检查目标地址的污染标签是否包含异常对象的污染标签;
如果包含,确认该敏感指令是可利用的。
可选地,所述采用控制流完整性绕过技术的缝合方法,将所述崩溃路径和所述可利用的分支路径进行缝合得到利用路径,包括:
确定所述崩溃路径中的至少一个缝合点,以及连接所述缝合点的潜在子路径;
连接两个缝合点的潜在子路径,得到所述利用路径。
可选地,所述确定所述崩溃路径中的至少一个缝合点包括:
在分支路径中构建可利用操作的操作数的布局贡献有向图;
当所述分支路径中构建的可利用操作的操作数的布局贡献有向图为所述崩溃路径中异常对象的布局贡献有向图的子图时,将所述分支路径中的指令在最后一次对可利用操作的操作数进行写访问之后,选择该操作数作为缝合点。
第二方面,本发明实施例提供一种攻击利用组件的自动生成装置,包括:
分析模块,用于基于预先定义的内存访问安全原则定位崩溃路径中的漏洞点,并分析所述漏洞点的布局贡献有向图确定所述漏洞点的状态;其中所述布局贡献有向图是基于目标对象和指针与所述目标对象间指向关系的布局贡献指令得到的,用于描述所述目标对象的内存状态和贡献指令;
分支路径探索模块,用于根据所述漏洞点的布局贡献有向图,使用模糊测试方法探索分支路径;
分支路径确定模块,用于采用污点分析方法搜索所述分支路径的可利用状态,确定可利用的分支路径;
缝合模块,用于采用控制流缝合方法,将所述崩溃路径和所述可利用的分支路径进行缝合得到利用路径;
攻击利用组件生成模块,用于利用符号执行收集所述利用路径的相关约束,并通过求解所述相关约束生成攻击利用组件。
可选地,所述装置还包括:
标签生成模块,用于在创建所述目标对象时为所述目标对象生成唯一的第一标签,以及为所述目标对象的指针生成唯一的第二标签,且所述第一标签和所述第二标签唯一对应;
所述分析模块具体用于,对每一个内存读写操作进行内存访问安全性检测;当检测到所述目标对象的指针访问了与其不对应的含有不同标签的其他对象时,和/或所述目标对象的指针访问了错误状态的目标对象时,确定当前操作为内存违例操作,当前指令为所述漏洞点。
可选地,基于以下原则,对每一个内存读写操作进行内存访问安全性检测:
访问指令只能访问对应的对象;
加载指令不能访问已释放或者未被初始化的内存;
保存指令不能访问已释放的内存。
可选地,所述模糊测试方法为通过扩展AFL实现的模糊测试方法;
所述分支路径探索模块具体用于,在AFL原有的代码覆盖率为导向基础上,基于内存布局导向,以所述漏洞点的布局贡献有向图中的指令序列为额外的导向,驱动模糊器探索接近所述崩溃路径的分支路径。
可选地,从以下方面,对AFL进行了扩展:
跟踪引导片的命中次数;
将具有最长公共子序列的种子中,命中次数小于第一阈值、执行速度大于第二阈值的种子确定为进行变异的种子。
可选地,所述装置还包括:
对齐定位模块,用于将使用模糊测试方法探索得到的分支路径与所述崩溃路径对齐,并定位负责创建异常对象的指令;
布局贡献有向图构造模块,用于采用与所述崩溃路径相同的方式,通过逆向切片从所述分支路径构造所述异常对象的新的布局贡献有向图;
比较确定模块,用于比较所述新的布局贡献有向图和所述崩溃路径中漏洞点的布局贡献有向图中,每个节点的内存标记和创建者指令的地址,确定出能够匹配所述崩溃路径中漏洞点的布局贡献有向图的新的布局贡献有向图;
分支路径筛选模块,用于筛选出能够匹配所述崩溃路径中漏洞点的布局贡献有向图的新的布局贡献有向图的分支路径。
可选地,所述分支路径确定模块具体用于,将每个对象创建操作标记为污染源,并为其分配唯一的污染标签;在每个敏感指令处,检查目标地址的污染标签是否包含异常对象的污染标签;如果包含,确认该敏感指令是可利用的。
可选地,所述缝合模块包括:
缝合点确定子模块,用于确定所述崩溃路径中的至少一个缝合点;
第一连接子模块,用于连接所述缝合点的潜在子路径;
第二连接子模块,用于连接两个缝合点的潜在子路径,得到所述利用路径。
可选地,所述缝合点确定子模块具体用于,在分支路径中构建可利用操作的操作数的布局贡献有向图;当所述分支路径中构建的可利用操作的操作数的布局贡献有向图为所述崩溃路径中异常对象的布局贡献有向图的子图时,将所述分支路径中的指令在最后一次对可利用操作的操作数进行写访问之后,选择该操作数作为缝合点。
本发明的上述技术方案的有益效果是:本发明实施例针对当前常用的攻击利用组件自动生成方式存在的问题,提出一种新的攻击利用组件自动生成方法,通过用崩溃输入执行程序、动态分析崩溃路径、寻找可利用的路径、利用轻量级的符号执行收集抵达该路径的约束条件,最终求解约束自动生成针对该程序的攻击利用组件,提高了漏洞利用的成功率。
附图说明
图1为本发明实施例公开的攻击利用组件的自动生成方法的流程示意图;
图2为本发明实施例公开的攻击利用组件的自动生成方法的方法流程图;
图3为本发明实施例中AFL扩展示意图;
图4为本发明实施例中分支路径与崩溃路径对齐匹配的流程示意图;
图5为本发明实施例中分支路径与崩溃路径对齐匹配的方法流程图;
图6为本发明实施例中攻击利用组件的自动生成方法的另一流程示意图;
图7为本发明实施例公开的攻击利用组件的自动生成装置的结构示意图。
具体实施方式
为使本发明要解决的技术问题、技术方案和优点更加清楚,下面将结合附图及具体实施例进行详细描述。在下面的描述中,提供诸如具体的配置和组件的特定细节仅仅是为了帮助全面理解本发明的实施例。因此,本领域技术人员应该清楚,可以对这里描述的实施例进行各种改变和修改而不脱离本发明的范围和精神。另外,为了清楚和简洁,省略了对已知功能和构造的描述。
应理解,说明书通篇中提到的“一个实施例”或“一实施例”意味着与实施例有关的特定特征、结构或特性包括在本发明的至少一个实施例中。因此,在整个说明书各处出现的“在一个实施例中”或“在一实施例中”未必一定指相同的实施例。此外,这些特定的特征、结构或特性可以任意适合的方式结合在一个或多个实施例中。
在本发明的各种实施例中,应理解,下述各过程的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本发明实施例的实施过程构成任何限定。
本发明实施例公开的攻击利用组件的自动生成方法主要包括四个方面的应用技术,分别为漏洞分析技术、漏洞关键路径探索技术、可利用状态搜索技术、控制流完整性绕过技术。其工作流程如图1所示:
首先,像现有的攻击利用组件的自动生成方法一样,基于崩溃路径收集动态信息。除了变量的污点属性外,本发明实施例还检查损坏的内存对象(异常对象)和可用于定位异常对象的对象。在崩溃路径中,检索创建的这些对象并建立指针与对象间指向关系的布局贡献指令,进而基于这些布局贡献指令和对象,创建布局贡献有向图来描述内存状态和贡献指令。
进一步,在发散的路径(发散的路径也可称为崩溃路径之外的其他路径/分支路径)中寻找可利用的状态。使用布局导向的模糊测试,而不是符号执行来探索发散的路径,并驱使模糊测试器向着一个具体的方向演进,即和崩溃路径一致的方向演进。其目标并不是完全与崩溃路径一致,而是忽略了崩溃路径上大部分的指令,仅仅以那些对内存布局造成影响的指令为导向,因此,能与崩溃路径产生大致相似的内存布局。在内存布局相似的情况下,模糊测试探索大量的发散路径,能更有机会发现可利用的状态。
最后,将能触发崩溃的POC输入和通过模糊测试达到利用状态的输入结合起来,使用一种被称为控制流缝合的解决方案,在仅只用轻量级符号执行的情况下自动生成攻击利用组件。
下面,本发明实施例对本发明公开的攻击利用组件的自动生成方法进行详细描述,如图2所示,方法包括:
步骤101,基于预先定义的内存访问安全原则定位崩溃路径中的漏洞点,并分析所述漏洞点的布局贡献有向图确定所述漏洞点的状态。
其中布局贡献有向图是基于目标对象和指针与目标对象间指向关系的布局贡献指令得到的,用于描述所述目标对象的内存状态和贡献指令。本发明实施例跟踪所有可用于定位异常对象的索引对象,这些异常对象和索引对象由指向关系相连接。作为一个结果,可以得到对象的有向图,即布局贡献有向图,其在一定程度上表征了漏洞的状态。
在实际应用过程中,当利用一个漏洞发起攻击时,首先需要定位漏洞点以及分析程序在漏洞点的状态,进而根据漏洞点的状态,有选择和方向的去搜索可利用状态。
目前现有技术中是给定一个POC输入,通过检测内存错误来检测漏洞点,比如AddressSanitizer。但是AddressSanitizer由于采用代码插桩的方式,会改变程序运行时的内存布局,因此并不适用于漏洞利用生成。本发明实施例提出了一种通过预先定义的内存访问安全原则去定位崩溃路径中的漏洞点,并且通过分析漏洞点的布局贡献有向图来描述漏洞的状态。
具体地,本发明实施例采用一种内存标签技术(Memory Tagging),使用影子内存技术去无损的记录申请到的堆块标签和堆块的状态,有效的检测时间和空间上的漏洞点。在实际应用中,本发明实施例在创建目标对象时会为每一个目标对象生成唯一的第一标签,以及为每一个目标对象的指针生成唯一的第二标签,并且该第一标签和第二标签唯一对应。需要说明的是,本发明实施例中的目标对象包括损坏的内存对象和可用于定位异常对象的对象。
以堆对象来描述,每个堆对象和指针都会有一个内存标签,表示其沿袭关系。对于每个堆内存访问指令(加载和保存),具体在创建对象时,假设为堆对象生成第一标签tag_obj(也即目标内存区域的标签tag_obj),为其指针生成第二标签tag_ptr,此外每个堆对象都有一个状态,将其状态标记为status_obj。在实际应用中,堆对象状态一般包括三种:uninitialized(已分配但未初始化)、busy(已初始化且正在使用)或free(已释放)。
本发明实施例基于预先定义的内存访问安全原则定位崩溃路径中的漏洞点,具体包括:
对每一个内存读写操作进行内存访问安全性检测;
当检测到目标对象的指针访问了与其不对应的含有不同标签的其他对象时,和/或目标对象的指针访问了错误状态的目标对象时,确定当前操作为内存违例操作,当前指令为漏洞点。
本发明实施例使用了污点传播技术,在malloc等内存申请函数返回的堆块指针上打上一个污点标签。污点传播技术是进行漏洞分析挖掘的一种成熟有效的机制,通过跟踪不可信数据源的传播进而发现不安全的污点数据使用,分析不可信的输入对程序的影响,发现重要位置(即漏洞点)可能被攻击者利用的可能性。进一步在每一个内存读写操作时,进行内存访问安全性检测。检测的原则是每一个堆块地址指针只能访问含有相同标签的且在正确状态的堆块。如果在程序运行时,一个指针访问了含有不同标签或错误状态的内存,就会认为当前操作是一个内存违例操作,当前的这条指令就是漏洞点。
具体而言本发明实施例可以基于以下原则,对每一个内存读写操作进行内存访问安全性检测:
1.访问对应对象:访问指令只能访问对应的对象;即tag_obj=tag_ptr;
2.读忙碌对象:加载指令不能访问已释放或者未被初始化的内存;即status_obj=busy;
3.写活跃对象:保存指令不能访问已释放的内存;status_obj≠free。
任何违背上述原则的都将导致脆弱。例如,缓冲区溢出违背原则1,未初始化变量漏洞违背原则2,use-after-free漏洞可能违背原则1、原则2、原则3等。
通过进一步分析对象布局贡献有向图来描述漏洞状态并检索对此状态有贡献的指令。每个基于堆的漏洞(包括堆溢出和UAF)都与一个异常对象相关,该异常对象的内容因为漏洞而损坏(或将被漏洞损坏)。对这些对象的进一步操作可能会导致应用程序进入可利用的状态。如漏洞点使用带有标记tag_ptr的指针访问带有标记tag_obj的目标对象。如果是写访问,那么带有tag_obj标签的对象就是异常对象,它将被这个写访问所破坏。如果是读访问,而这个漏洞是UAF,那么带有tag_ptr标签的对象就是异常对象,它将被占用相同内存的新对象分配所破坏。
步骤102,根据所述漏洞点的布局贡献有向图,使用模糊测试方法探索分支路径。
在定位漏洞点以及分析漏洞点的布局贡献有向图之后,需要在崩溃路径以及崩溃路径之外的分支路径中继续搜索可利用状态。目前现有的攻击利用组件的自动化生成技术,如AEG和Mavhem过于依赖符号执行去探索崩溃路径或一些可达的路径,去搜索可利用状态。但是由于符号执行的瓶颈,使得符号执行并不适用于可利用状态探索和攻击利用组件自动生成。
业界也有一些符号执行和模糊测试结合的解决方案,如Driller。模糊测试需要变异输入,而符号执行正好可以生成测试用例,符号执行在进行程序的路径探索时会出现路径空间爆炸的问题,因此路径探索任务就交给模糊测试的实际执行功能来完成。
当模糊测试无法再找到新的路径空间时,将执行权交给符号执行,此时符号执行并不需要遍历所有的程序路径,而是在遍历程序路径时,遇到已经走过的软件路径就进行回溯,遇到未曾走过的软件路径就用约束求解器求出能够到达此条路径的程序输入,将此输入用例交给模糊测试继续快速执行探测。
符号执行虽然路径探索功能精确,但是路径搜索和测试用例生成时的约束求解耗时太高,所以当模糊测试无法找到新的程序路径时才让符号执行介入,生成一个新的测试用例之后,符号执行将执行权交给模糊测试,模糊测试就会到达新的程序路径,使用遗传算法和启发式算法继续变异程序输入。这样一来就很可能在短时间内探索到一大批的新的程序路径,以这种方法提高程序的代码覆盖率,找到更多的软件漏洞。
但是这些解决方案中符号执行部分的使用仍然存在瓶颈的问题,模糊测试部分则缺少必要的目标导向,因此并不适用于可利用状态搜索。
基于此,本发明实施例使用模糊测试方法探索路径并搜索可利用状态。在漏洞挖掘领域,相对于符号执行,模糊测试已经被证明是更有效的路径探索技术。进一步为了在漏洞利用路径搜索时提高模糊测试的效率,本发明实施例根据漏洞相关的布局贡献有向图,构建与漏洞点相似内存布局的分支路径,使用内存布局制导的模糊测试去探索分支路径。
具体地,本发明实施例采用的模糊测试方法可以为通过扩展AFL(American FuzzyLop)实现的模糊测试方法。现有的AFL仅仅以代码覆盖率为导向进行路径探索,而本发明实施例在AFL原有的代码覆盖率为导向基础上,基于内存布局导向,以漏洞点的布局贡献有向图中的指令序列为额外的导向,驱动模糊器探索接近崩溃路径的分支路径。崩溃路径中的其他指令不断的修正样本的变异方向,高效生成测试用例,获取到和POC中漏洞点内存布局相似的内存布局和异常对象。本发明实施例基于以下三个设计原则:
1.按与引导片相同的顺序命中所有布局贡献指令的输入,可以构造与漏洞点类似的内存布局;
2.命中引导片较长子序列的输入更有可能演变成命中全部引导片的输入;
3.命中更少布局贡献指令的输入将为进一步利用引入更少麻烦。换句话来说,两个输入在引导片中命中了相同长度的子序列,指令较长的输入会增加生成利用的难度,较简单的输入更可靠。
同时针对AFL,本发明实施例从跟踪引导片的命中次数、调优引导模糊测试方向两个方面对AFL进行了扩展,具体参阅图3所示。
1、跟踪引导片的命中次数。
在QEMU和模糊器驱动的共享内存中增加了一个额外的缓冲区HIT以及用于代码覆盖率跟踪的现有的位图。HIT[0]用来跟踪片段命中的计数,HIT[i]用于跟踪引导片段中的第i条指令是否被击中。更具体地讲,每当一条布局贡献指令执行时,QEMU就会增加片段命中次数HIT[0]。如果这个指令是第n条指令(n>=1),在HIT[n-1]已经被设置的前提下,QEMU将设置HIT[n]。在这种情况下,模糊器驱动程序可以在HIT[0]中获得片断命中次数,而HIT[1:N]中的最长的共同子序列。
2、调优引导模糊测试的方向。
本发明实施例修改了模糊器的驱动程序,以利用收集到的分片点击信息。改变种子选择算法(种子,队列中用于模糊测试的测试用例),当从队列中选择种子进行变异时,首先选取那些具有最长公共子序列的种子,然后在具有最长公共子序列的种子中,优先选择片段命中次数小于第一阈值、且同时执行速度大于第二阈值的种子(表明片段命中次数较少、执行速度较快的种子)确定为进行变异的种子。
本发明实施例通过采用面向布局贡献有向图的模糊测试方法,可以发现能够触发与POC输入相同的布局贡献指令序列的分支路径。与布局贡献有向图不同的是,布局贡献指令切片中缺少数据流约束。发散输入产生的内存布局有时不匹配从崩溃路径构建的目标内存布局,为了解决此类问题,本发明实施例进一步采取如下方法来过滤出能够匹配目标布局贡献有向图的分支路径,如图4、5所示。
步骤201,将使用模糊测试方法探索得到的分支路径与崩溃路径对齐,并定位负责创建异常对象的指令;
步骤202,采用与崩溃路径相同的方式,通过逆向切片从所述分支路径构造所述异常对象的新的布局贡献有向图;
步骤203,比较所述新的布局贡献有向图和所述崩溃路径中漏洞点的布局贡献有向图中,每个节点的内存标记和创建者指令的地址,确定出能够匹配所述崩溃路径中漏洞点的布局贡献有向图的新的布局贡献有向图;
步骤204,筛选出能够匹配所述崩溃路径中漏洞点的布局贡献有向图的新的布局贡献有向图的分支路径。
本发明实施例首先将分支路径与崩溃路径对齐,并定位负责创建异常对象的指令。然后以与崩溃路径相同的方式,通过逆向切片从分支路径构造异常对象的一个新的布图贡献有向图。最后通过比较两个布图贡献有向图中每个节点的内存标记及其创建者指令的地址,将这个新的布图贡献有向图与崩溃路径的布图贡献有向图(为便于区分描述,将崩溃路径的布图贡献有向图称之为目标布图贡献有向图)匹配,最终筛选出能够匹配目标布局贡献有向图的新的布局贡献有向图的分支路径。
步骤103,采用污点分析方法搜索所述分支路径的可利用状态,确定可利用的分支路径。
通过步骤102确定的分支路径的内存布局即便与漏洞相近,但不代表该分支路径是可利用的路径。需要说明的是,可利用状态是指:异常对象会影响其他对象,并会直接或间接的作用于某些敏感操作中。这些敏感操作产生的程序状态被称为可利用状态。
在本发明实施例中,主要考虑两种类型的敏感操作,即内存写入和间接的函数调用。例如,如果内存写入的目标地址受到异常对象的影响或源于异常对象,那么攻击者可以控制在哪里写入并导致AAW(任意地址写入),即为实践中常用的可利用状态。如果攻击者可以影响间接调用的目标地址,如虚函数调用和间接跳转等,那么攻击者即可以劫持控制流。
因此,可利用状态的搜索就变成了识别关键操作符受异常对象影响的敏感指令。本发明实施例采用污点分析方法来搜索分支路径的可利用状态。
具体地,本发明实施例首先将每个对象创建操作标记为污染源,并为其分配唯一的污染标签,进而在每个敏感指令(即内存写入或函数调用)处,检查目标地址的污染标签是否包含异常对象的污染标签。如果包含,则确认该敏感指令是可利用的。在某些情况下,本发明实施例能够直接生成有效的攻击利用组件。在可利用点,可以构造有效载荷约束,从而导致控制流劫持。
步骤104,采用控制流完整性绕过技术的缝合方法,将所述崩溃路径和所述可利用的分支路径进行缝合得到利用路径。
首先申请人就本发明实施例中应用到的控制流完整性绕过技术进行说明。
控制流完整性是学术界提出的一类高安全防御强度的防御机制,其基本原理是通过对程序中的间接控制流跳转位置(例如函数指针调用、函数返回等)植入安全检查,在运行时验证跳转目标合法性,限制程序运行中的控制流转移,使其始终处于原有的控制流图所限定的范围内,从而阻断非法的控制流跳转。这种防御技术给传统的ROP攻击等带来了极大挑战。
本发明实施例提出一种控制流完整性绕过技术,通过利用C++语言中的虚函数机制,突破控制流完整性防御。在C++中为了实现运行中的多态,需要满足三个条件:类之间是派生关系;声明基类、派生类的成员函数为虚函数;在满足赋值兼容性规则的前提下,通过指针或引用访问虚函数。虚函数是为了实现动态联编(运行多态)而引入的概念。其主要作用是实现了多态的机制。关于多态,简而言之就是用父类型的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。
根据C++语言规范,源代码中声明的某个类型的虚函数调用,在运行时允许该类型的任何子类对象被传入使用,换言之,子类的虚函数可能在该调用点使用。相应地,控制流完整性防护方案必然允许虚函数调用点包含多个候选的合法跳转目标。
通过分析目标程序代码,识别间接函数调用点的集合,在集合中依次取间接函数调用点进行逆向数据流分析,得到函数调用目的地址表达式,将所述函数调用目的地址表达式与形式deref(deref(exp)+Tval)行比较,若相符合,对间接调用的第一个参数从传参位置处开始进行逆向数据流分析,直到函数开头,得到参数在函数开头位置处的表达式,将该表达式与函数调用目的地址表达式中的exp相比较,若相符合,则将该间接函数调用点即为需要数调用点,由此识别出所有虚函数调用点。
分析程序中的每一个函数,对函数进行数据流分析,得到虚函数表指针初始化信息集合,从集合中依次取一条虚函数表指针初始化信息,由取出的虚函数表指针初始化信息中的虚函数表集合得到虚函数表继承关系。
分析可执行文件,找出出现的所有立即数并存在立即数链表中。从立即数链表中取一个立即数并以该立即数为指针,判断该立即数指向的区域是否为只读数据区,若指向的区域为只读数据区,以取到的数据为指针,从该立即数指向的地址取数据;若该指针指向合法指令地址,读取虚函数表中的虚函数;将读取的虚函数表加入虚函数表集合。
由识别到的虚函数调用点及相应的类继承关系,各虚函数调用点允许的虚函数集合,进而识别子类虚函数与父类/兄弟类对象之间语义上的差异(对象数据成员访问差别),定位可以造成越界读写等后果的虚函数调用。进而,通过修改受害对象的虚表指针,在运行时触发错误的虚函数执行,绕过部署的控制流完整性检查。
为了成功地利用目标程序,必须首先触发其漏洞,导致一些异常对象被损坏。因此,本发明实施例选择异常对象在崩溃路径中损坏的位置作为拼接点。在崩溃路径中,每次写访问冲突都会破坏一个异常对象,因此它是一个候选拼接点。对于UAF漏洞中的每个读访问冲突,异常对象是已释放但仍然由悬空指针指向的对象,这个异常对象的内存区域将被另一个内存分配占用。本发明实施例将该新的内存分配操作作为一个候选拼接点。
考虑到在一个崩溃路径中会存在多处违反安全规则的情况,即可能会有多个缝合点。因此选取一个合适的缝合点非常重要。本发明实施例中,一个合适的缝合点应符合以下几个标准:
(1)、不要太靠近入口点。否则,将执行许多和崩溃路径重复的操作。由于重复的操作(例如,对象初始化)不会在合法的控制流中发生,所以不可能找到一条路径来连接这个拼接点和崩溃路径中的对应点;
(2)、不要太接近可利用的点。否则,需要更长的路径来连接这个缝合点和对应的缝合点,需要更多的符号执行开销。缝合点可以在某些操作之前设置,例如,初始化可利用点的操作数以节制符号执行的工作量;
(3)、最小数据依赖性。发散路径上的拼接点后的数据流与崩溃路径上的拼接点前的数据流相交较少。
进一步,本发明实施例将尝试用分支路径来缝合它们,如图6所示。
首先,在分支路径中构建可利用操作的操作数的布局贡献有向图,然后将在分支路径中构建的可利用操作的操作数的布局贡献有向图与崩溃路径中异常对象的布局贡献有向图匹配。如果前者是后者的子图,则意味着崩溃路径已经为可利用的操作设置了所有数据依赖项。进而分支路径中的指令在最后一次对可利用操作的操作数进行写访问之后,选择该操作数作为缝合点。
为了将崩溃路径和分支路径缝合在一起,本发明实施例探索了连接这些路径中的缝合点的潜在子路径。通常,它依赖于符号执行来探索路径,而本发明实施例利用几种启发式来有效地指导符号执行。首先,使用函数调用堆栈来引导路径探索。它分别在两个缝合点检查调用堆栈,并找出差异。其次,通过重用现有路径进一步减少子路径探索。例如,如果在发散路径或崩溃路径中已经有一个子路径连接两个中间目标,将重用该子路径。这样,在探索连接拼接点的子路径时,大大减少了符号执行的负担。
一旦找到连接两个缝合点的子路径,连接该两个缝合点的潜在子路径,就可以构造一个候选的利用路径。
步骤105,利用符号执行收集所述利用路径的相关约束,并通过求解所述相关约束生成攻击利用组件。
本发明实施例在得到利用路径后,通过求解路径约束、漏洞约束、状态约束和Payload约束,即可自动生成攻击利用组件。
本发明实施例针对当前常用的攻击利用组件自动生成方式存在的问题,提出一种新的攻击利用组件自动生成方法,通过用崩溃输入执行程序、动态分析崩溃路径、寻找可利用的路径、利用轻量级的符号执行收集抵达该路径的约束条件,最终求解约束自动生成针对该程序的攻击利用组件,提高了漏洞利用的成功率。
基于前文本发明实施例提供的一种攻击利用组件的自动生成方法,本发明实施例还提供一种攻击利用组件的自动生成装置,如图7所示,包括:
分析模块100,用于基于预先定义的内存访问安全原则定位崩溃路径中的漏洞点,并分析所述漏洞点的布局贡献有向图确定所述漏洞点的状态;其中所述布局贡献有向图是基于目标对象和指针与所述目标对象间指向关系的布局贡献指令得到的,用于描述所述目标对象的内存状态和贡献指令;
分支路径探索模块200,用于根据所述漏洞点的布局贡献有向图,使用模糊测试方法探索分支路径;
分支路径确定模块300,用于采用污点分析方法搜索所述分支路径的可利用状态,确定可利用的分支路径;
缝合模块400,用于采用控制流缝合方法,将所述崩溃路径和所述可利用的分支路径进行缝合得到利用路径;
攻击利用组件生成模块500,用于利用符号执行收集所述利用路径的相关约束,并通过求解所述相关约束生成攻击利用组件。
可选地,本发明实施例提供的攻击利用组件的自动生成装置还包括:
标签生成模块,用于在创建所述目标对象时为所述目标对象生成唯一的第一标签,以及为所述目标对象的指针生成唯一的第二标签,且所述第一标签和所述第二标签唯一对应;
此时分析模块100具体用于,对每一个内存读写操作进行内存访问安全性检测;当检测到所述目标对象的指针访问了与其不对应的含有不同标签的其他对象时,和/或所述目标对象的指针访问了错误状态的目标对象时,确定当前操作为内存违例操作,当前指令为所述漏洞点。
可选地,基于以下原则,对每一个内存读写操作进行内存访问安全性检测:
访问指令只能访问对应的对象;
加载指令不能访问已释放或者未被初始化的内存;
保存指令不能访问已释放的内存。
可选地,所述模糊测试方法为通过扩展AFL实现的模糊测试方法;
此时分支路径探索模块200具体用于,在AFL原有的代码覆盖率为导向基础上,基于内存布局导向,以所述漏洞点的布局贡献有向图中的指令序列为额外的导向,驱动模糊器探索接近所述崩溃路径的分支路径。
可选地,从以下方面,对AFL进行了扩展:
跟踪引导片的命中次数;
将具有最长公共子序列的种子中,命中次数小于第一阈值、执行速度大于第二阈值的种子确定为进行变异的种子。
可选地,本发明实施例提供的攻击利用组件的自动生成装置还包括:
对齐定位模块,用于将使用模糊测试方法探索得到的分支路径与所述崩溃路径对齐,并定位负责创建异常对象的指令;
布局贡献有向图构造模块,用于采用与所述崩溃路径相同的方式,通过逆向切片从所述分支路径构造所述异常对象的新的布局贡献有向图;
比较确定模块,用于比较所述新的布局贡献有向图和所述崩溃路径中漏洞点的布局贡献有向图中,每个节点的内存标记和创建者指令的地址,确定出能够匹配所述崩溃路径中漏洞点的布局贡献有向图的新的布局贡献有向图;
分支路径筛选模块,用于筛选出能够匹配所述崩溃路径中漏洞点的布局贡献有向图的新的布局贡献有向图的分支路径。
可选地,分支路径确定模块300具体用于,将每个对象创建操作标记为污染源,并为其分配唯一的污染标签;在每个敏感指令处,检查目标地址的污染标签是否包含异常对象的污染标签;如果包含,确认该敏感指令是可利用的。
可选地,缝合模块400包括:
缝合点确定子模块,用于确定所述崩溃路径中的至少一个缝合点;
第一连接子模块,用于连接所述缝合点的潜在子路径;
第二连接子模块,用于连接两个缝合点的潜在子路径,得到所述利用路径。
可选地,所述缝合点确定子模块具体用于,在分支路径中构建可利用操作的操作数的布局贡献有向图;当所述分支路径中构建的可利用操作的操作数的布局贡献有向图为所述崩溃路径中异常对象的布局贡献有向图的子图时,将所述分支路径中的指令在最后一次对可利用操作的操作数进行写访问之后,选择该操作数作为缝合点。
需要说明的是,该攻击利用组件的自动生成装置是与前述实施例中的攻击利用组件的自动生成方法对应的装置,上述方法实施例中的所有实现手段均适用于该风电机组的控制装置的实施例中,也能达到相同的技术效果。
以上所述是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明所述原理的前提下,还可以作出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (10)
1.一种攻击利用组件的自动生成方法,其特征在于,包括:
基于预先定义的内存访问安全原则定位崩溃路径中的漏洞点,并分析所述漏洞点的布局贡献有向图确定所述漏洞点的状态;其中所述布局贡献有向图是基于目标对象和指针与所述目标对象间指向关系的布局贡献指令得到的,用于描述所述目标对象的内存状态和贡献指令;
根据所述漏洞点的布局贡献有向图,使用模糊测试方法探索分支路径;
采用污点分析方法搜索所述分支路径的可利用状态,确定可利用的分支路径;
采用控制流完整性绕过技术的缝合方法,将所述崩溃路径和所述可利用的分支路径进行缝合得到利用路径;
利用符号执行收集所述利用路径的相关约束,并通过求解所述相关约束生成攻击利用组件。
2.根据权利要求1所述的攻击利用组件的自动生成方法,其特征在于,所述方法还包括:
在创建所述目标对象时为所述目标对象生成唯一的第一标签,以及为所述目标对象的指针生成唯一的第二标签,且所述第一标签和所述第二标签唯一对应;
所述基于预先定义的内存访问安全原则定位崩溃路径中的漏洞点,包括:
对每一个内存读写操作进行内存访问安全性检测;
当检测到所述目标对象的指针访问了与其不对应的含有不同标签的其他对象时,和/或所述目标对象的指针访问了错误状态的目标对象时,确定当前操作为内存违例操作,当前指令为所述漏洞点。
3.根据权利要求2所述的攻击利用组件的自动生成方法,其特征在于,基于以下原则,对每一个内存读写操作进行内存访问安全性检测:
访问指令只能访问对应的对象;
加载指令不能访问已释放或者未被初始化的内存;
保存指令不能访问已释放的内存。
4.根据权利要求1所述的攻击利用组件的自动生成方法,其特征在于,所述模糊测试方法为通过扩展AFL实现的模糊测试方法;
所述根据所述漏洞点的布局贡献有向图,使用模糊测试方法探索分支路径,包括:
在AFL原有的代码覆盖率为导向基础上,基于内存布局导向,以所述漏洞点的布局贡献有向图中的指令序列为额外的导向,驱动模糊器探索接近所述崩溃路径的分支路径。
5.根据权利要求4所述的攻击利用组件的自动生成方法,其特征在于,从以下方面,对AFL进行了扩展:
跟踪引导片的命中次数;
将具有最长公共子序列的种子中,命中次数小于第一阈值、执行速度大于第二阈值的种子确定为进行变异的种子。
6.根据权利要求4或5所述的攻击利用组件的自动生成方法,其特征在于,所述方法还包括:
将使用模糊测试方法探索得到的分支路径与所述崩溃路径对齐,并定位负责创建异常对象的指令;
采用与所述崩溃路径相同的方式,通过逆向切片从所述分支路径构造所述异常对象的新的布局贡献有向图;
比较所述新的布局贡献有向图和所述崩溃路径中漏洞点的布局贡献有向图中,每个节点的内存标记和创建者指令的地址,确定出能够匹配所述崩溃路径中漏洞点的布局贡献有向图的新的布局贡献有向图;
筛选出能够匹配所述崩溃路径中漏洞点的布局贡献有向图的新的布局贡献有向图的分支路径。
7.根据权利要求1所述的攻击利用组件的自动生成方法,其特征在于,所述采用污点分析方法搜索所述分支路径的可利用状态,包括:
将每个对象创建操作标记为污染源,并为其分配唯一的污染标签;
在每个敏感指令处,检查目标地址的污染标签是否包含异常对象的污染标签;
如果包含,确认该敏感指令是可利用的。
8.根据权利要求1所述的攻击利用组件的自动生成方法,其特征在于,所述采用控制流完整性绕过技术的缝合方法,将所述崩溃路径和所述可利用的分支路径进行缝合得到利用路径,包括:
确定所述崩溃路径中的至少一个缝合点,以及连接所述缝合点的潜在子路径;
连接两个缝合点的潜在子路径,得到所述利用路径。
9.根据权利要求8所述的攻击利用组件的自动生成方法,其特征在于,所述确定所述崩溃路径中的至少一个缝合点包括:
在分支路径中构建可利用操作的操作数的布局贡献有向图;
当所述分支路径中构建的可利用操作的操作数的布局贡献有向图为所述崩溃路径中异常对象的布局贡献有向图的子图时,将所述分支路径中的指令在最后一次对可利用操作的操作数进行写访问之后,选择该操作数作为缝合点。
10.一种攻击利用组件的自动生成装置,其特征在于,包括:
分析模块,用于基于预先定义的内存访问安全原则定位崩溃路径中的漏洞点,并分析所述漏洞点的布局贡献有向图确定所述漏洞点的状态;其中所述布局贡献有向图是基于目标对象和指针与所述目标对象间指向关系的布局贡献指令得到的,用于描述所述目标对象的内存状态和贡献指令;
分支路径探索模块,用于根据所述漏洞点的布局贡献有向图,使用模糊测试方法探索分支路径;
分支路径确定模块,用于采用污点分析方法搜索所述分支路径的可利用状态,确定可利用的分支路径;
缝合模块,用于采用控制流缝合方法,将所述崩溃路径和所述可利用的分支路径进行缝合得到利用路径;
攻击利用组件生成模块,用于利用符号执行收集所述利用路径的相关约束,并通过求解所述相关约束生成攻击利用组件。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210925870.4A CN115168871B (zh) | 2022-08-03 | 2022-08-03 | 一种攻击利用组件的自动生成方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210925870.4A CN115168871B (zh) | 2022-08-03 | 2022-08-03 | 一种攻击利用组件的自动生成方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN115168871A true CN115168871A (zh) | 2022-10-11 |
CN115168871B CN115168871B (zh) | 2023-06-13 |
Family
ID=83477549
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210925870.4A Active CN115168871B (zh) | 2022-08-03 | 2022-08-03 | 一种攻击利用组件的自动生成方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115168871B (zh) |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR101921052B1 (ko) * | 2017-11-15 | 2018-11-22 | 한국인터넷진흥원 | 바이너리에 대한 보안 취약점 및 그 원인 위치의 식별 방법 및 그 장치 |
CN111832026A (zh) * | 2020-06-18 | 2020-10-27 | 广州大学 | 一种漏洞利用定位方法、系统、装置及介质 |
CN114741700A (zh) * | 2022-03-28 | 2022-07-12 | 中国人民解放军战略支援部队信息工程大学 | 基于符号化污点分析的公共组件库漏洞可利用性分析方法及装置 |
-
2022
- 2022-08-03 CN CN202210925870.4A patent/CN115168871B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR101921052B1 (ko) * | 2017-11-15 | 2018-11-22 | 한국인터넷진흥원 | 바이너리에 대한 보안 취약점 및 그 원인 위치의 식별 방법 및 그 장치 |
CN111832026A (zh) * | 2020-06-18 | 2020-10-27 | 广州大学 | 一种漏洞利用定位方法、系统、装置及介质 |
CN114741700A (zh) * | 2022-03-28 | 2022-07-12 | 中国人民解放军战略支援部队信息工程大学 | 基于符号化污点分析的公共组件库漏洞可利用性分析方法及装置 |
Non-Patent Citations (1)
Title |
---|
李超: "《二进制漏洞自动化利用技术研究》", no. 2020 * |
Also Published As
Publication number | Publication date |
---|---|
CN115168871B (zh) | 2023-06-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US12093398B2 (en) | Vulnerability analysis and reporting for embedded systems | |
CN111832026B (zh) | 一种漏洞利用定位方法、系统、装置及介质 | |
CN104732152A (zh) | 基于符号执行路径剪枝的缓冲区溢出漏洞自动检测方法 | |
Cao et al. | Oddfuzz: Discovering java deserialization vulnerabilities via structure-aware directed greybox fuzzing | |
Vadayath et al. | Arbiter: Bridging the static and dynamic divide in vulnerability discovery on binary programs | |
Zhao et al. | Haepg: An automatic multi-hop exploitation generation framework | |
Li et al. | Intent-preserving test repair | |
Srivastava et al. | One fuzz doesn’t fit all: Optimizing directed fuzzing via target-tailored program state restriction | |
CN118094567A (zh) | 一种基于x86-64指令集的二进制代码静态分析方法 | |
Saumya et al. | Xstressor: Automatic generation of large-scale worst-case test inputs by inferring path conditions | |
CN115168871B (zh) | 一种攻击利用组件的自动生成方法和装置 | |
CN116992453A (zh) | 一种基于栈哈希的漏洞根因自动定位方法及系统 | |
Borrello et al. | Predictive context-sensitive fuzzing | |
Wu et al. | Detecting Android Inter-App Data Leakage via Compositional Concolic Walking. | |
Zhang et al. | INSTRCR: Lightweight instrumentation optimization based on coverage-guided fuzz testing | |
Ganz et al. | Hunting for Truth: Analyzing Explanation Methods in Learning-based Vulnerability Discovery | |
CN114741700A (zh) | 基于符号化污点分析的公共组件库漏洞可利用性分析方法及装置 | |
Belle Lakshminarayan | Fuzzing: A comparison of fuzzing tools | |
Liu et al. | Detecting Exploit Primitives Automatically for Heap Vulnerabilities on Binary Programs | |
Zhang | Beak: A directed hybrid fuzzer for smart contracts | |
Vipindeep et al. | Efficient static analysis with path pruning using coverage data | |
CN114527963A (zh) | C++二进制文件中的类继承关系识别方法及电子装置 | |
Agrawal et al. | Preventing insider malware threats using program analysis techniques | |
Zhao et al. | A heuristic fuzz test generator for java native interface | |
Zhang et al. | {SymBisect}: Accurate Bisection for {Fuzzer-Exposed} Vulnerabilities |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |