掌桥专利:专业的专利平台
掌桥专利
首页

一种基于API HOOK的有状态网络协议模糊测试方法

文献发布时间:2024-04-18 19:53:33


一种基于API HOOK的有状态网络协议模糊测试方法

技术领域

本发明属于信息安全测试领域,具体涉及一种基于API HOOK的有状态网络协议模糊测试方法。

背景技术

网络协议是计算机网络中互相通信的实体之间交换信息时所要遵守的规则集合,包括通信环境、传输服务、词汇表、信息编码格式、时序/规则/过程等方面内容,网络上的各种应用服务程序都可认为是对特定协议的具体实现。

当前,网络应用服务的安全性问题日益突出,网络协议本身或网络应用服务在协议实现过程中存在的漏洞往往会导致严重的安全威胁,如OpenSSL(基于SSL的安全套接字层协议)的“心脏滴血”漏洞、Windows SMB(服务消息块协议)的“永恒之蓝”漏洞,都在全球范围造成了巨大危害。因此,对网络应用服务程序进行安全测试,排查服务程序或协议本身存在的漏洞,是保证应用服务安全可靠的必要措施。

模糊测试(Fuzzing)是一种基于缺陷注入的自动化软件测试技术,其技术思路简单、易于理解和重现,误报率低、可迅速定位软件中真正存在的漏洞,无需考虑其他漏洞挖掘方法(如符号执行)面临的路径爆炸问题,因此已成为当前应用最广泛的漏洞挖掘手段。近年来80%以上的公开漏洞都是通过模糊测试发现的。

几乎所有要求某种输入的软件都可以进行模糊测试,而网络应用服务程序的输入就是基于特定协议的网络通信,所以对网络应用服务程序的模糊测试被称为协议模糊测试(即协议Fuzing)。

模糊测试的核心在于通过各种变异操作不断产生新的测试用例输入到被测软件并观测异常。因此,测试用例生成质量直接决定着测试过程的效率和测试结果的全面性、可靠性。覆盖率驱动就是为了监测和评估用例质量并引导用例生成路径而提出的一种技术手段。如代码覆盖率是指输入测试用例后被测软件中被执行的代码占其全部代码的比例,代码覆盖率越高说明对软件的测试越全面、越充分,一定程度上也意味着更有可能触发异常、发现漏洞。通过监测每个测试用例输入被测软件后实现的代码覆盖率,选择代码覆盖率更高的用例进一步变异迭代,就能驱动测试进程向高覆盖率方向优化。

但是,网络协议通常是有状态的,协议的各种状态及状态间转换关系构成了协议对应的状态机。当网络应用服务程序的输入空间受到协议状态的严格控制,程序的行为就取决于当前状态在协议状态机上所处的位置,只有满足特定条件的输入数据才会触发程序的状态转换,否则程序就将丢弃输入而阻塞在当前状态下。因此在模糊测试过程中,如果测试用例不满足协议的状态转换条件,就会成为无效输入导致测试进程停滞。而代码覆盖率驱动方法既无法识别服务程序的状态信息,也无法获取通信消息所要求的报文格式和顺序,导致测试器难以掌握和突破协议状态机的限制,严重制约了测试效率和效果。

由于网络协议的这一特点,只有根据协议状态及其转换规则来引导测试用例的生成,才能实现有效、全面、可靠的测试。因此,协议模糊测试更适合以状态覆盖驱动为主,基于测试用例对协议状态空间的覆盖程度来评估其质量并引导测试进程。为此,AFLNet等工具通过提取服务程序响应报文中的状态码来识别协议状态,动态构建协议状态模型并引导测试用例逐步覆盖。但对于没有状态码或报文中缺少显式状态信息的协议来说,这种方法仍存在明显局限。

发明内容

本发明的目的在于提供一种基于API HOOK的有状态网络协议模糊测试方法。

实现本发明目的的技术解决方案为:第一方面,本发明提供一种基于API HOOK的有状态网络协议模糊测试方法,包括以下步骤:

步骤1,在被测服务程序可执行文件中插入探针对其系统API调用进行HOOK,拦截被测程序对内存分配/拷贝/释放、网络数据接收/发送API函数的调用,在执行自定义的HOOK函数后再返回到被测程序正常指令流程;

步骤2,对被测服务程序的正常业务通信流量进行抓包,从捕获的流量数据中筛选出客户端请求报文,保存为PCAP文件;

步骤3,将PCAP文件以重放方式发送给完成API HOOK后的被测程序;当被测程序接收处理请求报文时,HOOK函数会监视被测程序的通信会话周期、内存使用和内存数据变化,基于这些信息构建协议状态模型;

步骤4,基于步骤2中用于重放的请求报文进行各种变异,生成测试用例发送给被测服务程序;

步骤5,监视被测服务程序接收处理测试用例的过程,捕获异常信息并记录异常现场上下文环境,并基于步骤3生成的协议状态模型,对照HOOK探针监测到的内存变化情况来判断当前协议状态;

步骤6,根据测试用例触发异常的相关信息,以及HOOK函数监测到的协议状态变化情况,引导测试用例下一步变异;

步骤7,循环执行步骤4、5、6,直到捕获足够多的异常或达到预定的覆盖度。

进一步的,该方法还包括:分析测试过程中捕获的所有异常,确认其是否由被测程序存在的漏洞所引起,并开展定位、复现、机理分析、严重程度评估,撰写漏洞报告。

第二方面,本发明提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如第一方面所述的方法的步骤。

第三方面,本发明提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如第一方面所述的方法的步骤。

与现有技术相比,本发明的有益效果为:本发明的模糊测试方法,针对有状态网络协议的运行机制和技术特点,通过对被测服务程序的API调用进行HOOK,来跟踪其处理测试用例过程中的关键行为与内存状态,基于这些信息构建协议状态模型以引导测试用例的变异进化,从而更有效地扩展和深化测试路径,提高测试过程对协议状态空间的覆盖度,比现有的协议模糊测试方法具备更强的测试对象适应性和协议状态识别能力。

附图说明

图1是本发明的基于API HOOK的有状态网络协议模糊测试方法流程图。

图2是本发明的基于协议状态覆盖率引导的测试用例变异策略流程图。

图3是RECEIVING和SENDING两个状态转换规则示意图。

具体实施方式

为了解决现有技术存在的问题,本发明提出了一种基于API HOOK的有状态协议模糊测试方法:针对网络应用服务程序在维护协议状态信息及进行状态转换时必然涉及的网络通信和内存操作等行为,通过API HOOK技术对相应的操作系统功能API(应用程序接口函数)进行挂钩、插入探针指令,当被测程序调用这些API时,探针指令就会跟踪API的输入参数和返回结果等信息,基于这些信息分析推断协议状态及状态转换规则,从而构建状态模型以驱动测试。该方法不受协议状态码等外部表征限制,而是直接关注内存使用情况和内存数据来获取核心状态特征,有效提高了协议状态识别的准确性与可靠性,从而优化有状态网络协议的模糊测试效果,并能够适用于不输出特征码或缺少显示状态信息的协议。

本发明的有状态网络协议模糊测试方法,依次包括以下步骤:

(1)对被测服务程序的系统API调用进行HOOK

HOOK(钩子)技术是指对正常的数据通信或函数调用过程进行拦截,插入并执行自定义的指令后再返回到正常的通信或调用流程中。HOOK技术在网络攻击和防御两方面都有广泛应用:在对于攻击方来说,通过HOOK可以劫持目标的通信过程或运行逻辑,实现中间人欺骗、命令执行等攻击目的;对于防御方来说,通过HOOK可以监测被保护对象的运行状态,并为各种安防措施提供执行接口。

本发明的HOOK对象是被测服务程序中对特定系统API的调用。对基于有状态协议的网络服务程序,其在运行时必须维护特定的数据结构来存储当前的状态信息,并根据通信报文的接收、处理、发送等事件对状态信息进行更新。上述过程必然涉及内存分配/拷贝/释放、网络数据接收/发送等操作,而这些操作都是通过特定的系统API来实现的。因此,通过对被测服务程序中相关的系统API调用进行HOOK,获取并分析这些API被调用时的输入参数和返回结果等数据,就能实现对被测服务程序状态转换逻辑的跟踪,为构建协议状态模型提供基础。

以C语言标准库为例,本发明进行HOOK的主要API函数如下表所示。

表1

对API进行HOOK有两种基本方式:一是在目标API所属动态链接库(Linux系统中为so,Windows系统中为dll)中修改API的入口,二是在被测程序可执行文件的外部符号引用数据结构(Linux的ELF文件中为got表和plt表、Windows的PE文件中为导入表)中修改对目标API的引用指针。第一种方式会使本地系统所有进程对目标API的调用都被HOOK,而第二种方式只对被测程序的API调用进行HOOK。为避免影响其他进程运行并减少外部干扰,本发明采用的是第二种HOOK方式。

(2)基于流量重放跟踪状态转换逻辑、构建状态模型

对被测网络服务程序的正常业务通信流量进行抓包,从捕获的流量数据中筛选出客户端请求报文以重放方式发送给完成API HOOK后的被测程序。在此过程中,通过APIHOOK插入的探针将会拦截被测程序对目标API的调用并执行相应操作,例如:

对于malloc内存分配函数,探针会将该内存块指针添加到跟踪列表中,并为其创建跟踪快照序列,同时获取其返回的内存块大小及其首地址指针等信息用于创建序列中的首个内存快照对象;

对于free内存释放函数,探针将获取其要释放的内存块指针,并在内存跟踪列表中检索和删除相应的指针;

对于send、recv、recvfrom等网络通信函数,探针将在其执行前和返回后各遍历一次内存跟踪列表对其中所有被跟踪的内存指针记录快照,追加到相应内存指针的跟踪快照序列中;

对于memcpy内存拷贝函数,探针将记录拷贝操作的源内存块指针和目的内存块指针,将目的内存块的快照追加到源内存块所在的跟踪快照序列中。

基于HOOK探针获取数据构建协议状态模型的步骤如下:

a.当被测服务程序与某一客户端建立socket连接时,针对该连接创建跟踪线程并构建其会话状态机,该状态机包含RECEIVING和SENDING两个状态,其转换规则如图3所示,两次状态转换之间作为一个会话周期;

b.当被测服务程序调用malloc函数申请分配内存时,创建相应的内存快照;

c.当被测服务程序调用memcpy函数拷贝内存数据时(由于内存拷贝前必然要调用malloc函数分配源和目的内存块,所以此时两个内存块都已经创建了快照),将目的内存块的快照追加到源内存块所在跟踪快照序列中;

d.当被测服务程序调用free函数释放内存时,遍历跟踪列表将被释放内存块对应的指针删除;特别地,若该内存块在被释放前未将其数据拷贝到其他内存块,则终止记录该内存块所在的快照序列;

e.当一个或多个连续的send()函数调用后发生第一个recv()/recvfrom()函数调用、或一个或多个连续的recv()/recvfrom()函数调用后发生第一个send()函数调用,则会话状态切换,此时遍历跟踪列表逐个对快照对象对应内存块中的数据进行哈希计算,将内存地址、会话周期序号和哈希值等信息记录到一个结构体数组(称作状态哈希)中

f.抓包数据重放完毕后,遍历状态哈希序列,将每个哈希序列按照会话周期先后顺序排列,以单个哈希值作为一个状态、相邻会话周期间哈希值的变化作为一次状态转换来构建协议状态模型。

由于本发明的核心思想在于观察被测服务程序运行时内存数据的变化来识别其状态,而绝大多数情况下,这样的状态在被测程序内部会以变量的形式来表示——对应到内存中就是特定地址中存储的值。因此,HOOK函数可能实现的最理想效果就是识别出所有存储这些状态表示变量的内存区域。

因此,HOOK函数重点观察的对象包括:被测程序初始化时即申请、且运行过程中从未释放的内存区域,被测程序每次释放内存时都会将其所存数据拷贝到新地址的内存区域,被测程序每个会话周期发生RECEIVING和SENDING状态切换时都会发生数据更新的内存区域,被测程序每次调用recv、send等网络通信函数后都会发生数据更新的内存区域等。

(3)基于客户端请求报文生成测试用例

生成测试用例是模糊测试的核心步骤,测试用例的生成质量直接决定了测试的有效性与可靠性。在协议模糊测试中,测试用例在形式上就是发送给网络服务程序的请求报文。因此,生成测试用例的基本思路就是在抓包捕获的正常请求报文基础上进行各种变异,具体步骤如下:

a.从抓包捕获的被测网络服务程序正常通信流量数据文件中筛选出客户端发往服务端的请求报文,并将IP、TCP等底层协议的报文头区域从可变异范围中排除;

b.以上述报文作为初始“种子”开始进行变异,也就是对报文的内容和结构进行各种变换。变异的策略包含两种类型:一是确定性变异,即变异方式和范围可以确定的变异,如比特翻转、随机加减、数据替换等;二是不确定性变异,即变异方式和范围随机不可确定的变异,如删除、乱序、切割、拼接等;

c.将生成的测试用例作为请求报文发送给被测服务程序。

(4)监测状态变化及异常

监视被测服务程序接收处理测试用例的过程,一旦触发测试用例触发被测服务的异常,则捕获异常信息并记录异常现场上下文环境;同时基于步骤(2)生成的协议状态模型,通过被测服务程序中HOOK探针监测到的内存变化情况来判断当前协议状态。

(5)优化迭代

根据步骤(4)中得到的异常监测和协议状态变化情况,按照如下策略进行循环迭代:

a.若本测试用例触发了异常,则将其加入种子队列中,并在其出列时再次变异,即转到步骤(3);

b.若本测试用例未触发异常,但能够导致被测服务程序发生协议状态切换,则说明本次变异有效,同样将其加入种子队列中,等待进入变异迭代;

c.特别地,若本测试用例能够导致被测程序切换到本次测试过程中尚未覆盖的状态,则其加入种子队列时将赋予更高的出列优先级;

d.若本测试用例未触发异常、且未导致被测服务程序发生协议状态切换,则说明本次变异无效,应丢弃本用例、返回变异前状态并转到步骤(3)重新变异。

上述策略如图2所示。

(6)分析异常

针对测试过程中触发了异常的用例,基于异常信息及异常现场上下文环境记录结果,运用代码审计、逆向分析、调试跟踪等手段对异常类型、触发机理、执行流程和输入条件进行分析,判断异常的可复现性与可利用性,确认异常对应的漏洞种类与严重程度,将分析判定结果作为漏洞挖掘报告的依据。

本发明基于被测服务程序运行过程中内存使用情况和内存数据的变化来识别其所处状态,以此为基础构建协议状态模型,在后续测试中把提高测试进程对该模型中状态点的覆盖程度作为目标引导测试用例迭代生成。

运用HOOK技术对被测服务程序对系统的网络通信、内存分配、内存拷贝等关键功能API进行挂钩、插入HOOK函数,使API被调用前首先执行HOOK函数,在HOOK函数执行完毕后再返回原有调用流程继续执行,从而获取被测服务程序运行过程中关键内存对象的变化情况,实现对程序所处协议状态的识别与跟踪。

本发明针对有状态协议模糊测试的需求特点,采用API HOOK技术跟踪监测被测服务程序接收处理输入报文的过程,将内存使用情况和内存数据作为被测程序的状态标识,从而构建其协议状态模型,在后续测试迭代阶段基于该模型判断测试用例所引起的被测程序状态变化,并依此来引导新用例的生成。该方法不受协议状态码等外部表征限制,而是直接关注内存使用情况和内存数据来获取核心状态特征,有效提高了协议状态识别的准确性与可靠性,从而优化有状态网络协议的模糊测试效果,并能够适用于不输出特征码或缺少显示状态信息的协议。

下面结合附图与实施例对本发明作进一步说明,但本发明并不限于该实施例。

在本发明的实施例中,被测软件为一款在Windows操作系统平台上运行的网络服务程序。

实施例

本实施例提供一种基于API HOOK的有状态网络协议模糊测试方法,目标软件为一款在Windows操作系统平台上运行的网络服务程序,该程序基于自定义的私有协议提供远程数据传输服务。

参考图1,本发明的有状态网络协议模糊测试方法,包括以下步骤:

a.对被测服务程序的系统API调用进行HOOK;

本实施例中采用修改被测程序外部符号引用指针的方式对其API调用进行HOOK。

首先,使用IDA Pro等反汇编工具查看被测程序可执行文件中的导入表,获取需要HOOK的目标API引用指针。由于被测程序运行在Windows平台上,因此关键的目标API包括VirtualAlloc、HeapAlloc等内存分配函数,VirtualFree、HeapFree等内存释放函数,recv、send等网络通信函数,strcpy、memcpy等内存拷贝函数。

接下来,将被测程序和HOOK框架加载到内存中运行,并在其内存映像中将所有目标API引用位置改写为HOOK框架中特定HOOK函数的指针。这样,被测程序调用目标这些API时就会跳转执行相应的HOOK函数。

最后,所有HOOK函数都会在其末尾执行一个跳转指令,返回到被测程序原来的API引用指针处。这样,被测程序就将恢复到未HOOK前的原始指令流继续运行。

b.基于流量重放构建协议状态模型;

本实施例中已事先在被测程序正常运行环境下抓包捕获了大量业务通信流量数据,以PCAP文件的形式保存。在PCAP文件中过滤出所有从客户端发送到服务端的请求报文,将其HOOK后的被测程序进行重放。当被测程序接收处理这些重放报文的过程中调用被HOOK的API时,HOOK函数就会跟踪记录会话周期切换和内存状态变化情况。

重放完成后,保存当前生成的所有状态哈希序列,并通过序列分析处理(包括合并相似序列、删除过短序列、修剪分支序列等),构建出被测程序的协议状态机。本实施例中最终保留了十余个状态哈希序列。

c.生成测试用例;

在上一步重放数据的基础上生成测试用例(即变异后的客户端请求报文),初始化若干个随机变异样本开始迭代,迭代过程中产生的新种子则会加入待选种子队列中;当迭代中的某一变异路径被抛弃时,从待选种子队列中选取优先级最高的种子开启新的变异路径。

d.执行测试用例与迭代;

将生成的测试用例作为请求报文向被测服务程序发送,同时监视被测程序接收处理测试用例过程中的异常触发情况和HOOK函数探测到的协议状态变化情况,并根据图2所示流程确定变异策略,转到步骤c继续迭代。

e.保存异常信息

当测试用例触发了被测程序的异常,则记录异常类型、异常触发位置和异常现场上下文环境信息,以供后续开展异常分析和漏洞发现;

本实施例中还设置了一个使用Sulley模糊测试框架的对照组,该对照组同样对进行了HOOK的被测程序进行Fuzz,在此过程中HOOK函数将监测Sulley框架对协议状态机的覆盖情况(但Sulley无法使用这些信息引导其样本变异),从而与本发明的运行结果进行对比。

通过实验发现,本发明的测试框架能够使Fuzz过程覆盖95%的状态哈希,而Sulley框架只能覆盖76%的状态哈希,且本发明测试框架所捕获的异常数量超出Sulley框架约30%。这说明本发明能够有效提高模糊测试过程对被测服务程序协议状态的覆盖程度,从而更深入、更全面地挖掘其存在的漏洞。

应当注意的是,本发明的实施例有较佳的实施性,且并非对本发明作任何形式的限制,任何熟悉该领域的技术人员可能利用上述揭示的技术内容变更或修饰为等同的有效实施例,但凡未脱离本发明技术方案的内容,依据本发明的技术实质对以上实施例所作的任何修改或等同变化及修饰,均仍属于本发明技术方案的范围内。

相关技术
  • 基于大数据分析平台的发电大数据预处理方法及系统
  • 大数据背景下基于乐观锁机制实现主数据版本管理的系统及方法
  • 基于大数据仓库分层的税务数据资产分类管理方法及系统
  • 基于大数据的数据安全应急管理分析方法及系统
  • 一种基于大数据分析技术的工业安全应急管理平台
技术分类

06120116338624