1、基于控制流和数据流分析的内存拷贝类函数识别技术尹小康芦斌蔡瑞杰朱肖雅杨启超刘胜利(数学工程与先进计算国家重点实验室(信息工程大学)郑州450001)()Memory Copy Function Identification Technique with Control Flow and Data FlowAnalysisYinXiaokang,LuBin,CaiRuijie,ZhuXiaoya,YangQichao,andLiuShengli(State Key Laboratory of Mathematical Engineering and Advanced Computing(Info
2、rmation Engineering University),Zhengzhou,450001)AbstractMemoryerrorvulnerabilityisstilloneofthemostwidelyusedandharmfulvulnerabilitiesincurrentcyber-attacks,whosetimelydiscoveryandrepairinbinaryprogramsbeargreatvalueinpreventingcyber-attacks.Memoryerror vulnerabilities are often associated with the
3、 misuse of memory copy functions.However,the currentidentificationtechniquesofmemorycopyfunctionsmainlyrelyonthematchingofsymboltablesandcodefeaturepattern,which have high false positive and false negative rates and poor applicability,and there are still manyproblemstobesolved.Toaddresstheaboveprobl
4、ems,weproposeamemorycopyfunctionidentificationtechnologyCPYFinder,basedonthecontrolflowofmemorycopyfunctions.CPYFinderliftsthebinarycodeintotheVEXIR(IntermediateRepresentation)codetoconstructandanalyzethedataflow,andidentifiesbinarycodeaccordingtothepatternofthememorycopyfunctiononthedataflow.Thisme
5、thodcanidentifythememorycopyfunctionsinstrippedbinaryexecutablesofvariousinstructionsetarchitectures(i.e.x86,ARM,MIPSandPowerPC)inashortruntime.ExperimentalresultsshowthatCPYFinderhasbetterperformanceinidentifyingmemorycopyfunctionsinClibraries and user-defined implementations.Compared with the stat
6、e-of-the-art works BootStomp and SaTC,CPYFindergetsabetterbalancebetweenprecisionandrecall,andhasequaltimeconsumptioncomparedwithSaTCand its runtime only amounts to 19%of BootStomp.In addition,CPYFinder also has better performance invulnerabilityfunctionidentification.Key words static analysis;data
7、flow analysis;intermediate representation;memory copy function;functionidentification摘要内存错误漏洞仍是当前网络攻击中造成危害最严重的漏洞之一.内存错误漏洞的产生往往与对内存拷贝类函数的误用有关.目前针对内存拷贝类函数的识别主要借助于符号表和代码特征模式匹配,具有较高的误报率和漏报率,并且适用性较差.提出了一种内存拷贝类函数识别技术 CPYFinder(copyfunctionfinder).该技术在内存拷贝类函数控制流特征的基础上,将二进制代码转换为中间语言表示 VEXIR(intermediaterepr
8、esentation)进行数据流的构建和分析,根据内存拷贝类函数在数据流上的特征进行识别.该技术能够在较低的运行时间下对多种指令集架构(x86,ARM,MIPS,PowerPC)的二进制程序中的内存拷贝类函数进行识别.实验结果表明,相比于最新的工作 BootStomp 和 SaTC,CPYFinder 在对内存拷收稿日期:20211011;修回日期:20220210基金项目:科技委基础加强重点项目(2019-JCJQ-ZD-113)ThisworkwassupportedbytheFoundationStrengtheningKeyProjectofScience&TechnologyComm
9、ission(2019-JCJQ-ZD-113).通信作者:刘胜利(mr_)计 算 机 研 究 与 发 展DOI:10.7544/issn1000-1239.202110990JournalofComputerResearchandDevelopment60(2):326340,2023贝类函数识别上具有更好的表现,在精准率和召回率上得到更好的平衡,并且运行时间与 SaTC 几乎相等,仅相当于 BootStomp 耗时的 19%.此外,CPYFinder 在漏洞函数识别上也具有更好的表现.关键词静态分析;数据流分析;中间表示;内存拷贝函数;函数识别中图法分类号TP309利用漏洞发起网络攻击仍是
10、当前网络攻击中的主要方式.漏洞攻击能够使目标设备瘫痪、实现对目标设备的突破控制,或者对重要文件的窃取.在利用漏洞发起的攻击中,危害性最高的漏洞之一为内存错误漏洞.内存错误漏洞包括内存溢出漏洞、内存泄漏漏洞和内存释放后重用漏洞等,这些漏洞能够实现任意代码执行,造成密钥、口令等信息的泄露.在通 用 漏 洞 披 露 组 织(Common Vulnerabilities andExposures,CVE)发布的 2021 年最危险的 25 种软件脆弱性分析1中,CWE-7872即越界写(out-of-boundswrite,OOBW)排 在 了 第 1 位,CWE-1253即 越 界 读(out-of
11、-bounds read,OOBR)排 在 第 3 位 以 及 CWE-1194即不当的内存缓冲区范围内的操作限制排在第 17 位.内存溢出漏洞和内存泄漏漏洞的发生常常跟内存的拷贝相关,在进行内存拷贝的时候缺少对长度的检查,或者对特殊的字节进行转换时发生长度的变化,都会导致对内存的越界写或者越界读5.因此内存拷贝类函数(下文简称拷贝类函数)的识别对内存错误漏洞的发现和修补具有重大意义和价值.本文提出了一种拷贝类函数识别技术 CPYFinder(copyfunctionfinder).该技术在不依赖函数名、符号表等信息的情况下,对函数的控制流进行分析,并将二进制代码转换成中间语言代码进行数据流的
12、分析,识别二进制程序中的拷贝类函数.本文的主要贡献包括 4 个方面:1)分析了不同架构下拷贝类函数的特点,构建了基于静态的分析方法的拷贝类函数识别模型.2)提出并实现了二进制程序中拷贝类函数识别技术 CPYFinder,该方法不依赖函数名、符号表等信息,能够识别无论是 C 语言库中还是用户自定义实现的拷贝类函数.3)提出的 CPYFinder 具有良好的适用性和扩展性,通过将二进制代码转换成中间语言代码进行数据流的分析,使得支持 x86,ARM,MIPS,PowerPC 指令集架构的二进制程序.4)从 GitHub 上收集了拷贝类函数,构建了测试数据集进行测试,并选取了真实的 CVE 漏洞函数
13、进行了测试.实验结果表明 CPYFinder 具有更好的表现,在精准率和召回率上得到更好的平衡,并且具有较低的运行时耗.CPYFinder 对提高下游分析任务具有重大价值.1相关工作拷贝类函数的识别对二进制程序中内存错误漏洞的发现和修补具有重大意义和价值.由于版权或者安全的需要,软件供应商在程序发布的时候往往是以二进制的形式进行发行,甚至会剥除程序中的函数名、符号表等信息.因此安全研究员只能在缺少源码的情况下对二进制程序进行分析,进而发现程序中的脆弱点并提供给供应商进行漏洞的修补.相比于对源代码的分析6,由于二进制代码中丢失了高级语言具有的信息,例如 C/C+中的函数原型、变量名、数据结构等信
14、息,因此对二进制程序进行分析具有更大的挑战.针对二进制程序的分析技术主要有二进制代码审计7、污点分析8-9、符号执行10-11等,这些技术在漏洞发现和分析中具有较好的效果.然而这些技术在一定程度上依赖函数名、符号表等信息,例如 Mouzarani 等人12在提出的基于混合符号执行的模糊测试技术中仍需要借助符号表对 memcpy,strcpy等函数的识别.DTaint13和 SaTC14等在进行静态污点分析中需要借助函数名,例如 memcpy,strncpy 等函数,来定位关键函数,进而进行后续的污点记录和传播等操作.当二进制程序剥除了函数名等信息时,上述技术的效果将会受到严重影响.此外,当前的
15、研究中还存在一个被忽视的问题:开发者在开发程序时会自定义实现类似于内存拷贝功能的函数,进而会引入内存错误漏洞.例如,漏洞CVE-2020-842315发 生 在 一 个 TP-Link TL-WR841NV10 路由器设备中,由函数 int stringModify(char*dst,size_t size,char*src)引 发 的 栈 溢 出 漏 洞.尽 管BootStomp8,Karonte9,SaTC14考虑到了对拷贝类函数的识别,但是它们的识别方法依据简单的代码特征:1)从内存中加载数据;2)存储数据到内存中;3)增加 1 个单元(字节 byte、字 word 等)的偏移值.然而满
16、足上述 3 个特征的函数并不一定具有拷贝数据的尹小康等:基于控制流和数据流分析的内存拷贝类函数识别技术327功能,而且会遗漏用户自定义实现的拷贝类函数,因此具有较高的误报率和漏报率.当前针对剥除函数名等信息的二进制程序中的函数识别技术,主要是以静态签名的方法为主,例如IDAPro 中 使 用 库 函 数 快 速 识 别 技 术(fastlibraryidentificationandrecognitiontechnology,FLIRT)16,工具 Radare217使用 Zsignature 技术对程序中的函数名进行识别,此类方法能够识别出签名库中包含已经签名的函数,例如 strcpy,memcpy 等函数.然而基于签名的函数识别技术容易受编译器类型(GCC,ICC,Clang 等)、编译器版本(v5.4.0,v9.2.0 等)、优化等级(O0O3)以及目标程序的架构(x86,ARM,MIPS 等)的影响.而且,每种优化等级又可以分为数十种优化选项18(在 GCCv7.5.0 中 O0 开启了 58 种优化选项,O1 开启了 92 种优化选项,O2 开启了 130 种优化选项,O3