Processing math: 86%
  • 中国精品科技期刊
  • CCF推荐A类中文期刊
  • 计算领域高质量科技期刊T1类
高级检索

联合数据增强的语义对比聚类

王气洪, 贾洪杰, 黄龙霞, 毛启容

王气洪, 贾洪杰, 黄龙霞, 毛启容. 联合数据增强的语义对比聚类[J]. 计算机研究与发展, 2024, 61(6): 1511-1524. DOI: 10.7544/issn1000-1239.202220995
引用本文: 王气洪, 贾洪杰, 黄龙霞, 毛启容. 联合数据增强的语义对比聚类[J]. 计算机研究与发展, 2024, 61(6): 1511-1524. DOI: 10.7544/issn1000-1239.202220995
Wang Qihong, Jia Hongjie, Huang Longxia, Mao Qirong. Semantic Contrastive Clustering with Federated Data Augmentation[J]. Journal of Computer Research and Development, 2024, 61(6): 1511-1524. DOI: 10.7544/issn1000-1239.202220995
Citation: Wang Qihong, Jia Hongjie, Huang Longxia, Mao Qirong. Semantic Contrastive Clustering with Federated Data Augmentation[J]. Journal of Computer Research and Development, 2024, 61(6): 1511-1524. DOI: 10.7544/issn1000-1239.202220995
王气洪, 贾洪杰, 黄龙霞, 毛启容. 联合数据增强的语义对比聚类[J]. 计算机研究与发展, 2024, 61(6): 1511-1524. CSTR: 32373.14.issn1000-1239.202220995
引用本文: 王气洪, 贾洪杰, 黄龙霞, 毛启容. 联合数据增强的语义对比聚类[J]. 计算机研究与发展, 2024, 61(6): 1511-1524. CSTR: 32373.14.issn1000-1239.202220995
Wang Qihong, Jia Hongjie, Huang Longxia, Mao Qirong. Semantic Contrastive Clustering with Federated Data Augmentation[J]. Journal of Computer Research and Development, 2024, 61(6): 1511-1524. CSTR: 32373.14.issn1000-1239.202220995
Citation: Wang Qihong, Jia Hongjie, Huang Longxia, Mao Qirong. Semantic Contrastive Clustering with Federated Data Augmentation[J]. Journal of Computer Research and Development, 2024, 61(6): 1511-1524. CSTR: 32373.14.issn1000-1239.202220995

联合数据增强的语义对比聚类

基金项目: 国家自然科学基金项目(61906077, 62102168, 62176106, U1836220);江苏省自然科学基金项目(BK20190838, BK20200888);中国博士后科学基金项目(2020T130257, 2020M671376);江苏省博士后科学基金项目(2021K596C)
详细信息
    作者简介:

    王气洪: 1999年生. 硕士研究生. 主要研究方向为深度聚类

    贾洪杰: 1988年生. 博士,副教授. 主要研究方向为数据聚类、深度学习、模式识别

    黄龙霞: 1991年生. 博士,副教授. 主要研究方向为隐私保护、数据共享、云计算

    毛启容: 1975年生. 博士,教授,博士生导师. IEEE和ACM会员. 主要研究方向为情感计算、模式识别、多媒体分析

    通讯作者:

    贾洪杰(jiahj@ujs.edu.cn

  • 中图分类号: TP181

Semantic Contrastive Clustering with Federated Data Augmentation

Funds: This work was supported by the National Natural Science Foundation of China (61906077, 62102168, 62176106, U1836220), the Natural Science Foundation of Jiangsu Province (BK20190838, BK20200888), the China Postdoctoral Science Foundation (2020T130257, 2020M671376), and the Postdoctoral Science Foundation of Jiangsu Province (2021K596C).
More Information
    Author Bio:

    Wang Qihong: born in 1999. Master candidate. His main research interest includes deep clustering

    Jia Hongjie: born in 1988. PhD, associate professor. His main research interests include data clustering, deep learning, and pattern recognition

    Huang Longxia: born in 1991. PhD, associate professor. Her main research interests include privacy protection, data sharing, and cloud computing. (hlxia@ujs.edu.cn)

    Mao Qirong: born in 1975. PhD, professor, PhD supervisor. Member of IEEE and ACM. Her main research interests include affective computing, pattern recognition, and multimedia analysis. (mao_qr@ujs.edu.cn)

  • 摘要:

    鉴于对比学习在下游任务中的优异表现,对比聚类的研究受到广泛关注. 但是,大部分方法只采用一类简单的数据增强技术,尽管增强后的视图保留了原始样本的大部分特征信息,但也继承了语义信息和非语义信息相融交织的特性,在相似或相同的视图模式下,该特性限制了模型对语义信息的学习. 有些方法直接将来源于同一样本的具有相同视图模式的2个数据增强视图组成正样本对,导致样本对语义性不足. 为解决上述问题,提出基于联合数据增强的语义对比聚类方法,基于一强一弱2类数据增强,利用视图间的差异降低非语义信息的干扰,增强模型对语义信息的感知能力. 此外,基于全局k近邻图引入全局类别信息,由同一类的不同样本形成正样本对. 在6个通用的挑战性数据集上的实验结果表明该方法取得了最优的聚类性能,证实了所提方法的有效性和优越性.

    Abstract:

    Given the excellent performance of contrastive learning on downstream tasks, contrastive clustering has received much more attention recently. However, most approaches only utilize a simple kind of data augmentation. Although augmented views keep the majority of information from original samples, they also inherit a mixture of characteristic of features, including semantic and non-semantic features, which limits model’s learning ability of semantic information under similar or identical view patterns. Even some approaches regard two different augmentation views being from the same sample and keeping similar view patterns as positive pairs, which results in sample pairs lacking of semantics. In this paper, we propose a semantic contrastive clustering method with federated data augmentation to solve these problems. Two different types of data augmentations, namely strong data augmentation and weak data augmentation, are introduced to produce two very different view patterns. These two view patterns are utilized to mitigate the disturbance of non-semantic information and improve the semantic awareness of the proposed approach. Moreover, a global k-nearest neighbor graph is used to bring global category information, which instructs the model to treat different samples from the same cluster as positive pairs. Extensive experiments on six commonly used and challenging image datasets show that the proposed method achieves the state-of-the-art performance and confirms the superiority and validity of it.

  • 利用漏洞发起网络攻击仍是当前网络攻击中的主要方式.漏洞攻击能够使目标设备瘫痪、实现对目标设备的突破控制,或者对重要文件的窃取.在利用漏洞发起的攻击中,危害性最高的漏洞之一为内存错误漏洞.内存错误漏洞包括内存溢出漏洞、内存泄漏漏洞和内存释放后重用漏洞等,这些漏洞能够实现任意代码执行,造成密钥、口令等信息的泄露.在通用漏洞披露组织(Common Vulnerabilities and Exposures, CVE)发布的2021年最危险的25种软件脆弱性分析[1]中,CWE-787[2]即越界写(out-of-bounds write, OOBW)排在了第1位,CWE-125[3]即越界读(out-of-bounds read, OOBR)排在第3位以及CWE-119[4]即不当的内存缓冲区范围内的操作限制排在第17位.内存溢出漏洞和内存泄漏漏洞的发生常常跟内存的拷贝相关,在进行内存拷贝的时候缺少对长度的检查,或者对特殊的字节进行转换时发生长度的变化,都会导致对内存的越界写或者越界读[5].因此内存拷贝类函数(下文简称拷贝类函数)的识别对内存错误漏洞的发现和修补具有重大意义和价值.

    本文提出了一种拷贝类函数识别技术CPYFinder(copy function finder).该技术在不依赖函数名、符号表等信息的情况下,对函数的控制流进行分析,并将二进制代码转换成中间语言代码进行数据流的分析,识别二进制程序中的拷贝类函数.本文的主要贡献包括4个方面:

    1)分析了不同架构下拷贝类函数的特点,构建了基于静态的分析方法的拷贝类函数识别模型.

    2)提出并实现了二进制程序中拷贝类函数识别技术CPYFinder,该方法不依赖函数名、符号表等信息,能够识别无论是C语言库中还是用户自定义实现的拷贝类函数.

    3)提出的CPYFinder具有良好的适用性和扩展性,通过将二进制代码转换成中间语言代码进行数据流的分析,使得支持x86,ARM,MIPS,PowerPC指令集架构的二进制程序.

    4)从GitHub上收集了拷贝类函数,构建了测试数据集进行测试,并选取了真实的CVE漏洞函数进行了测试.实验结果表明CPYFinder具有更好的表现,在精准率和召回率上得到更好的平衡,并且具有较低的运行时耗. CPYFinder对提高下游分析任务具有重大价值.

    拷贝类函数的识别对二进制程序中内存错误漏洞的发现和修补具有重大意义和价值.由于版权或者安全的需要,软件供应商在程序发布的时候往往是以二进制的形式进行发行,甚至会剥除程序中的函数名、符号表等信息.因此安全研究员只能在缺少源码的情况下对二进制程序进行分析,进而发现程序中的脆弱点并提供给供应商进行漏洞的修补.相比于对源代码的分析[6],由于二进制代码中丢失了高级语言具有的信息,例如C/C++中的函数原型、变量名、数据结构等信息,因此对二进制程序进行分析具有更大的挑战.针对二进制程序的分析技术主要有二进制代码审计[7]、污点分析[8-9]、符号执行[10-11]等,这些技术在漏洞发现和分析中具有较好的效果.然而这些技术在一定程度上依赖函数名、符号表等信息,例如Mouzarani等人[12]在提出的基于混合符号执行的模糊测试技术中仍需要借助符号表对memcpystrcpy等函数的识别.DTaint[13] 和SaTC[14]等在进行静态污点分析中需要借助函数名,例如memcpystrncpy等函数,来定位关键函数,进而进行后续的污点记录和传播等操作. 当二进制程序剥除了函数名等信息时,上述技术的效果将会受到严重影响.

    此外,当前的研究中还存在一个被忽视的问题:开发者在开发程序时会自定义实现类似于内存拷贝功能的函数,进而会引入内存错误漏洞.例如,漏洞CVE-2020-8423[15]发生在一个TP-Link TL-WR841N V10路由器设备中,由函数int stringModify (char *dst,size_t size,char *src)引发的栈溢出漏洞.尽管BootStomp[8],Karonte[9],SaTC[14]考虑到了对拷贝类函数的识别,但是它们的识别方法依据简单的代码特征:1)从内存中加载数据;2)存储数据到内存中;3)增加1个单元(字节byte、字word等)的偏移值.然而满足上述3个特征的函数并不一定具有拷贝数据的功能,而且会遗漏用户自定义实现的拷贝类函数,因此具有较高的误报率和漏报率.

    当前针对剥除函数名等信息的二进制程序中的函数识别技术,主要是以静态签名的方法为主,例如IDA Pro中使用库函数快速识别技术(fast library identification and recognition technology, FLIRT)[16],工具Radare2[17]使用Zsignature技术对程序中的函数名进行识别,此类方法能够识别出签名库中包含已经签名的函数,例如strcpymemcpy等函数.然而基于签名的函数识别技术容易受编译器类型(GCC,ICC,Clang等)、编译器版本(v5.4.0,v9.2.0等)、优化等级(O0~O3)以及目标程序的架构(x86,ARM,MIPS等)的影响.而且,每种优化等级又可以分为数十种优化选项[18](在GCC v7.5.0中O0开启了58种优化选项,O1开启了92种优化选项,O2开启了130种优化选项,O3开启了142种优化选项),这些优化选项可以通过配置进行手动地开启和关闭.因此,这些选项组合起来将产生成千上万种编译方案,即同一份源码经过不同的编译配置编译后会产生成千上万个函数,但这些函数的静态签名存在一定的差异,给基于签名的函数识别造成了阻碍.因此,为准确地识别函数需要构建各种各样的函数签名,这些工作显得尤为繁重.此外,基于签名的函数识别只能识别已知的函数,对于未知的拷贝类函数(签名库中不包含该函数的签名)则无法识别,这仍是一个亟待解决的问题.

    因此,为解决当前研究中存在的依赖函数名等信息、无法识别未知的拷贝类函数以及识别的误报率较高等问题,本文提出了一种新颖的拷贝类函数识别技术CPYFinder,用于对剥除函数名等信息的二进制程序中拷贝类函数的识别.该方法基于拷贝类函数的代码结构特征和数据流特征,通过对函数的控制流[19]和数据流[20]进行分析,识别二进制程序中具有内存拷贝功能的函数.CPYFinder一定程度上避免了编译器和优化等级的影响,不依赖于函数名的信息,并且能够识别开发者自定义实现的内存拷贝类函数,通过将二进制代码转换成中间语言表示(intermediate representation, IR)代码进行数据流的分析,使得CPYFinder适用于x86,ARM,MIPS,PowerPC(PowerPC与PPC等同)等指令集的二进制程序,具有良好的适用性和扩展性,以及较高的准确率.

    经过实验评估表明,CPYFinder相比于最新的工作BootStomp和SaTC,在对无论C语言库中的拷贝类函数还是对用户自定义实现的拷贝类函数的识别上都具有更好的表现;在精准率和召回率上得到更好的平衡.在实际的路由器固件的5个CVE漏洞函数测试中,BootStomp和SaTC均未发现导致漏洞的拷贝类函数,而CPYFinder发现4个漏洞函数.在识别效率测试中发现,CPYFinder具有更高的识别效率;在增加数据流分析的情况下与SaTC耗时几乎相同,耗时仅相当于BootStomp的19%. CPYFinder能够为下游的分析任务,例如污点分析[21]、符号执行[12]、模糊测试[22]等提供支持,在对内存错误漏洞的发现和检测上具有较高的价值.

    本节主要介绍相关的定义、结合具体的实例对拷贝类函数识别的重要性进行介绍、对现有方法存在的问题进行分析以及对VEX IR中间语言进行简要介绍.

    1)内存拷贝类函数(memory copy function)[8]. 将数据从内存中的一段区域(源地址)直接或者经过处理(例如对字节进行转换)转移到另一段内存区域(目的地址)中的函数,或者部分代码片段实现了内存拷贝功能的函数.

    2)函数控制流图(control flow graph, CFG). 函数方法内的程序执行流的图,是对函数的执行流程进行简化而得到,是为了突出函数的控制结构.本文以Gc表示程序的控制流图,以V表示节点的集合,以E表示边的集合. 其中Gc=(V,E)V={v1,v2,,vn}E={e1,e2,,em}.需要注意的是CFG图是一个有向图.通过对CFG的遍历来判断其是否包含循环结构.

    3)循环路径(loop path, LP). 从图中的一个节点出发,沿着其相连接的边进行遍历,若还能回到这个节点,则该图包含循环结构,其中从该节点出发又回到该节点的所有节点及其边构成了循环的路径.对于CFG来说,循环路径更多关注的是其路径上的节点,即基本块和基本块内的指令,该指令序列组成了函数的执行流.

    4)数据流图(data flow graph, DFG). 是记录程序中的数据在内存或者寄存器间的传播和转移变化情况的图.通过对变量或者内存的数据流进行跟踪分析能够判断函数的行为.

    对二进制程序中拷贝类函数识别的第1步是二进制函数边界的识别,二进制函数边界识别的技术[23-24]已经相对成熟,以及现有的IDA Pro工具已经满足需要,这里不再赘述.

    据本文研究发现,C语言库中封装的拷贝类函数并不能满足所有开发的需求,例如需要在内存拷贝时对字节进行处理或者转换时无法再使用C语言库中的拷贝类函数,开发者只能自己开发相应功能的函数来满足需求.此类拷贝类函数仍是安全研究需要关注的重点,对此类函数的不正确使用仍会造成内存错误漏洞的产生.

    图1所示,函数alps_lib_toupper在拷贝的时候将所有的小写字母转换为大写字母,开发者调用此函数时缺乏对长度的检查,导致了漏洞CVE-2017-6736[25]的产生;另一个例子是MIPS架构下TP-Link WR940N 无线路由器中的一个栈溢出漏洞CVE-2017-13772[26],如图2所示,导致该漏洞的是函数ipAddrDispose中的一段负责内存拷贝(地址转换)的代码,导致该漏洞产生的基本块路径是loc_478568, loc_478550, loc_478560,该循环在一定条件下从寄存器a11Bv0中,当v0t0的值不相等时,将寄存器v00x1C(a2)指向的内存中,由于缺少对长度严格的检查导致了漏洞的产生.

    图  1  开发者实现的内存拷贝类函数
    Figure  1.  Memory copy function implemented by developer
    图  2  httpd服务中IP地址转换的函数
    Figure  2.  Function for IP address conversion in the httpd service

    由此可见,不仅对C语言库中拷贝类函数的错误调用会导致内存错误漏洞,对开发者自定义实现的拷贝类函数调用也存在产生内存错误漏洞的风险.因此本文提出通过识别二进制程序中的拷贝类函数对具备内存拷贝功能的代码片段进行检测,以便为下游的分析任务,例如污点分析、模糊测试等提供更多的支持,提高分析的准确率和发现内存错误漏洞的可能性.

    本节将对拷贝类函数的特点、不同指令集下的变化以及检测的难点进行分析.

    在C程序开发时,一般情况下开发者会直接调用库中封装好的内存拷贝类函数,如strcpymemcpy等函数.图3展示了C语言下函数strcpy的源码经过编译后的二进制代码.图4展示了MIPS指令集下的函数strncpy.从源码中可以看出,对于内存中数据的转移或者修改往往借助于while或者for循环进行实现,经过编译器编译后在二进制函数CFG中的表现即为存在循环路径.

    图  3  C语言库中strcpy函数的实现
    Figure  3.  Implementation of strcpy function in C library
    图  4  MIPS指令集下的strncpy函数
    Figure  4.  The strncpy function under the MIPS instruction set

    然而并不是所有的内存拷贝函数都存在循环路径,如图5所示为x86指令集下的函数memcpy,从图中可以看出该函数不存在循环路径,原因是x86指令集下存在特殊的指令可以直接实现字节的连续转移,如rep movsb,rep movsd指令等,即由于x86指令集下存在rep指令可以完成重复的功能,借助此指令来完成内存的拷贝.但由于其他指令集下,如ARM,MIPS,PPC不存在这种特殊的指令,则需要借助循环来实现内存的拷贝.此外,由于rep只能实现无变化的数据拷贝,因此x86指令下二进制同样存在基于循环实现的内存拷贝类函数.因此CFG中存在循环路径仍是拷贝类函数最大的特点.内存拷贝类函数一定存在对内存的访问,即对内存进行读写,因此在循环路径中一定要存在对内存的读取和写入指令,在反汇编代码中即表现为存在内存的加载和存储的操作码,例如在MIPS指令下为lbu和sb(如图4所示,在基本块loc_415EC0和基本块loc_415EAC中);在数据流的层面表现为,字节从内存的一个区域流向了另一段内存区域.以MIPS下的函数strncpy为例,如图4所示,即字节从寄存器a1v1指向的内存中,此过程未对数据进行修改.

    图  5  x86指令集下的memcpy函数
    Figure  5.  The memcpy function under the x86 instruction set

    拷贝类函数的另一个特点就是存在偏移的更新,即需要对内存地址进行更新,以便将数据储存到连续的内存单元.以简单的拷贝类函数为例,如图4所示,即存在对寄存器v1addiuv1, 1)的更新.然而,自定义实现的拷贝类函数可能包含更多的复杂操作以及分支判断,导致循环路径上可能包含多个基本块,并不是如图4中所示的那样只有两个基本块,并且编译器的优化也对函数造成一定的影响,数据流会经过多次的转移变化,因此拷贝类函数并不是像BootStomp以及SaTC中所提的特征那么简单,对其的检测需要更准确的数据流特征.

    基于循环路径的溢出漏洞检测在二进制程序分析中和源码分析中都存在诸多的应用,例如2012年,Rawat 等人[27]提出检测二进制程序中由循环路径导致的溢出漏洞(buffer overflow inducing loops, BOILs),实现了一个轻量级的静态分析工具来检测BOILs.然而此方法未对数据流进行分析,仅依靠BOILs的特征进行检测,并且只支持x86的二进制程序.2020年,Luo等人[28]提出在源码层面检测由循环路径导致的溢出漏洞,由于该方法针对的是源代码,而二进制程序丢失了源码中较多的语义、变量类型、结构体等信息,难度更大,该方法不适用于对二进制程序的分析.

    随着静态污点分析技术和物联网技术的发展,研究者开始将静态污点分析应用到对固件的脆弱性检测中,如Redini等人先后在2017年和2020年分别提出BootStomp[8]和Karonte[9],使用静态污点分析来检测安卓手机中bootloader的脆弱性和嵌入式设备系统中,如路由器、网络摄像头等由于多二进制交互而产生的漏洞.如图6所示,Karonte仍需要借助函数名的信息.2021年,Chen等人[14]提出使用静态污点分析检测嵌入式设备中与前端关键字关联的漏洞技术SaTC,如图7所示,借助函数名信息对嵌入式设备的固件进行静态分析依赖于对拷贝类函数的识别.然而当前的方法依赖于函数名等信息,并且仅仅通过简单的特征匹配模式进行检测,存在较高的漏报率和误报率.

    图  6  Karonte中静态污点分析依赖于函数名信息
    Figure  6.  Static taint analysis in Karonte relies on function name information
    图  7  SaTC中静态污点分析依赖于函数名信息
    Figure  7.  Static taint analysis in SaTC relies on function name information

    本文研究发现,由于拷贝类函数多种多样,仅仅依靠模式匹配很难识别出拷贝类函数.因此本文在CFG分析和模式匹配的基础上,增加对函数的DFG的分析,通过对DFG的分析来提高拷贝类函数识别的准确率,降低误报率和漏报率,并且为了支持多指令集架构,将不同指令的二进制代码转换为VEX IR代码进行分析,使得该方法具有较高的适用性.

    由于IR能够保留指令的语义信息,具有出色的可拓展性,可以将不同指令集的代码进行归一化,被广泛应用于跨指令集的程序分析[29-30].其中较为著名的是VEX IR,由于其支持的指令集架构相对齐全,并且提供了Python的API[31],被较多的二进制分析工具angr[32],MockingBird[33],Binmatch[34]使用.为了能够支持对多指令集架构的二进制程序进行分析,本文选用VEX IR作为中间语言对函数的数据流进行分析.

    本节对VEX IR的指令类型进行了梳理,并给出了对应的操作码和示例,结果如表1所示.将VEX IR指令分为8种类型,分别为寄存器访问、内存访问、算术运算、逻辑运算、移位运算、转换、函数调用以及其他指令.其中,寄存器访问指令是对寄存器的读取和写入,内存访问指令是从内存中加载数据和将数据存储到内存中;函数调用指令会修改pc寄存器的值,并给出一个关键字Ijk_Call;其他指令包括比较指令以及其他不常见的指令,如ITE(if-then-else). 通过对VEX IR指令的分析获取变量间的数据流动.

    表  1  VEX IR的指令类型及示例
    Table  1.  Instruction Types and Examples of VEX IR
    指令类型VEX IR操作码示例
    寄存器访问GET, PUTPUT(r7) = t2
    内存访问LDb(l)e, STb(l)eSTbe(t22) = t23
    算术运算Sub, Add, Mul, Divt6 = Add16(t4,0x001)
    逻辑运算Xor, Not, Or, Andt2 = Not32(t3)
    移位运算Shl, Shrt57 = Shl32(t54,0x02)
    转换*to*, *Uto*,*Sto*t16 = 1Uto32(t17)
    函数调用Ijk_CallPUT(pc) = 0x11008
    其他指令Cmp, ITE, Ctz, Clz, ift10 = CmpNE8(t6,t9)
    下载: 导出CSV 
    | 显示表格

    拷贝类函数识别是给定一个二进制函数(汇编代码或二进制代码),在不借助符号表的情况下,通过静态分析技术或者动态分析技术来判断该函数是否具有内存拷贝的功能. 二进制程序中拷贝函数识别是给定一个含有n个函数的二进制程序B(剥离或者保留函数名等信息),即B={f1,f2,,fi,,fn},其中fi为包含m个基本块的二进制函数(通常以函数的起始地址命名),fi={b1,b2,,bj,,bm}bi为函数fi的基本块.用L={bk|bkfikLP}表示参与循环的基本块,其中k为基本块编号,LP为循环的路径,由CFG遍历算法获得保存着参与循环的基本块的编号.因此当LP= 时,函数不为拷贝类函数(x86指令集除外). 对二进制程序中每个函数进行识别,判断是否为拷贝类函数,输出该二进制程序中对所有函数的识别结果.

    本文对具备拷贝类功能的函数研究发现,具备拷贝功能的函数可能不单单完成一项任务,即将数据从一段内存区域转移到另一段内存区域,它可能具备更多其他的功能,例如数据转移后的处理.因此可以将拷贝类函数分为粗粒度的拷贝类函数和细粒度的拷贝类函数. 细粒度的拷贝类函数只完成内存拷贝的功能;粗粒度的拷贝类函数除了做内存拷贝的功能外,还存在更多的功能. 因此为减少待分析函数的数量,可以通过对函数的复杂程度进行过滤,例如以基本块的数量进行过滤,通常情况下细粒度的拷贝类函数的基本块数量小于50(这里阈值的设置根据对当前的拷贝类函数分析所得,实际应用中可以根据具体的后续任务需求设置阈值进行过滤).

    本节对二进制程序中拷贝类函数识别技术进行详细介绍. 二进制程序中拷贝类函数识别技术CPYFinder的流程如图8所示:

    图  8  内存拷贝类函数识别的流程
    Figure  8.  Workflow of memory copy function identification

    CPYFinder总共分为6个模块:CFG提取和循环检测模块、循环指令提取模块、VEX IR指令生成模块、数据流构建模块、数据流分析模块和拷贝类函数识别模块. 其中:CFG提取和循环检测模块主要分析二进制程序中是否包含循环路径;循环指令提取模块借助于IDA Pro等逆向分析工具从二进制程序中提取循环路径上的指令;VEX IR指令生成模块借助于pyvex工具将指令转换为中间语言指令,方便系统支持对多种指令集架构的程序进行分析;数据流构建和数据流分析模块从VEX IR指令提取变量间的数据关系,并对其进行分析;拷贝类函数识别模块依据拷贝类函数数据流的特点对函数循环路径上的数据流进行判断. 具体的拷贝类函数识别算法如算法1所示.

    算法1. 拷贝类函数识别算法.

    输入:函数起始地址;

    输出:函数是否为拷贝类函数(值为0或1).

    func = get_func(ea);

    blocks = [v for v in FlowChart(func)];

    cfg = get_cfg (blocks);/*生成控制流图*/

    loops = simple_cycles(cfg);/*遍历CFG获取循    环路径*/

    ⑤ if loops ≠ []

    ⑥ vex_irs = generate_vex_ir(blocks, loops);/*将     循环路径上的指令转换为VEX IR指令*/

    ⑦ data_flows = get_data_flow(vex_irs);/*在IR指     令的基础上生成数据流*/

    ⑧  if is_copy_func(data_flows) /*对数据流进行分    析,判断是否为拷贝类函数*/

    ⑨  return 1;

    ⑩ end if

    ⑪ end if

    ⑫ return 0.

    在第2节中,本文对拷贝类函数的特点进行了分析,除了x86指令集下存在使用rep movsb等实现内存拷贝的特殊指令(x86下需要添加对rep movsb指令进行检测),在ARM,MIPS,PowerPC指令集下拷贝类函数均需借助循环进行内存数据的转移. 因此,对循环的检测是拷贝类函数识别的基础.CPYFinder首先对二进制函数的CFG进行提取,以判断函数执行流中是否存在循环,在非x86指令集下,CFG不包含循环则直接视为非拷贝类函数.

    CFG中保存着函数内基本块间的关系,通过对汇编指令的解析可以获取基本块之间的关系,IDA Pro提供了API即函数FlowChart()来获取二进制函数的基本块以及基本块间的关系,因此本文直接借助IDA Pro获取基本块间的关系.为了快速地生成图以及对后续的处理,选择使用networkx库[35](用于创建、操作和处理复杂网络的Python库).通过将基本块间的关系输出到networkx的创建图的API函数DiGraph()中,生成函数的CFG(算法1行②和③).

    在获得了函数的CFG后,为进一步判断是否为拷贝类函数,需要判断CFG是否包含循环.由于判断图结构中是否包含环,以及对算法的效率的分析是图论中研究的内容,这里不再做探讨.此外,判断图结构中是否包含环的算法已经十分成熟,这里将利用networkx提供的函数simple_cycles()判断CFG是否包含循环路径以及生成循环路径,用于后续循环内数据流的生成(算法1行④).当CFG包含循环路径时,进行后续的拷贝类函数的识别;当CFG中无循环路径,并且该二进制程序非x86指令集,认为此函数为非拷贝类函数(对于x86指令集的函数,如果指令中存在rep movsb等指令,认为是拷贝类函数).

    在获取了循环路径L={bk|bkfikLP}后,为了支持多指令集架构并方便后续的处理,将基本块的指令全部转换为VEX IR指令,然后对VEX IR指令进行过滤分析,构建变量之间的数据关系(算法1行⑥和⑦).如图9所示,为ARM指令集下二进制字节码E5 F1 E0 01生成的汇编代码(图9行1)和VEX IR代码(图9行3~10). CPYFinder依据表1中指令的类型,使用正则表达式对指令的变量进行提取,将指令中的变量分为目的和源,即(dst, src),其中由于存在指令对多个变量进行操作,例如Add操作,因此,源操作数src又记录为(src1, src2),然后根据指令的类型和特点对源变量和目的变量构建数据流关系.在整个变量关系记录过程中,只记录变量之间的关系,不记录常量.以图9的行4为例说明,数据流动方向为从r1到t18(VEX IR的临时变量以t开头),行5数据流动方向为从t18流向了t17,不记录常量0x00000001流向了t17,依次构建所有的变量之间的关系. 由于pceip等特殊的寄存器与拷贝类函数的判断无关,因此在进行变量关系生成时会将此类的寄存器过滤掉,不做处理,图9中变量的关系记录为{(t18, r1), (t17, t18), (t20, t17), (t38, t20), (lr, t38), (r1, t17)}.

    图  9  汇编代码和VEX IR代码
    Figure  9.  Assembly code and VEX IR code

    在对所有的VEX IR代码遍历的同时记录直接参与内存访问(加载指令点记录为LD点,存储指令点记录为ST点)和参与算术运算的变量,例如图9中的行5和行6,其中行5为加运算操作,行6为从t17指向的内存单元中加载数据.在对所有的VEX IR指令遍历后,生成了所有变量之间的关系、内存加载变量集合、内存存储变量集合、算术运算变量集合.图9中的所有数据为变量关系{(t18, r1), (t17, t18), (t20, t17), (t38, t20), (lr, t38), (r1, t17)}、内存加载集合为[t20]、内存存储集合为、算术运算变量集合为[t17].由于图9中VEX IR指令中无ST指令,因此内存存储集合为空.

    在获取上述数据后,将所有变量之间的关系输入到函数DiGraph()中构建DFG.经过大量的分析发现,拷贝类函数的DFG具有5个特征:

    特征1. 数据流图上存在LD点;

    特征2. 数据流图中存在ST点;

    特征3. 存在从LD点到ST点的路径,并且LD点先于ST点出现;

    特征4. 数据流图上存在环结构,并且环上存在算术运算;

    特征5. 环上的点能够到达特征3上的ST点.

    基于5个特征,对函数的循环内的数据流进行分析,数据流满足5个特征的函数被认为是拷贝类函数. 这里以存在LD点和ST点(特征1和特征2)的数据流图为例进行具体识别过程的描述.使用networkx的路径通过函数all_simple_paths()来判断DFG中是否存在LD点到ST点的路径(特征3),如果不存在该路径,则认为不满足拷贝类函数数据流的特征. 当从LD点到ST点存在路径时,则进一步判断DFG中是否存在环结构,并且环上节点的关系是否存在算术运算(特征4),如果满足特征4,就继续判定环上的点能否到达满足特征5的ST点,如果满足上述所有特征,认为此函数为拷贝类函数. 由于函数内可能存在多条循环路径,因此只要存在1条循环路径的DFG满足5个特征,则认为此函数为拷贝类函数.

    正如第2节中的函数alps_lib_toupper存在函数在循环块内调用其他函数的情况,因此,本文认为在内存拷贝中调用了其他函数的函数为特殊拷贝类函数.此类函数由于函数的调用会导致数据流的中断,因此需要对变量间的数据流进行连接,即在函数的参数与函数的返回寄存器之间建立数据流关系.当发现循环中存在函数调用时,对被调用函数的参数传递情况及返回值寄存器使用情况进行分析;当函数调用后存在返回值寄存器被使用的情况,则将被调用函数参数与返回值寄存器之间构建数据流,当前方法中是将函数的第2个参数与函数返回值寄存器建立数据流.如果返回值寄存器未被使用,则直接在第2个参数和第1个参数间建立数据流关系(一般情况下,目的寄存器是第1个参数,源地址寄存器是第2个参数,返回值寄存器的值会指向目的寄存器).对于不同的指令集,其参数的传递方式和结果返回的方式(返回值寄存器)均不同,因此需要对各个指令集根据其参数传递方式的约定进行数据流的连接,对于x86指令集则根据其利用栈进行参数传递的方式,追溯压入栈的指令和变量,与返回值寄存器进行连接;对于ARM,MIPS,PPC,由于都是首先使用寄存器进行参数的传递,参数寄存器不足时采用栈进行参数传递.研究发现,通常情况下参数寄存器即可满足此类拷贝类函数中的参数传递,因此,直接在参数寄存器之间和返回值寄存器之间或者参数寄存器之间建立数据流关系,以避免数据流的中断,导致对特殊拷贝类函数的遗漏.

    本节从不同的角度利用CPYFinder对拷贝类函数识别的效果进行评估,并与现有方法BootStomp,Karonte,SaTC进行对比,包括对库函数识别效果、自定义函数识别效果、多架构的支持、受编译器的影响和编译优化等级的影响、在实际的漏洞函数检测中的效果以及识别的运行效率等进行评估.

    1)实验环境.实验所使用计算机的配置为Intel® CoreTM 6-core、3.7 GHz i7-8700K CPU和32 GB RAM.软件为Python(版本为3.7.9)、pyvex(版本为9.0.6136)、networkx(版本为2.5)、IDA Pro(版本7.5)以及基于buildroot构建的交叉编译环境用于生成不同架构的二进制程序.

    2)对比方法. BootStomp(Usenix17),Karonte(S& P20),SaTC(Usenix21)(由于Karonte与SaTC对拷贝类函数实现完全相同,本文只与SaTC进行对比),经过分析发现由于SaTC借助于工具angr来识别函数的参数个数,在识别过程中限制了参数的个数n即2n\leqslant 3,由于angr对参数个数错误的识别,导致很多拷贝类函数被过滤掉,例如函数strcpy实际上存在2个参数,而angr识别出来的参数个数为4,因此,本文对SaTC进行修改后,取消其对参数个数限制的方法为SaTC+.

    3)工具实现.CPYFinder基于IDAPython和pyvex进行实现,并借助于network对CFG和DFG进行处理.表2展示各个方法实现主要依赖的工具和支持的指令集.

    表  2  现有方法与CPYFinder对比
    Table  2.  Comparison of Existing Methods and CPYFinder
    方法依赖工具支持的指令集
    BootStompIDA ProARM
    Karonteangr, pyvexARM, MIPS
    SaTCangr, pyvexARM, MIPS
    CPYFinderIDA Pro, pyvexx86, ARM, MIPS, PPC
    下载: 导出CSV 
    | 显示表格

    4)数据集.本文首先对C语言库中的拷贝类函数进行分析,根据其应用程序编程接口(application programming interface, API)编写一个主程序来调用所有string.h和wchar.h中的函数拷贝类函数,如表3所示,列出了C语言库中的拷贝类函数,其中string.h为普通拷贝类函数,wchar.h为宽字符拷贝类函数,用于测试不同工具的效果.此外为验证对用户自定义实现(非C语言库中)的拷贝类函数的识别效果,本文从Github(Netgear R7000路由器代码[36]以及Mirai代码[37])上搜集了22个此类的函数,整合到一个C程序中进行编译测试.

    表  3  实验中使用的内存拷贝类函数
    Table  3.  Memory Copy Functions Used in the Experiment
    来源文件函数
    string.hmemcpy, memmove, strcpy, strncpy,
    strcat, strncat, strxfrm
    wchar.hwcscat, wcscpy, wcsxfrm, mbsnrtowcs, wcsncpy, wmemmove, wcsnrtombswcsncat, wmemcpy
    Netgear R7000及Miraimy_copy, yystpcpy, yy_flex_strncpy, zmemcpy, stpcpy, unistrcpy, BUF_strlcpy, util_memcpy, tr_strlcpy, g_strlcpy, wxStrncpy, wxStrcpy, wxStrcat, w_copy, strlcpy, MD5_memcpy, resolv_domain_to_hostname, alps_lib_toupper, strncpy_w, sstrncpy,
    alpha_strcpy_fn, StrnCpy_fn
    下载: 导出CSV 
    | 显示表格

    5)评估标准.本文使用精准率(precision,P),以及召回率(recall,R)来评估本文所提方法的效果,精准率和召回率越高效果越好.

    P = \frac{{TP}}{{TP + FP}}\text{,} (1)
    R = \frac{{TP}}{{TP + FN}}. (2)

    TP为将拷贝类函数识别为拷贝类函数的数量 ;FP为将非拷贝类函数识别为拷贝类函数的数量 ;FN为将拷贝类函数识别为非拷贝类函数的数量.

    6)编译器以及优化等级.如表4所示为实验评估中使用的编译器、编译器类型及优化选项,使用GCC和Clang这2个编译器进行测试,并使用buildroot构建了不同指令集的交叉工具链,用于生成不同目标架构的程序(在当前的Clang编译器中,O3优化等级与O4优化等级仍相同).

    表  4  评估实验中所使用的编译器
    Table  4.  Compilers Used in the Evaluation Experiments
    编译器编译器版本优化等级
    GCC4.5.4, 4.6.4, 4.7.4, 4.8.5, 5.4.0, 5.5.0, 6.5.0, 7.5.0O0~O3
    Clang3.9.1, 4.0.1, 5.0.1, 6.0.1O0~O4
    下载: 导出CSV 
    | 显示表格

    为了验证对C语言库中拷贝类函数的识别效果,本文编写C代码,调用string.h和wchar.h库中的函数来编译成不同的二进制程序(由于BootStomp只支持ARM指令),这里使用静态方法将源代码编译成ARM架构的二进制程序,使用的编译器版本为4.5.4,4.6.4,4.7.4,4.8.5,优化等级为O0,此外由于5.0以上版本的GCC使用的libc库在拷贝类函数的实现,不同的拷贝类函数会调用同一个函数,导致拷贝类函数的种类下降,例如strcpystrncpy的拷贝功能的实现是直接调用函数memcpy进行的,这些函数本身不存在拷贝类函数的特点,只是函数memcpy的封装,因此这里未使用高版本的编译器.各个方法的识别效果如表5所示,从表5中可以看出,CPYFinder的效果优于其他3种方法,即BootStomp,SaTC和SaTC+.尽管BootStomp具有较高的精准率P,但是召回率R却不高于0.5,尽管SaTC+识别效果好于SaTC(后续实验只与SaTC+进行对比),但是仍低于BootStomp和CPYFinder,而在实际分析中,为避免遗漏关键函数,应该在保证召回率的情况下提高精准率.分析发现,误报的函数来源于编译器的静态编译会引入其他的函数,例如__do_global_dtors_aux__getdents函数,由于静态分析数据流的准确性有限,导致误报的产生.此外,CPYFinder在gcc-4.7.4-0上的识别效果最好,精准率到达了0.81,召回率为1.0.

    表  5  各方法对C语言库中内存拷贝函数识别对比
    Table  5.  Comparison of Methods for Identifying Memory Copy Functions in C Libraries
    二进制
    程序(ARM)
    BootStompSaTCSaTC+CPYFinder
    RPRPRPRP
    gcc-4.5.4-00.501.00.070.090.360.281.00.56
    gcc-4.6.4-00.501.00.140.200.360.281.00.56
    gcc-4.7.4-00.431.00.000.000.290.441.00.81
    gcc-4.8.5-00.431.00.000.000.360.500.850.79
    注:R为召回率;P为精准率.
    下载: 导出CSV 
    | 显示表格

    表5中可以看出编译器版本对拷贝类函数识别存在一定的影响.总的来说,对C语言库中拷贝类函数的识别,CPYFinder优于BootStomp,SaTC和SaTC+.

    为了测试用户自定义实现的拷贝类函数的识别效果,正如5.1节中介绍,本文从开源库中收集了相关的用户自定义实现的拷贝类函数,使用不同的编译器编译成ARM程序进行测试,测试结果如表6所示.从表6中可以看出,BootStomp虽然对库函数中拷贝类函数识别效果好于SaTC+,但是对自定义实现的拷贝类函数识别效果较差,虽然其准确率几乎为1,但是召回率几乎为0.从表6中准确率和召回率得出结论:CPYFinder对自定义拷贝类函数识别的效果好于BootStomp和SaTC+,并且随着编译器版本的升级,识别效果越好.

    表  6  各方法对自定义内存拷贝类函数识别对比
    Table  6.  Comparison of Methods on the Identification of Custom Memory Copy Functions
    二进制程序
    (ARM)
    BootStompSaTC+CPYFinder
    RPRPRP
    gcc-4.5.4-O00.000.000.290.640.450.62
    gcc-4.6.4-O00.000.000.290.640.450.62
    gcc-4.7.4-O00.000.000.290.640.450.62
    gcc-4.8.5-O00.021.00.290.640.680.81
    gcc-5.4.0-O00.021.00.290.610.680.81
    gcc-5.5.0-O00.021.00.290.610.680.81
    gcc-6.5.0-O00.021.00.290.610.680.81
    gcc-7.5.0-O00.021.00.290.610.700.87
    注:R为召回率;P为精准率.
    下载: 导出CSV 
    | 显示表格

    为了展示CPYFinder对不同架构的拷贝类函数识别效果以及受优化等级的影响,本文将源码使用GCC编译器版本5.4.0编译成4种架构的程序(x86,ARM,MIPS,PPC)以及不同的优化等级(O0~O3).由于BootStomp和SaTC不完全支持上述指令集架构,因此不再测试BootStomp和SaTC受指令集架构的影响,首先测试CPYFinder受指令集架构和优化等级的影响,然后在ARM架构的程序上测试BootStomp,SaTC和CPYFinder受优化等级的影响.从表7中可以看出,CPYFinder支持x86,ARM,MIPS,PPC指令集架构的二进制程序,并且识别的精准率和召回率几乎相同.此外,CPYFinder会受编译优化等级的影响,在无优化(O0等级)下识别的效果最好,随着编译优化等级的提升,召回率和精准率均会略微下降. 从表8中可以看出,除了BootStomp在O1优化下表现较好,SaTC和CPYFinder均是在O0下表现较好.

    表  7  不同指令集及优化等级对识别的影响
    Table  7.  Effect of Different Instruction Sets and Optimization Levels on the Identification
    二进制程序x86ARMMIPSPPC
    RPRPRPRP
    gcc-O00.620.760.810.680.810.650.870.63
    gcc-O10.780.640.780.640.780.640.780.61
    gcc-O20.710.620.640.600.710.620.710.58
    gcc-O30.710.660.640.640.710.660.710.62
    注:R为召回率;P为精准率.
    下载: 导出CSV 
    | 显示表格

    为了展示不同方法受编译器种类以及优化等级的影响,本文将使用不同源码版本的GCC和Clang编译器以O1优化等级将源码编译成ARM架构的二进制程序,各个方法识别的效果如表9所示.

    表  8  优化等级对各个方法识别的影响
    Table  8.  Effect of Optimization Level on the Identification of Each Method
    二进制程序
    (ARM)
    BootStompSaTC+CPYFinder
    RPRPRP
    gcc-O00.031.00.300.610.810.68
    gcc-O10.221.00.190.440.780.64
    gcc-O20.220.890.080.600.640.60
    gcc-O30.191.00.080.750.640.64
    注:R为召回率;P为精准率.
    下载: 导出CSV 
    | 显示表格
    表  9  不同编译器下各方法的识别效果对比
    Table  9.  Comparison of the Identification Effect of Each Method Under Different Compilers
    编译器二进制程序
    (ARM)
    BootStompSaTC+CPYFinder
    RPRPRP
    GCCgcc-4.5.4-O10.131.00.240.560.780.64
    gcc-4.6.4-O10.161.00.180.430.780.64
    gcc-4.7.4-O10.181.00.160.420.780.64
    gcc-4.8.5-O10.181.00.160.420.760.62
    Clangclang-3.9.1-O10.291.00.270.580.810.72
    clang-4.0.1-O10.291.00.270.580.810.72
    clang-5.0.1-O10.291.00.270.580.870.73
    clang-6.0.1-O10.291.00.270.580.870.73
    注:R为召回率;P为精准率.
    下载: 导出CSV 
    | 显示表格

    从识别的结果来看,BootStomp识别的精准率为1,但是召回率却极低;而SaTC+识别的精准率和召回率均低于CPYFinder.此外,3种方法识别的效果均显示对Clang编译的程序识别效果更好.因此,从表9数据可得出结论:CPYFinder识别效果好于BootStomp和SaTC+,并且对Clang编译的程序的识别效果优于由GCC编译生成的程序.

    此外,本文还测试了Clang编译下,不同版本(3.9.1,6.0.1)以及不同优化等级(O0~O4)对拷贝类函数识别效果的影响,对比结果如表10所示.从表10中可以看出,BootStomp和CPYFinder受Clang优化等级的影响均较少,并且在版本较高(6.0.1版本)的编译器下,识别效果更好;而SaTC+受编译优化等级的影响较大,随着编译优化等级的升高,其识别效果逐渐下降.此外,BootStomp和SaTC+存在精准率P和召回率R均为0的情况.在Clang编译的ARM程序下,CPYFinder识别的效果好于BootStomp和SaTC+的识别效果.

    表  10  Clang编译器对内存拷贝类函数识别的影响
    Table  10.  Effect of Clang Compiler on the Identification of Memory Copy Function
    二进制程序
    (ARM)
    BootStompSaTC+CPYFinder
    RPRPRP
    clang-3.9.1-O00.00.00.160.660.750.63
    clang-3.9.1-O10.291.00.270.580.810.72
    clang-3.9.1-O20.241.00.00.00.780.68
    clang-3.9.1-O30.241.00.020.500.780.68
    clang-3.9.1-O40.241.00.020.500.780.68
    clang-6.0.1-O00.00.0 0.160.66 0.810.65
    clang-6.0.1-O10.291.00.270.580.870.73
    clang-6.0.1-O20.241.00.020.500.780.68
    clang-6.0.1-O30.241.00.00.00.780.68
    clang-6.0.1-O40.241.00.00.00.780.68
    注:R为召回率;P为精准率.
    下载: 导出CSV 
    | 显示表格

    为了测试CPYFinder在实际固件中拷贝类函数识别的效果,本文收集了近5年来公开分析的路由器设备固件中的漏洞,其中多数与函数strcpy相关,由于函数strcpy作为导入函数调用,无法对其进行识别,不符合实验的要求,因此,最终筛选出由循环拷贝导致的溢出漏洞,共获得了5个CVE,如表11所示.这5个漏洞分别发现于TP-Link和D-Link的路由器设备固件中,总共4个固件(其中CVE-2018-3950和CVE-2018-3951由同一个程序中的不同函数导致),这4个固件均是MIPS指令集架构的二进制程序,并且均是在由循环实现的内存拷贝中由于对长度未进行校验导致的栈溢出漏洞,并且循环路径中包含多个基本块.对这5个导致栈溢出漏洞的函数进行识别测试,判断BootStomp,SaTC+,CPYFinder是否能够识别出这5个函数为拷贝类函数,即是否存在内存拷贝的代码片段.

    表  11  对由循环拷贝导致的溢出漏洞的识别结果
    Table  11.  Identification Results for Overflow Vulnerabilities Caused by Loop Copy
    溢出漏洞厂商检测结果
    BootStompSaTC+CPYFinder
    CVE-2017-13772TP-Link*×
    CVE-2018-3950TP-Link**
    CVE-2018-3951TP-Link**
    CVE-2018-11013D-Link*××
    CVE-2020-8423TP-Link*×
    注:* 表示不支持或者运行崩溃;×表示未识别出;√表示识别出.
    下载: 导出CSV 
    | 显示表格

    测试结果如表11所示,BootStomp由于不支持MIPS架构的二进制程序的识别,给出的结果全为*,SaTC+未识别出这5个函数,其中在包含CVE-2018-3950和CVE-2018-3951的程序中运行时直接崩溃,未给出结果. 而CPYFinder识别出4个溢出漏洞,其中导致CVE-2018-11013的漏洞函数未检测出,导致CVE-2018-11013的函数未检测出的原因如图10所示.经过分析发现,由于该循环内首先对数据进行存储(基本块loc_41EB04中第1条指令sb v1,0x40(v1,0x40(v0)),然后进行数据的加载(基本块loc_41EB04中第3条指令lbu v1,0(v1,0(a0)),这与4.2节设定的数据流的特征3冲突,导致对函数websRedirect识别为非拷贝类函数,在关闭特征3的限制后,CPYFinder能够识别出该CVE,但是随之CPYFinder的识别精准率会下降,误报率会增加,在实际的固件程序分析中,可以根据需要来决定是否开启特征3的限制.

    图  10  CPYFinder未识别出的漏洞函数
    Figure  10.  Vulnerable functions not identified by CPYFinder

    综上所述,基于控制流和数据流的CPYFinder在实际的漏洞函数发现上,效果远远好于基于特征匹配的BootStomp和SaTC+.

    本节对BootStomp,SaTC,SaTC+,CPYFinder在拷贝类函数识别中的效率进行分析,选取的程序为5.2.1节中测试的程序,各个方法时耗的对比结果如表12所示,CPYFinder的效率远远高于BootStomp和SaTC. 由于不再对函数参数个数进行分析,SaTC+的时耗低于SaTC.因此,CPYFinder在较高的精准率P和较高的召回率R情况下仍具有较低的时耗.其中CPYFinder只用了相当于BootStomp 19%的时间,与SaTC和SaTC+的耗时相当.尽管CPYFinder对数据流进行了分析,然而由于SaTC是基于angr开发的,angr在分析二进制程序时的效率较低,因此CPYFinder借助于IDA Pro尽管增加了数据流分析但整个耗时却几乎未增加,而BootStomp借助了IDA Pro的反编译引擎,由于反编译分析耗时较久,因此BootStomp的耗时较高.

    表  12  对内存拷贝类函数识别时耗对比
    Table  12.  Comparison of Time Consumption for Memory Copy Functions Identification
    二进制程序时耗/s
    BootStompSaTCSaTC+CPYFinder
    gcc-4.5.4-O012.544.163.953.8
    gcc-4.6.4-O014.474.264.573.60
    gcc-4.7.4-O09.751.590.842.56
    gcc-4.8.5-O09.680.990.862.56
    gcc-5.5.0-O071.8415.1213.8910.47
    总时耗/s118.2826.1224.1122.99
    时耗比值/%198895100
    注:时耗比值为CPYFinder的时耗除以其他方法的时耗.
    下载: 导出CSV 
    | 显示表格

    为方便对工具的使用,本文将CPYFinder以IDA 插件的形式与IDA Pro进行了集成,并实现可视化的结果输出;支持对单个函数的识别和整个二进制程序中所有函数的识别,将识别分为single和all这2种识别模式,其中single模式识别当前光标指向的地址所在的函数是否为拷贝类函数,如图11所示.single模式的输出如图12所示.对整个二进制程序的识别结果可视化界面如图13所示,该界面共分为5个部分,其中Line为检测时的序号、Local Address展示函数的地址、Local Name展示函数名、Loop Address展示发现的拷贝函数的循环地址入口以及Is Copy Function展示该函数是否为拷贝类函数(是为1,不是为0).借助于IDA Pro的跳转功能,能够方便后续手工分析对结果的确认.

    图  11  CPYFinder提供给用户模式选择的界面
    Figure  11.  The interface that CPYFinder provides to the user for mode selection.
    图  12  CPYFinder的单函数模式single下的输出
    Figure  12.  Output of CPYFinder in single function mode
    图  13  CPYFinder的all模式在IDA Pro中的可视化结果
    Figure  13.  Visualization results of CPYFinder’s all-mode in IDA Pro

    本文提出的拷贝类函数识别技术CPYFinder通过将二进制函数转换成中间语言VEX IR进行数据流的分析,支持对多指令集架构(x86,ARM,MIPS,PPC)的二进制程序中拷贝类函数的识别,不依赖于符号表等信息,并且受编译器版本、优化等级的影响较小.此外,CPYFinder不仅能够识别库函数中的内存拷贝类函数,还能识别用户自定义的内存拷贝类函数,具有较高的适用性.虽然基于静态分析的识别方法具有快速、高效的特点,但是由于静态数据流分析很难做到十分精确,并且由于用户自定义实现的拷贝类函数多样以及受编译器和优化等级的影响,无可避免地会存在一定的误报和漏报,所以在识别的准确率上具有一定局限性.在后续的研究中,尝试将动态执行以及动静态分析结合的方式应用到拷贝类函数的识别中,提高对拷贝类函数识别的准确率.

    拷贝类函数的识别对内存错误漏洞的检测具有重大价值,能够提升下游分析任务的能力,如污点分析、符号执行等.本文提出了一种基于控制流和数据流分析的拷贝类函数识别技术CPYFinder,通过将二进制程序转换为中间语言VEX IR,进行后续的数据流分析,提高了对拷贝类函数识别的精准率和召回率,使得CPYFinder具有较高的适用性,并且具有较低的运行耗时,支持多种指令集架构(x86,ARM,MIPS,PPC).实验结果表明,CPYFinder不仅能够有效地识别出C语言库中的拷贝类函数,还能够识别用户自定义实现的拷贝类函数,并且受编译器版本、编译优化等级的影响较小,能够发现路由器固件中由此类函数导致的溢出漏洞,这对内存错误类漏洞的发现和分析具有重要作用.

    作者贡献声明:尹小康负责算法和对比实验的设计、算法的实现、初稿撰写和修改;芦斌完成算法和对比实验可行性分析、论文的审阅;蔡瑞杰负责实验结果分析、论文的修改;朱肖雅协助实验数据收集、论文的修改;杨启超负责论文的审阅、修改和完善;刘胜利提出研究问题、负责算法和实验的可行性分析、论文的审阅和修改.

  • 图  1   联合数据增强技术示意图

    Figure  1.   Illustration of federated data augmentation technology

    图  2   强数据增强和弱数据增强的比较

    Figure  2.   The comparison of strong data augmentation and weak data augmentation

    图  3   SCCFA的网络框架

    Figure  3.   The network framework of SCCFA

    图  8   4个数据集的聚类准确率和正样本对准确率的变化过程

    Figure  8.   Variance process of clustering accuracy and positive pairs accuracy on four datasets

    图  4   3个数据集的混淆矩阵

    Figure  4.   Confusion matrices of three datasets

    图  5   在2个数据集上的正样本对案例分析

    Figure  5.   Case analysis of positive pairs on two datasets

    图  6   迭代过程中在CIFAR-10数据集上实例特征和聚类分析的演变

    Figure  6.   The evolution of instance features and clustering analysis on CIFAR-10 dataset during iteration process

    图  7   4个数据集的损失收敛过程

    Figure  7.   Loss convergence process of four datasets

    表  1   数据集统计

    Table  1   Statistics of Datasets

    数据集 图片数量 图片尺寸 类别个数
    CIFAR-10 6万 3×32×32 10
    CIFAR-100 6万 3×32×32 20
    STL-10 1.3万 3×96×96 10
    ImageNet-10 1.3万 3×96×96 10
    ImageNet-Dogs 1.95万 3×96×96 15
    Tiny-ImageNet 11万 3×64×64 200
    下载: 导出CSV

    表  2   不同方法在6个数据集上的ACC比较

    Table  2   ACC Comparison of Different Methods on Six Datasets

    方法 CIFAR-10 CIFAR-100 STL-10 ImageNet-10 ImageNet-Dogs Tiny-ImageNet
    k-means[6] 0.229 0.130 0.192 0.241 0.105 0.025
    SC[5] 0.247 0.136 0.159 0.274 0.111 0.022
    AC[28] 0.228 0.138 0.332 0.242 0.139 0.027
    NMF[29] 0.190 0.118 0.180 0.230 0.118 0.029
    AE[30] 0.314 0.165 0.303 0.317 0.185 0.041
    DAE[31] 0.297 0.151 0.302 0.304 0.190 0.039
    GAN[32] 0.315 0.151 0.298 0.346 0.174 0.041
    DeCNN[33] 0.282 0.133 0.299 0.313 0.175 0.035
    VAE[34] 0.291 0.152 0.282 0.334 0.179 0.036
    JULE[35] 0.272 0.137 0.277 0.300 0.138 0.033
    DEC[8] 0.301 0.185 0.359 0.381 0.195 0.037
    DAC[25] 0.522 0.238 0.470 0.527 0.275 0.066
    DCCM[13] 0.623 0.327 0.482 0.710 0.383 0.108
    IIC[14] 0.617 0.257 0.610
    PICA[15] 0.696 0.337 0.713 0.870 0.352 0.098
    CC[22] 0.766 0.426 0.747 0.895 0.342 0.140
    GCC[21] 0.856 0.472 0.788 0.901 0.526 0.138
    SCCFA(本文) 0.882 0.506 0.802 0.963 0.543 0.132
    注:最好的结果用粗体数字标注.
    下载: 导出CSV

    表  3   不同方法在6个数据集上的NMI比较

    Table  3   NMI Comparison of Different Methods on Six Datasets

    方法 CIFAR-10 CIFAR-100 STL-10 ImageNet-10 ImageNet-Dogs Tiny-ImageNet
    k-means[6] 0.087 0.084 0.125 0.119 0.055 0.065
    SC[5] 0.103 0.090 0.098 0.151 0.038 0.063
    AC[28] 0.105 0.098 0.239 0.138 0.037 0.069
    NMF[29] 0.081 0.079 0.096 0.132 0.044 0.072
    AE[30] 0.239 0.100 0.250 0.210 0.104 0.131
    DAE[31] 0.251 0.111 0.224 0.206 0.104 0.127
    GAN[32] 0.265 0.120 0.210 0.225 0.121 0.135
    DeCNN[33] 0.240 0.092 0.227 0.186 0.098 0.111
    VAE[34] 0.245 0.108 0.200 0.193 0.107 0.113
    JULE[35] 0.192 0.103 0.182 0.175 0.054 0.102
    DEC[8] 0.257 0.136 0.276 0.282 0.122 0.115
    DAC[25] 0.396 0.185 0.366 0.394 0.219 0.190
    DCCM[13] 0.496 0.285 0.376 0.608 0.321 0.224
    PICA[15] 0.591 0.310 0.611 0.802 0.352 0.277
    CC[22] 0.681 0.424 0.674 0.862 0.401 0.340
    GCC[21] 0.764 0.472 0.684 0.842 0.490 0.347
    SCCFA(本文) 0.808 0.511 0.733 0.910 0.525 0.343
    注:最好的结果用粗体数字标注.
    下载: 导出CSV

    表  4   不同方法在6个数据集上的ARI比较

    Table  4   ARI Comparison of Different Methods on Six Datasets

    方法 CIFAR-10 CIFAR-100 STL-10 ImageNet-10 ImageNet-Dogs Tiny-ImageNet
    k-means[6] 0.049 0.028 0.061 0.057 0.020 0.005
    SC[5] 0.085 0.022 0.048 0.076 0.013 0.004
    AC[28] 0.065 0.034 0.140 0.067 0.021 0.005
    NMF[29] 0.034 0.026 0.046 0.065 0.016 0.005
    AE[30] 0.169 0.048 0.161 0.152 0.073 0.007
    DAE[31] 0.163 0.046 0.152 0.138 0.078 0.007
    GAN[32] 0.176 0.045 0.139 0.157 0.078 0.007
    DeCNN[33] 0.174 0.038 0.162 0.142 0.073 0.006
    VAE[34] 0.167 0.040 0.146 0.168 0.079 0.006
    JULE[35] 0.138 0.033 0.164 0.138 0.028 0.006
    DEC[8] 0.161 0.050 0.186 0.203 0.079 0.007
    DAC[25] 0.306 0.088 0.257 0.302 0.111 0.017
    DCCM[13] 0.408 0.173 0.262 0.555 0.182 0.038
    PICA[15] 0.512 0.171 0.531 0.761 0.201 0.040
    CC[22] 0.606 0.282 0.606 0.825 0.225 0.071
    GCC[21] 0.728 0.305 0.631 0.822 0.362 0.075
    SCCFA(本文) 0.777 0.347 0.680 0.920 0.368 0.062
    注:最好的结果用粗体数字标注.
    下载: 导出CSV

    表  5   强数据增强和弱数据增强间的不同联合

    Table  5   Different Combinations Between Strong Data Augmentation and Weak Data Augmentation

    策略 符号表示 ACC NMI ARI
    弱 vs 弱 (w,w) 0.841 0.743 0.704
    弱 vs 强 (w,s) 0.855 0.766 0.733
    强 vs 强 (s,s)
    弱/强 vs 强/弱 (w,w)+(w,s)+(s,s) 0.882 0.808 0.777
    注:最好的结果用粗体数字标注;“vs”的2个对象表示数据增强的类型;“−”表示模型无法学习,聚类失败.
    下载: 导出CSV

    表  6   全局类别信息的影响

    Table  6   Effect of the Global Category Information

    FFC FCC ACC NMI ARI
    0.852 0.768 0.726
    0.863 0.785 0.744
    0.861 0.777 0.735
    0.882 0.808 0.777
    注:最好的结果用粗体数字标注;“√”表示引入类别信息,“−”表示没有引入类别信息.
    下载: 导出CSV
  • [1] 张雪松,贾彩燕. 一种基于频繁词集表示的新文本聚类方法[J]. 计算机研究与发展,2018,55(1):102−112

    Zhang Xuesong, Jia Caiyan. A new documents clustering method based on frequent item-sets[J]. Journal of Computer Research and Development, 2018, 55(1): 102−112(in Chinese)

    [2] 孙申申,郭阳,任会之,等. 基于流向特征熵和测地线距离的粘连血管型肺结节聚类分割[J]. 中国科学:信息科学,2013,43(9):1136−1146 doi: 10.1360/112011-1322

    Sun Shenshen, Guo Yang, Ren Huizhi, et al. Juxta-vascular nodule segmentation based on the flowing entropy and geodesic distance feature[J]. SCIENTIA SINICA Informationis, 2013, 43(9): 1136−1146(in Chinese) doi: 10.1360/112011-1322

    [3] 郭弘毅,刘功申,苏波,等. 融合社区结构和兴趣聚类的协同过滤推荐算法[J]. 计算机研究与发展,2016,53(8):1664−1672

    Guo Hongyi, Liu Gongshen, Su Bo, et al. Collaborative filtering recommendation algorithm combining community structure and interest clusters[J]. Journal of Computer Research and Development, 2016, 53(8): 1664−1672(in Chinese)

    [4]

    Li Hua, Jia Yuheng, Cong Runmin, et al. Superpixel segmentation based on spatially constrained subspace clustering[J]. IEEE Transactions on Industrial Informatics, 2021, 17(11): 7501−7512 doi: 10.1109/TII.2020.3044068

    [5]

    Zelnik-Manor L, Perona P. Self-tuning spectral clustering [C] //Proc of the 17th Int Conf on Neural Information Processing Systems. Cambridge, MA: MIT, 2004: 1601−1608

    [6]

    MacQueen J. Some methods for classification and analysis of multivariate observations [C] //Proc of the 5th Berkeley Symp on Mathematical Statistics and Probability. Oakland, CA: University of California, 1967: 281−297

    [7]

    LeCun Y, Bengio Y, Hinton G. Deep learning[J]. Nature, 2015, 521(7553): 436−444 doi: 10.1038/nature14539

    [8]

    Xie Junyuan, Girshick R, Farhadi A. Unsupervised deep embedding for clustering analysis [C] //Proc of the 33rd Int Conf on Machine Learning. New York: ACM, 2016: 740−749

    [9]

    Tu Wenxuan, Zhou Sihang, Liu Xinwang, et al. Deep fusion clustering network [C] //Proc of the 35th AAAI Conf on Artificial Intelligence. Palo Alto, CA: AAAI, 2021: 9978−9987

    [10]

    Hadsell R, Chopra S, LeCun Y. Dimensionality reduction by learning an invariant mapping [C] //Proc of the 24th IEEE Computer Society Conf on Computer Vision and Pattern Recognition. Los Alamitos, CA: IEEE Computer Society, 2006: 1735−1742

    [11]

    He Kaiming, Fan Haoqi, Wu Yuxin, et al. Momentum contrast for unsupervised visual representation learning [C] //Proc of the 38th IEEE Computer Society Conf on Computer Vision and Pattern Recognition. Los Alamitos, CA: IEEE Computer Society, 2020: 9726−9735

    [12]

    Chen T, Kornblith S, Norouzi M, et al. A simple framework for contrastive learning of visual representations [C] //Proc of the 37th Int Conf on Machine Learning. New York: ACM, 2020: 1575−1585

    [13]

    Wu Jianlong, Long Keyu, Wang Fei, et al. Deep comprehensive correlation mining for image clustering [C] //Proc of the 17th IEEE Int Conf on Computer Vision. Piscataway, NJ: IEEE, 2019: 8149−8158

    [14]

    Ji Xu, Vedaldi A, Henriques J. Invariant information clustering for unsupervised image classification and segmentation [C] //Proc of the 17th IEEE Int Conf on Computer Vision. Piscataway, NJ: IEEE, 2019: 9864−9873

    [15]

    Huang Jiabo, Gong Shaogang, Zhu Xiatian. Deep semantic clustering by partition confidence maximisation [C] //Proc of the 38th IEEE Computer Society Conf on Computer Vision and Pattern Recognition. Los Alamitos, CA: IEEE Computer Society, 2020: 8846−8855

    [16]

    Chen Xinlei, Fan Haoqi, Girshick R, et al. Improved baselines with momentum contrastive learning [J]. arXiv preprint, arXiv: 2003.04297, 2020

    [17]

    Zhao Xuyang, Du Tianqi, Wang Yisen, et al. ArCL: Enhancing contrastive learning with augmentation-robust representations [C/OL] // Proc of the 11th Int Conf on Learning Representations. San Juan, CA: ICLR, 2023[2023-05-25].https://arxiv.org/abs/2303.01092

    [18]

    Cubuk E, Zoph B, Shlens J, et al. Randaugment: Practical automated data augmentation with a reduced search space [C] //Proc of the 38th IEEE Conf on Computer Vision and Pattern Recognition. Los Alamitos, CA: IEEE Computer Society, 2020: 3008−3017

    [19]

    Wang Xiao, Qi Guojun. Contrastive learning with stronger augmentations[J]. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2022, 45(5): 5549−5560

    [20]

    Khosla P, Teterwak P, Wang Chen, et al. Supervised contrastive learning [C] //Proc of the 34th Int Conf on Neural Information Processing Systems. Cambridge, MA: MIT, 2020: 18661−18673

    [21]

    Zhong Huasong, Wu Jianlong, Chen Chong, et al. Graph contrastive clustering [C] //Proc of the 18th IEEE Int Conf on Computer Vision. Piscataway, NJ: IEEE, 2021: 9204−9213

    [22]

    Li Yunfan, Hu Peng, Liu Zitao, et al. Contrastive clustering [C] //Proc of the 35th AAAI Conf on Artificial Intelligence. Palo Alto, CA: AAAI, 2021: 8547−8555

    [23]

    Tay Y, Dehghani M, Bahri D, et al. Efficient transformers: A survey[J]. ACM Computing Surveys, 2022, 55(6): 1−28

    [24]

    Coates A, Lee H, Ng A. An analysis of single-layer networks in unsupervised feature learning [C] //Proc of the 14th Int Conf on Artificial Intelligence and Statistics. Brookline, MA: Microtome Publishing, 2011: 215−223

    [25]

    Chang Jianlong, Wang Lingfeng, Meng Gaofeng, et al. Deep adaptive image clustering [C] //Proc of the 16th IEEE Int Conf on Computer Vision. Piscataway, NJ: IEEE, 2017: 5880−5888

    [26]

    Krizhevsky A, Sutskever I, Hinton G. ImageNet classification with deep convolutional neural networks [J] Communications of the ACM, 2017, 60(6): 84−90

    [27]

    Geng Chuanxing, Huang Shengjun, Chen Songcan. Recent advances in open set recognition: A survey[J]. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2021, 43(10): 3614−3631 doi: 10.1109/TPAMI.2020.2981604

    [28]

    Gowda K, Krishna G. Agglomerative clustering using the concept of mutual nearest neighbourhood[J]. Pattern Recognition, 1978, 10(2): 105−112 doi: 10.1016/0031-3203(78)90018-3

    [29]

    Cai Deng, He Xiaofei, Wang Xuanhui, et al. Locality preserving nonnegative matrix factorization [C] //Proc of the 21st Int Joint Conf on Artificial Intelligence. San Francisco, CA: Morgan Kaufmann, 2009: 1010−1015

    [30]

    Bengio Y, Lamblin P, Popovici D, et al. Greedy layer-wise training of deep networks [C] //Proc of the 19th Int Conf on Neural Information Processing Systems. Cambridge, MA: MIT, 2006: 153−160

    [31]

    Vincent P, Larochelle H, Lajoie I, et al. Stacked denoising autoencoders: Learning useful representations in a deep network with a local denoising criterion[J]. Journal of Machine Learning Research, 2010, 11(12): 3371−3408

    [32]

    Radford A, Metz L, Chintala S. Unsupervised representation learning with deep convolutional generative adversarial networks [C/OL] //Proc of the 4th Int Conf on Learning Representations. San Juan, CA: ICLR, 2016[2023-05-25].https://arxiv.org/abs/1511.06434

    [33]

    Zeiler M, Krishnan D, Taylor G, et al. Deconvolutional networks [C] //Proc of the 28th IEEE Computer Society Conf on Computer Vision and Pattern Recognition. Los Alamitos, CA: IEEE Computer Society, 2010: 2528−2535

    [34]

    Kingma D, Welling M. Auto-encoding variational Bayes [C/OL] //Proc of the 2nd Int Conf on Learning Representations. San Juan, CA: ICLR, 2014[2023-05-25].https://arxiv.org/abs/1312.6114

    [35]

    Yang Jianwei, Parikh D, Batra D. Joint unsupervised learning of deep representations and image clusters [C] //Proc of the 29th IEEE Conf on Computer Vision and Pattern Recognition. Los Alamitos, CA: IEEE Computer Society, 2016: 5147−5156

    [36]

    Chen Tsaishien, Hung Weichih, Tseng Hungyu, et al. Incremental false negative detection for contrastive learning [C/OL] //Proc of the 10th Int Conf on Learning Representations. San Juan, CA: ICLR, 2022[2023-05-25].https://arxiv.org/abs/2106.03719

    [37]

    Van Der Maaten L, Hinton G. Visualizing data using t-SNE[J]. Journal of Machine Learning Research, 2008, 9(86): 2579−2605

  • 期刊类型引用(12)

    1. 刘向举,李金贺,方贤进,王宇. 移动边缘计算中计算卸载与资源分配联合优化策略. 计算机工程与科学. 2024(03): 416-426 . 百度学术
    2. 闾国年,袁林旺,陈旻,张雪英,周良辰,俞肇元,罗文,乐松山,吴明光. 地理信息学科发展的思考. 地球信息科学学报. 2024(04): 767-778 . 百度学术
    3. 谢满德,黄竹芳,孙浩. 云边端协同下多用户细粒度任务卸载调度策略. 电信科学. 2024(04): 107-121 . 百度学术
    4. 纪允,孙建明,夏涛,吴子良,叶旭琪. 基于多层次数据协同应用的海关数据安全机制研究. 中国口岸科学技术. 2024(05): 27-34 . 百度学术
    5. 方浩添,田乐,郭茂祖. 基于多群体混合智能优化算法的卸载决策寻优方法. 智能系统学报. 2024(06): 1573-1583 . 百度学术
    6. 牟琦,韩嘉嘉,张寒,李占利. 基于云边协同的煤矿井下尺度自适应目标跟踪方法. 工矿自动化. 2023(04): 50-61 . 百度学术
    7. 陆嘉旻,蒋丞,柴俊,贺亚龙,漆昭铃. 基于云边端协同的UUV数字模型设计与实现. 电声技术. 2023(03): 31-35 . 百度学术
    8. 何牧,孙越,庞琦方. 基于边缘计算的智能视频分析算法研究. 电力大数据. 2023(04): 65-73 . 百度学术
    9. 王宏杰,徐胜超,陈刚,杨波,毛明扬. 基于萤火虫算法的移动边缘计算网络带宽优化策略. 计算机测量与控制. 2023(11): 280-285 . 百度学术
    10. 张俊娜,鲍想,陈家伟,赵晓焱,袁培燕,王尚广. 一种联合时延和能耗的依赖性任务卸载方法. 计算机研究与发展. 2023(12): 2770-2782 . 本站查看
    11. 邱丹青,许宇辉. 5G移动边缘计算环境下的任务卸载方法研究. 企业科技与发展. 2023(12): 75-78 . 百度学术
    12. 林铭敏. 基于目标追踪的视频边缘计算云边协同任务调度及信息安全管理. 信息与电脑(理论版). 2023(20): 63-65 . 百度学术

    其他类型引用(22)

图(8)  /  表(6)
计量
  • 文章访问数:  230
  • HTML全文浏览量:  39
  • PDF下载量:  90
  • 被引次数: 34
出版历程
  • 收稿日期:  2022-12-06
  • 修回日期:  2023-08-14
  • 网络出版日期:  2024-03-13
  • 刊出日期:  2024-05-31

目录

/

返回文章
返回