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

基于def-use数据依赖图的IPSec协议状态变化标识方法

文献发布时间:2024-01-17 01:21:27


基于def-use数据依赖图的IPSec协议状态变化标识方法

技术领域

本发明涉及网络安全技术领域,尤其涉及一种基于def-use数据依赖图的IPSec协议状态变化标识方法。

背景技术

IPSec(Internet Protocol Security,互联网安全协议)是VPN(Virtual PrivateNetwork,虚拟专用网)中一种广泛应用的技术,它为 IP 数据报提供了高质量的、可互操作的、基于密码学的安全性,从而实现在Internet非安全信道中的保密通讯。出于不同应用场景的需求,IPSec拥有不同的具体实现,包括StrongSwan、OpenSwan、LibreSwan等开源软件以及Cisco、Juniper等众多厂商的闭源产品,可以运行于主机、服务器、路由器、防火墙网关等多类型设备环境。

IPSec是一个协议族,由IKE、AH、ESP、IPSec DOI等一系列子协议构成,定义了一套复杂的协议状态转换关系,以实现对IP报文数据完整性检测、加密保护和身份验证等诸多安全特性。如,IKE负责协商加密密钥和验证密钥以保护私有数据;AH协议提供数据完整性验证,但不提供加密服务。这些子协议自身的设计与实现安全是整个IPSec VPN系统安全的基石,因此研究IPSec协议的安全性,挖掘协议可能存在的安全漏洞,具有十分重要的意义。

当前,模糊测试技术是IPSec协议安全测试分析的主流技术,其面临的一大技术挑战是如何有效标识IPSec协议工作状态并进行反馈引导,从而提高协议渗透深度和模糊测试效率。

现有协议状态提取方法主要有三大类。一类是基于模式生成的方法,如Peach、BooFuzz、SPFuzz、PavFuzz等,通过人工阅读分析协议规范说明文档,采用自定义的模式(如xml)描述消息格式和状态转换关系,自主生成测试用例;其局限性在于,依赖大量专家知识和人工分析,且不同协议实现细节的差异导致协议状态模型描述不准确。第二类是基于推理学习的方法,如AFLnet、SnapFuzz、SNPSFuzzer,ICS3Fuzzer、DTLS-Fuzzer等,基于网络流量截包,采用主、被动学习方法,从交互数据中推理获得协议状态变化信息;其局限性在于,黑盒测试模式,协议测试渗透深度不够,同时依赖通信I/O数据,网络通信延迟严重限制测试吞吐量。第三类是基于运行信息提取的方法,如FirmHunter、StateAFL、StateInspector等,通过运行时动态插桩或者快照方式,分析内存、I/O、寄存器等上下文数据,获得协议状态变化信息;其局限性在于,运行时动态插桩增加了内存和CPU开销,降低了测试效率。

发明内容

为解决现有协议状态提取方法存在依赖人工分析、协议测试渗透深度不足以及测试效率低的问题,本发明提供一种基于def-use数据依赖图的IPsec协议状态变化标识方法。

本发明提供一种基于def-use数据依赖图的IPSec协议状态变化标识方法,包括:

步骤1:获取实现IPSec协议的目标二进制程序;

步骤2:对所述目标二进制程序进行重写插桩来实现基本块的标识和定位;

步骤3:对重写插桩后的目标二进制程序进行扫描以获取所有函数指针间接调用指令,并生成包含所有函数指针间接调用指令所在位置索引的指针函数字典;

步骤4:遍历所述目标二进制程序中的所有函数,为每个函数生成对应的def-use数据依赖图;

步骤5:遍历所述目标二进制程序中所有结构体变量赋值指令,根据每条赋值指令所在函数的def-use数据依赖图和所述指针函数字典标识出协议状态变化操作所在代码的位置。

进一步地,其特征在于,步骤2具体包括:

对所述目标二进制程序进行反汇编并生成中间语言;

基于所述中间语言,采用二进制重写工具在目标二进制程序的数据段中插入一个全局共享数组和一个全局整型变量,以及在代码段中的每个基本块起始位置均插入两条特征指令;其中一条特征指令用于为所在基本块生成一个随机数,并采用该随机数作为下标对全局共享数组进行计数操作来基本块的标识,另一条特征指令采用魔数对全局整型变量进行赋值来实现基本块定位。

进一步地,步骤3具体包括:

使用反汇编工具对重写插桩后的目标二进制程序进行反汇编得到汇编代码;

基于所述汇编代码对代码段进行全空间扫描,正向搜索具有预设特征的指令语句作为函数指针间接调用指令;其中,具有预设特征的指令语句为“

对于每条函数指针间接调用指令,从其所在位置开始,反向搜索并提取该函数指针间接调用指令所在基本块对应的随机数,将该随机数和该函数指针间接调用指令所在位置组成二元组信息,将该二元组信息存入以函数指针偏移量

进一步地,步骤4中,通过IDAPython使用miasm插件遍历所述目标二进制程序中的所有函数,生成以函数为单位的def-use数据依赖图。

进一步地,步骤5具体包括:

将满足预设约束条件的指令语句作为结构体变量赋值指令,所述预设约束条件包括:指令语句为“

判断源操作数

根据源操作数

进一步地,所述的根据源操作数

步骤A1:针对函数内部初始定义模式,继续判断

步骤A2:针对函数直接调用参数传入模式,获取该赋值指令所在函数的代码交叉引用列表,遍历该代码交叉引用列表中的每个调用点代码位置,进入对应调用函数代码空间,接着转步骤A1按函数内部初始定义模式处理;

步骤A3:针对函数指针间接调用参数传入模式,获取该赋值指令所在函数的数据交叉引用表,在该数据交叉引用表中定位至数据引用代码位置,正向搜索“

本发明的有益效果:

(1)本发明通过获取不同具体实现的IPSec协议的二进制程序,从而基于二进制程序进行静态逆向分析,从中标识出协议状态变化信息;基于该设计构思,一方面是直接基于二进制程序进行分析,而无需针对不同协议实现细节对协议状态模型进行描述,因此无需依赖大量专家知识和人工分析;另一方面,对二进制程序进行静态分析,而不是动态插桩,则降低了开销,提高了测试效率。

(2)在获取二进制程序时,若为开源产品,可直接对开源源码编译链接生成二进制程序,若为闭源产品,可通过解压提取闭源产品固件来获取二进制程序;因此,本发明支持对开源、闭源程序分析。

(3)由于本发明是基于def-use数据依赖图来实现IPSec协议状态变化标识的,理论上支持对协议内部所有子状态的标识,提供细粒度的状态变化信息反馈,提升了协议测试渗透深度。

(4)本发明是IPSec协议实现的二进制程序来标识协议状态变化的,而二进制程序的获取并不依赖于网络通信交互,因此,本发明支持提供离线式IPSec协议状态变化标识,不受网络通信延迟的限制。

(5)本发明并未额外增加程序负担,可与现有主流网络协议模糊测试平台无缝结合,提高了有状态协议的模糊测试效率。

附图说明

图1是本发明实施例提供的基于def-use数据依赖图的IPSec协议状态变化标识方法的流程图之一;

图2是本发明实施例提供的基于def-use数据依赖图的IPSec协议状态变化标识方法的流程图之二;

图3是本发明实施例提供的目标二进制程序的静态插桩示意图;

图4是本发明实施例提供的函数级def-use数据依赖图示意图;

图5是本发明实施例提供的函数内部初始定义模式赋值指令示意;

图6是本发明实施例提供的函数直接调用参数传入模式赋值指令示意;

图7是本发明实施例提供的函数指针间接调用参数传入模式赋值指令示意。

具体实施方式

为使本发明的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

实施例1

如图1所示,本发明实施例提供一种基于def-use数据依赖图的IPSec协议状态变化标识方法,包括以下步骤:

S101:获取实现IPSec协议的目标二进制程序;

具体地,由于IPSec协议的具体实现存在开源产品形式和闭源产品形式,当为开源产品形式时,可以通过该开源产品的开源源码编译链接生成二进制程序,即为目标二进制程序;当为闭源产品形式时,可以通过解压提取闭源产品固件来获取二进制程序,即为目标二进制程序。

需要说明的是,由于指令集的差异仅使得特征指令的具体表现形式不同,而目标二进制程序的分析原理是一致的,因此,本发明实施例支持不同处理器架构类型的目标二进制程序,主流的包括Intel x86_64位、ARM aarch64位、MIPS 64位等三种指令集程序形式。

S102:对所述目标二进制程序进行重写插桩来实现基本块的标识和定位;

S103:对重写插桩后的目标二进制程序进行扫描以获取所有函数指针间接调用指令,并生成包含所有函数指针间接调用指令所在位置索引的指针函数字典;

S104:遍历所述目标二进制程序中的所有函数,为每个函数生成对应的def-use数据依赖图;

具体地,采用def-use数据依赖图刻画函数内部变量数据流信息,建立数据值定义与数据值使用之间的路径关系。

其中,数据值定义在变量进行初始化、赋值或接收参数传入等位置发生;数据值使用在条件分支、函数调用传参等位置发生。如图4所示,图中每个节点表示一个变量的数据值定义,节点和节点之间的边表示数据值在不同变量之间的传递。因此,给定一个变量的使用位置可以回溯追踪到该变量的初始定义值。通过为每个函数生成def-use数据依赖图,方便后续定位协议状态变化操作所在代码的位置。本实施例中,将def-use数据依赖图按照dot格式存入以函数名命名的文件中。

S105:遍历所述目标二进制程序中所有结构体变量赋值指令,根据每条赋值指令所在函数的def-use数据依赖图和所述指针函数字典标识出协议状态变化操作所在代码的位置。

具体地,为规范IPSec开发拓展和推广应用,IETF(Internet Engineering TaskForce,互联网工程任务组)制定了标准跟踪规范并定义了状态模式、交换类型、负载格式、消息参数,以及安全相关信息的命名约定;因此各IPSec协议实现,在源码编程开发时遵循规范约定。基于此,通过对IPSec协议实现程序具体编程实践中的编码共性特点进行观察,可以发现以下特点:(1)为实现会话双方通信同步,通常采用enum或define方式定义命名常量来表示协议不同状态;例如,QUICK_MODE=32,IKE_SA_INIT=34,IKE_AUTH=35。(2)在源码层面,协议状态值变化体现形式是

本发明实施例提供的IPSec协议状态变化标识方法,将IPSec协议状态迁移变化映射到程序汇编指令层面,通过定位与协议状态变化相关的赋值指令,然后根据该赋值指令所在函数的数据依赖图以及包含指令位置索引的指针函数字典,从而能够回溯分析并提取协议状态所在基本块位置与对应反映协议状态变化的状态值。

实施例2

在上述实施例1的基础上,如图2所示,本发明还提供一种基于def-use数据依赖图的IPSec协议状态变化标识方法,主要包括预处理阶段和扫描标识阶段,具体包括以下步骤:

S201:获取实现IPSec协议的目标二进制程序;

S202:对所述目标二进制程序进行重写插桩来实现基本块的标识和定位;本实施例中实现基本块的标识和定位的过程具体如下:

对所述目标二进制程序进行反汇编并生成中间语言,本实施例中,采用LLVM IR作为中间语言;

基于所述中间语言,采用主流的二进制重写工具Zipr,在该工具的Transformation模块中,通过User-specifiedTransformtions功能,添加插桩自定义转换,从而在目标二进制程序的数据段中插入一个无符号字符型的全局共享数组

以及,在代码段中的每个基本块起始位置均插入两条特征指令;其中一条特征指令用于为所在基本块生成一个随机数,并采用该随机数作为下标对全局共享数组进行计数操作来基本块的标识,另一条特征指令采用魔数对全局整型变量进行赋值来实现基本块定位。两条特征指令的伪代码如下:

其中,第一条指令中的

S203:对重写插桩后的目标二进制程序进行扫描以获取所有函数指针间接调用指令,并生成包含所有函数指针间接调用指令所在位置索引的指针函数字典;

具体地,首先,使用反汇编工具对重写插桩后的目标二进制程序进行反汇编得到汇编代码; 然后,基于所述汇编代码对代码段进行全空间扫描,正向搜索具有预设特征的指令语句作为函数指针间接调用指令;其中,具有预设特征的指令语句为“

需要说明的是,在汇编层面,函数的调用分直接调用和函数指针间接调用两种;其中,一般而言,直接调用指令形如

S204:遍历所述目标二进制程序中的所有函数,为每个函数生成对应的def-use数据依赖图;

S205:遍历所述目标二进制程序中所有结构体变量赋值指令,根据每条赋值指令所在函数的def-use数据依赖图和所述指针函数字典标识出协议状态变化操作所在代码的位置。具体包括以下步骤:

将满足预设约束条件的指令语句作为结构体变量赋值指令,所述预设约束条件包括:指令语句为“

判断源操作数

根据源操作数

步骤A1:如图5所示,针对函数内部初始定义模式,继续判断

(1)若值为立即数,则直接按照<基本块标识,状态变量偏移,状态值立即数,赋值类型, 所在函数名称>五元组格式记录该赋值指令位置,即为协议状态变化操作所在代码的位置;

(2)若值传递自一个立即数,则在函数代码区域内依据对应函数的def-use数据依赖图,遍历所有路径,以该赋值指令所在位置为起点,回溯追踪

步骤A2:如图6所示,针对函数直接调用参数传入模式,由于该赋值指令中的

步骤A3:如图7所示,针对函数指针间接调用参数传入模式,由于该赋值指令中

最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

技术分类

06120116149694