基于def-use数据依赖图的IPSec协议状态变化标识方法
未命名
08-13
阅读:178
评论:0
基于def-use数据依赖图的ipsec协议状态变化标识方法
技术领域
1.本发明涉及网络安全技术领域,尤其涉及一种基于def-use数据依赖图的ipsec协议状态变化标识方法。
背景技术:
2.ipsec(internet protocol security,互联网安全协议)是vpn(virtual private network,虚拟专用网)中一种广泛应用的技术,它为 ip 数据报提供了高质量的、可互操作的、基于密码学的安全性,从而实现在internet非安全信道中的保密通讯。出于不同应用场景的需求,ipsec拥有不同的具体实现,包括strongswan、openswan、libreswan等开源软件以及cisco、juniper等众多厂商的闭源产品,可以运行于主机、服务器、路由器、防火墙网关等多类型设备环境。
3.ipsec是一个协议族,由ike、ah、esp、ipsec doi等一系列子协议构成,定义了一套复杂的协议状态转换关系,以实现对ip报文数据完整性检测、加密保护和身份验证等诸多安全特性。如,ike负责协商加密密钥和验证密钥以保护私有数据;ah协议提供数据完整性验证,但不提供加密服务。这些子协议自身的设计与实现安全是整个ipsec vpn系统安全的基石,因此研究ipsec协议的安全性,挖掘协议可能存在的安全漏洞,具有十分重要的意义。
4.当前,模糊测试技术是ipsec协议安全测试分析的主流技术,其面临的一大技术挑战是如何有效标识ipsec协议工作状态并进行反馈引导,从而提高协议渗透深度和模糊测试效率。
5.现有协议状态提取方法主要有三大类。一类是基于模式生成的方法,如peach、boofuzz、spfuzz、pavfuzz等,通过人工阅读分析协议规范说明文档,采用自定义的模式(如xml)描述消息格式和状态转换关系,自主生成测试用例;其局限性在于,依赖大量专家知识和人工分析,且不同协议实现细节的差异导致协议状态模型描述不准确。第二类是基于推理学习的方法,如aflnet、snapfuzz、snpsfuzzer,ics3fuzzer、dtls-fuzzer等,基于网络流量截包,采用主、被动学习方法,从交互数据中推理获得协议状态变化信息;其局限性在于,黑盒测试模式,协议测试渗透深度不够,同时依赖通信i/o数据,网络通信延迟严重限制测试吞吐量。第三类是基于运行信息提取的方法,如firmhunter、stateafl、stateinspector等,通过运行时动态插桩或者快照方式,分析内存、i/o、寄存器等上下文数据,获得协议状态变化信息;其局限性在于,运行时动态插桩增加了内存和cpu开销,降低了测试效率。
技术实现要素:
6.为解决现有协议状态提取方法存在依赖人工分析、协议测试渗透深度不足以及测试效率低的问题,本发明提供一种基于def-use数据依赖图的ipsec协议状态变化标识方法。
7.本发明提供一种基于def-use数据依赖图的ipsec协议状态变化标识方法,包括:步骤1:获取实现ipsec协议的目标二进制程序;
步骤2:对所述目标二进制程序进行重写插桩来实现基本块的标识和定位;步骤3:对重写插桩后的目标二进制程序进行扫描以获取所有函数指针间接调用指令,并生成包含所有函数指针间接调用指令所在位置索引的指针函数字典;步骤4:遍历所述目标二进制程序中的所有函数,为每个函数生成对应的def-use数据依赖图;步骤5:遍历所述目标二进制程序中所有结构体变量赋值指令,根据每条赋值指令所在函数的def-use数据依赖图和所述指针函数字典标识出协议状态变化操作所在代码的位置。
8.进一步地,其特征在于,步骤2具体包括:对所述目标二进制程序进行反汇编并生成中间语言;基于所述中间语言,采用二进制重写工具在目标二进制程序的数据段中插入一个全局共享数组和一个全局整型变量,以及在代码段中的每个基本块起始位置均插入两条特征指令;其中一条特征指令用于为所在基本块生成一个随机数,并采用该随机数作为下标对全局共享数组进行计数操作来基本块的标识,另一条特征指令采用魔数对全局整型变量进行赋值来实现基本块定位。
9.进一步地,步骤3具体包括:使用反汇编工具对重写插桩后的目标二进制程序进行反汇编得到汇编代码;基于所述汇编代码对代码段进行全空间扫描,正向搜索具有预设特征的指令语句作为函数指针间接调用指令;其中,具有预设特征的指令语句为“call[base+func_offset]”类型,base表示结构体变量地址,func_offset表示函数指针偏移量;对于每条函数指针间接调用指令,从其所在位置开始,反向搜索并提取该函数指针间接调用指令所在基本块对应的随机数,将该随机数和该函数指针间接调用指令所在位置组成二元组信息,将该二元组信息存入以函数指针偏移量func_offset为key值的指针函数字典。
[0010]
进一步地,步骤4中,通过idapython使用miasm插件遍历所述目标二进制程序中的所有函数,生成以函数为单位的def-use数据依赖图。
[0011]
进一步地,步骤5具体包括:将满足预设约束条件的指令语句作为结构体变量赋值指令,所述预设约束条件包括:指令语句为“mov [base+dst_offset],src_value”类型,且目的操作数[base+dst_offset]中的base地址值属性为内存地址、dst_offset值是非0立即数,且源操作数src_value的值为立即数或者值传递自一个立即数,且在程序控制流中存在以[base+dst_offset]为地址的结构体变量被引用;判断源操作数src_value的值类型属于函数内部初始定义、函数直接调用参数传入和函数指针间接调用参数传入三种模式中的何种模式;根据源操作数src_value的值类型所属模式,采取对应的标识方式标识出协议状态变化操作所在代码的位置。
[0012]
进一步地,所述的根据源操作数src_value的值类型所属模式,采取对应的标识方式标识出协议状态变化操作所在代码的位置,具体包括:步骤a1:针对函数内部初始定义模式,继续判断src_value的值类型:若值为立即
数,则直接按照《基本块标识,状态变量偏移,状态值立即数,赋值类型, 所在函数名称》五元组格式记录该赋值指令位置,即为协议状态变化操作所在代码的位置;若值传递自一个立即数,则在函数代码区域内依据对应函数的def-use数据依赖图,遍历所有路径,以该赋值指令所在位置为起点,回溯追踪src_value的值传递过程,直至追踪到定义立即数初值的位置,则按照《基本块标识,状态变量偏移,状态值立即数,赋值类型, 所在函数名称》记录该立即数初值定义的位置,即为协议状态变化操作所在代码的位置;步骤a2:针对函数直接调用参数传入模式,获取该赋值指令所在函数的代码交叉引用列表,遍历该代码交叉引用列表中的每个调用点代码位置,进入对应调用函数代码空间,接着转步骤a1按函数内部初始定义模式处理;步骤a3:针对函数指针间接调用参数传入模式,获取该赋值指令所在函数的数据交叉引用表,在该数据交叉引用表中定位至数据引用代码位置,正向搜索“lea reg,fun_offset;mov [base+func_offset],reg”2条关联指令,采用func_offset作为key值,查询指针函数字典,以获得func_offset对应的所有函数指针间接调用指令的代码位置,逐一进入每条函数指针间接调用指令的代码空间进行遍历并转步骤a1按函数内部初始定义模式处理。
[0013]
本发明的有益效果:(1)本发明通过获取不同具体实现的ipsec协议的二进制程序,从而基于二进制程序进行静态逆向分析,从中标识出协议状态变化信息;基于该设计构思,一方面是直接基于二进制程序进行分析,而无需针对不同协议实现细节对协议状态模型进行描述,因此无需依赖大量专家知识和人工分析;另一方面,对二进制程序进行静态分析,而不是动态插桩,则降低了开销,提高了测试效率。
[0014]
(2)在获取二进制程序时,若为开源产品,可直接对开源源码编译链接生成二进制程序,若为闭源产品,可通过解压提取闭源产品固件来获取二进制程序;因此,本发明支持对开源、闭源程序分析。
[0015]
(3)由于本发明是基于def-use数据依赖图来实现ipsec协议状态变化标识的,理论上支持对协议内部所有子状态的标识,提供细粒度的状态变化信息反馈,提升了协议测试渗透深度。
[0016]
(4)本发明是ipsec协议实现的二进制程序来标识协议状态变化的,而二进制程序的获取并不依赖于网络通信交互,因此,本发明支持提供离线式ipsec协议状态变化标识,不受网络通信延迟的限制。
[0017]
(5)本发明并未额外增加程序负担,可与现有主流网络协议模糊测试平台无缝结合,提高了有状态协议的模糊测试效率。
附图说明
[0018]
图1是本发明实施例提供的基于def-use数据依赖图的ipsec协议状态变化标识方法的流程图之一;图2是本发明实施例提供的基于def-use数据依赖图的ipsec协议状态变化标识方法的流程图之二;图3是本发明实施例提供的目标二进制程序的静态插桩示意图;
force,互联网工程任务组)制定了标准跟踪规范并定义了状态模式、交换类型、负载格式、消息参数,以及安全相关信息的命名约定;因此各ipsec协议实现,在源码编程开发时遵循规范约定。基于此,通过对ipsec协议实现程序具体编程实践中的编码共性特点进行观察,可以发现以下特点:(1)为实现会话双方通信同步,通常采用enum或define方式定义命名常量来表示协议不同状态;例如,quick_mode=32,ike_sa_init=34,ike_auth=35。(2)在源码层面,协议状态值变化体现形式是this-》state=new_state形式的赋值操作;(3)在汇编指令层面,协议状态值变化体现形式则是mov [base+dst_offset],new_state形式的赋值操作;其中,不同的dst_offset代表着不同的状态变量(如密钥交换状态、任务管理状态),new_state数值类型为立即数常量。从以上内容可以看出,在发生协议状态变化操作时,必存在结构体变量赋值指令操作。因此,本发明实施例通过遍历目标二进制程序所有结构体变量赋值指令,即可获得目标二进制程序中所有进行状态变化操作所在的代码位置。
[0026]
本发明实施例提供的ipsec协议状态变化标识方法,将ipsec协议状态迁移变化映射到程序汇编指令层面,通过定位与协议状态变化相关的赋值指令,然后根据该赋值指令所在函数的数据依赖图以及包含指令位置索引的指针函数字典,从而能够回溯分析并提取协议状态所在基本块位置与对应反映协议状态变化的状态值。
[0027]
实施例2在上述实施例1的基础上,如图2所示,本发明还提供一种基于def-use数据依赖图的ipsec协议状态变化标识方法,主要包括预处理阶段和扫描标识阶段,具体包括以下步骤:s201:获取实现ipsec协议的目标二进制程序;s202:对所述目标二进制程序进行重写插桩来实现基本块的标识和定位;本实施例中实现基本块的标识和定位的过程具体如下:对所述目标二进制程序进行反汇编并生成中间语言,本实施例中,采用llvm ir作为中间语言;基于所述中间语言,采用主流的二进制重写工具zipr,在该工具的transformation模块中,通过user-specifiedtransformtions功能,添加插桩自定义转换,从而在目标二进制程序的数据段中插入一个无符号字符型的全局共享数组shm_state[]和一个无符号整型的全局变量g_magic;以及,在代码段中的每个基本块起始位置均插入两条特征指令;其中一条特征指令用于为所在基本块生成一个随机数,并采用该随机数作为下标对全局共享数组进行计数操作来基本块的标识,另一条特征指令采用魔数对全局整型变量进行赋值来实现基本块定位。两条特征指令的伪代码如下:mov g_magic=0xbeefbeef,add shm_state[rand_id],1其中,第一条指令中的0xbeefbeef为魔数,在代码搜索中用来做定位匹配;第二条指令用于代码基本块命中统计,提取下标rand_id值(随机数)可作为代码基本块标识;效果如图3所示。
[0028]
s203:对重写插桩后的目标二进制程序进行扫描以获取所有函数指针间接调用指令,并生成包含所有函数指针间接调用指令所在位置索引的指针函数字典;
idautil模块xrefsto函数获取该赋值指令所在函数的代码交叉引用列表,遍历该代码交叉引用列表中的每个调用点代码位置,进入对应调用函数代码空间,接着转步骤a1按函数内部初始定义模式处理;步骤a3:如图7所示,针对函数指针间接调用参数传入模式,由于该赋值指令中src_value的数值来自函数指针间接调用的参数传入,因此也需进行跨函数回溯追踪。此时,可以使用ida idautil模块xrefsto函数获取该赋值指令所在函数的数据交叉引用表,在该数据交叉引用表中定位至数据引用代码位置,正向搜索lea reg,fun_offset;mov [base+func_offset],reg2条关联指令,用func_offset作为key值,查询指针函数字典可获得func_offset对应的所有函数指针间接调用指令的代码位置,逐一进入每条函数指针间接调用指令的代码空间进行遍历并转步骤a1按函数内部初始定义模式处理以搜索立即数初值定义的位置与状态值立即数。
[0031]
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
技术特征:
1.基于def-use数据依赖图的ipsec协议状态变化标识方法,其特征在于,包括:步骤1:获取实现ipsec协议的目标二进制程序;步骤2:对所述目标二进制程序进行重写插桩来实现基本块的标识和定位;步骤3:对重写插桩后的目标二进制程序进行扫描以获取所有函数指针间接调用指令,并生成包含所有函数指针间接调用指令所在位置索引的指针函数字典;步骤4:遍历所述目标二进制程序中的所有函数,为每个函数生成对应的def-use数据依赖图;步骤5:遍历所述目标二进制程序中所有结构体变量赋值指令,根据每条赋值指令所在函数的def-use数据依赖图和所述指针函数字典标识出协议状态变化操作所在代码的位置。2.根据权利要求1所述的基于def-use数据依赖图的ipsec协议状态变化标识方法,其特征在于,步骤2具体包括:对所述目标二进制程序进行反汇编并生成中间语言;基于所述中间语言,采用二进制重写工具在目标二进制程序的数据段中插入一个全局共享数组和一个全局整型变量,以及在代码段中的每个基本块起始位置均插入两条特征指令;其中一条特征指令用于为所在基本块生成一个随机数,并采用该随机数作为下标对全局共享数组进行计数操作来基本块的标识,另一条特征指令采用魔数对全局整型变量进行赋值来实现基本块定位。3.根据权利要求2所述的基于def-use数据依赖图的ipsec协议状态变化标识方法,其特征在于,步骤3具体包括:使用反汇编工具对重写插桩后的目标二进制程序进行反汇编得到汇编代码;基于所述汇编代码对代码段进行全空间扫描,正向搜索具有预设特征的指令语句作为函数指针间接调用指令;其中,具有预设特征的指令语句为“call[base+func_offset]”类型,base表示结构体变量地址,func_offset表示函数指针偏移量;对于每条函数指针间接调用指令,从其所在位置开始,反向搜索并提取该函数指针间接调用指令所在基本块对应的随机数,将该随机数和该函数指针间接调用指令所在位置组成二元组信息,将该二元组信息存入以函数指针偏移量func_offset为key值的指针函数字典。4.根据权利要求1所述的基于def-use数据依赖图的ipsec协议状态变化标识方法,其特征在于,步骤4中,通过idapython使用miasm插件遍历所述目标二进制程序中的所有函数,生成以函数为单位的def-use数据依赖图。5.根据权利要求3所述的基于def-use数据依赖图的ipsec协议状态变化标识方法,其特征在于, 步骤5具体包括:将满足预设约束条件的指令语句作为结构体变量赋值指令,所述预设约束条件包括:指令语句为“mov [base+dst_offset],src_value”类型,且目的操作数[base+dst_offset] 中的base地址值属性为内存地址、dst_offset值是非0立即数,且源操作数src_value的值为立即数或者值传递自一个立即数,且在程序控制流中存在以[base+dst_offset]为地址的结构体变量被引用;判断源操作数src_value的值类型属于函数内部初始定义、函数直接调用参数传入和
函数指针间接调用参数传入三种模式中的何种模式;根据源操作数src_value的值类型所属模式,采取对应的标识方式标识出协议状态变化操作所在代码的位置。6.根据权利要求5所述的基于def-use数据依赖图的ipsec协议状态变化标识方法,其特征在于,所述的根据源操作数src_value的值类型所属模式,采取对应的标识方式标识出协议状态变化操作所在代码的位置,具体包括:步骤a1:针对函数内部初始定义模式,继续判断src_value的值类型:若值为立即数,则直接按照<基本块标识,状态变量偏移,状态值立即数,赋值类型, 所在函数名称>五元组格式记录该赋值指令位置,即为协议状态变化操作所在代码的位置;若值传递自一个立即数,则在函数代码区域内依据对应函数的def-use数据依赖图,遍历所有路径,以该赋值指令所在位置为起点,回溯追踪src_value的值传递过程,直至追踪到定义立即数初值的位置,则按照<基本块标识,状态变量偏移,状态值立即数,赋值类型, 所在函数名称>记录该立即数初值定义的位置,即为协议状态变化操作所在代码的位置;步骤a2:针对函数直接调用参数传入模式,获取该赋值指令所在函数的代码交叉引用表,遍历该代码交叉引用表中的每个调用点代码位置,进入对应调用函数代码空间,接着转步骤a1按函数内部初始定义模式处理;步骤a3:针对函数指针间接调用参数传入模式,获取该赋值指令所在函数的数据交叉引用表,在该数据交叉引用表中定位至数据引用代码位置,正向搜索“lea reg,fun_offset;mov [base+func_offset],reg”2条关联指令,采用func_offset作为key值,查询指针函数字典,以获得func_offset对应的所有函数指针间接调用指令的代码位置,逐一进入每条函数指针间接调用指令的代码空间进行遍历并转步骤a1按函数内部初始定义模式处理。
技术总结
本发明提供一种基于def-use数据依赖图的IPSec协议状态变化标识方法。该方法包括:步骤1:获取实现IPSec协议的目标二进制程序;步骤2:对所述目标二进制程序进行重写插桩来实现基本块的标识和定位;步骤3:对重写插桩后的目标二进制程序进行扫描以获取所有函数指针间接调用指令,并生成包含所有函数指针间接调用指令所在位置索引的指针函数字典;步骤4:遍历所述目标二进制程序中的所有函数,为每个函数生成对应的def-use数据依赖图;步骤5:遍历所述目标二进制程序中所有结构体变量赋值指令,根据每条赋值指令所在函数的def-use数据依赖图和所述指针函数字典标识出协议状态变化操作所在代码的位置。作所在代码的位置。作所在代码的位置。
技术研发人员:董卫宇 雷久刚 王瑞敏 林键 唐永鹤 刘春玲 娄睿 王奕森 王焕伟
受保护的技术使用者:中国人民解放军战略支援部队信息工程大学
技术研发日:2023.05.15
技术公布日:2023/8/9
版权声明
本文仅代表作者观点,不代表航空之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
飞行汽车 https://www.autovtol.com/
