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.Memoryerrorvulnerabilitiesareoftenassociatedwiththemisuse
3、ofmemorycopyfunctions.However,thecurrentidentificationtechniquesofmemorycopyfunctionsmainlyrelyonthematchingofsymboltablesandcodefeaturepattern,whichhavehighfalsepositiveandfalsenegativeratesandpoorapplicability,andtherearestillmanyproblemstobesolved.Toaddresstheaboveproblems,weproposeamemorycopyfun
4、ctionidentificationtechnologyCPYFinder,basedonthecontrolflowofmemorycopyfunctions.CPYFinderliftsthebinarycodeintotheVEXIR(IntermediateRepresentation)codetoconstructandanalyzethedataflow,andidentifiesbinarycodeaccordingtothepatternofthememorycopyfunctiononthedataflow.Thismethodcanidentifythememorycop
5、yfunctionsinstrippedbinaryexecutablesofvariousinstructionsetarchitectures(i.e.x86,ARM,MIPSandPowerPC)inashortruntime.ExperimentalresultsshowthatCPYFinderhasbetterperformanceinidentifyingmemorycopyfunctionsinClibrariesanduser-definedimplementations.Comparedwiththestate-of-the-artworksBootStompandSaTC
6、,CPYFindergetsabetterbalancebetweenprecisionandrecall,andhasequaltimeconsumptioncomparedwithSaTCanditsruntimeonlyamountsto19%ofBootStomp.Inaddition,CPYFinderalsohasbetterperformanceinvulnerabilityfunctionidentification.Key wordsstaticanalysis;dataflowanalysis;intermediaterepresentation;memorycopyfun
7、ction;functionidentification摘要内存错误漏洞仍是当前网络攻击中造成危害最严重的漏洞之一.内存错误漏洞的产生往往与对内存拷贝类函数的误用有关.目前针对内存拷贝类函数的识别主要借助于符号表和代码特征模式匹配,具有较高的误报率和漏报率,并且适用性较差.提出了一种内存拷贝类函数识别技术CPYFinder(copyfunctionfinder).该 技 术 在 内 存 拷 贝 类 函 数 控 制 流 特 征 的 基 础 上,将 二 进 制 代 码 转 换 为 中 间 语 言 表示VEXIR(intermediaterepresentation)进行数据流的构建和分析,根据内存
8、拷贝类函数在数据流上的特征进行识别.该技术能够在较低的运行时间下对多种指令集架构(x86,ARM,MIPS,PowerPC)的二进制程序中的内存拷贝类函数进行识别.实验结果表明,相比于最新的工作BootStomp和SaTC,CPYFinder在对内存拷收稿日期:20211011;修回日期:20220210基金项目:科技委基础加强重点项目(2019-JCJQ-ZD-113)ThisworkwassupportedbytheFoundationStrengtheningKeyProjectofScience&TechnologyCommission(2019-JCJQ-ZD-113).通信作者:刘
9、胜利(mr_)计算机研究与发展 DOI:10.7544/issn1000-1239.202110990JournalofComputerResearchandDevelopment 60(2):326340,2023贝类函数识别上具有更好的表现,在精准率和召回率上得到更好的平衡,并且运行时间与SaTC几乎相等,仅相当于BootStomp耗时的19%.此外,CPYFinder在漏洞函数识别上也具有更好的表现.关键词静态分析;数据流分析;中间表示;内存拷贝函数;函数识别中图法分类号TP309利用漏洞发起网络攻击仍是当前网络攻击中的主要方式.漏洞攻击能够使目标设备瘫痪、实现对目标设备的突破控制,或者
10、对重要文件的窃取.在利用漏 洞 发 起 的 攻 击 中,危 害 性 最 高 的 漏 洞 之 一 为 内 存错误漏洞.内存错误漏洞包括内存溢出漏洞、内存泄漏 漏 洞 和 内 存 释 放 后 重 用 漏 洞 等,这 些 漏 洞 能 够 实现 任 意 代 码 执 行,造 成 密 钥、口 令 等 信 息 的 泄 露.在通 用 漏 洞 披 露 组 织(CommonVulnerabilitiesandExposures,CVE)发 布的2021年 最 危 险的25种 软 件脆 弱 性 分 析1中,CWE-7872即 越 界 写(out-of-boundswrite,OOBW)排 在 了 第1位,CWE-1
11、253即 越 界 读(out-of-boundsread,OOBR)排 在 第3位 以 及CWE-1194即 不 当 的 内 存 缓 冲 区 范 围 内 的 操 作 限 制 排 在第17位.内 存 溢 出 漏 洞 和 内 存 泄 漏 漏 洞 的 发 生 常 常跟 内 存 的 拷 贝 相 关,在 进 行 内 存 拷 贝 的 时 候 缺 少 对长 度 的 检 查,或 者 对 特 殊 的 字 节 进 行 转 换 时 发 生 长度的变化,都会导致对内存的越界写或者越界读5.因此内存拷贝类函数(下文简称拷贝类函数)的识别对内存错误漏洞的发现和修补具有重大意义和价值.本文提出了一种拷贝类函数识别技术CPY
12、Finder(copyfunctionfinder).该 技 术 在 不 依 赖 函 数 名、符 号表等信息的情况下,对函数的控制流进行分析,并将二进制代码转换成中间语言代码进行数据流的分析,识别二进制程序中的拷贝类函数.本文的主要贡献包括4个方面:1)分 析 了 不 同 架 构 下 拷 贝 类 函 数 的 特 点,构 建了基于静态的分析方法的拷贝类函数识别模型.2)提出并实现了二进制程序中拷贝类函数识别技术CPYFinder,该 方 法 不 依 赖 函 数 名、符 号 表 等 信息,能 够 识 别 无 论是C语 言 库 中 还 是 用 户 自 定 义 实现的拷贝类函数.3)提 出的CPYFi
13、nder具 有 良 好 的 适 用 性 和 扩 展性,通 过 将 二 进 制 代 码 转 换 成 中 间 语 言 代 码 进 行 数据 流 的 分 析,使 得 支持x86,ARM,MIPS,PowerPC指令集架构的二进制程序.4)从GitHub上 收 集 了 拷 贝 类 函 数,构 建 了 测 试数据集进行测试,并选取了真实的CVE漏洞函数进行了测试.实验结果表明CPYFinder具有更好的表现,在 精 准 率 和 召 回 率 上 得 到 更 好 的 平 衡,并 且 具 有 较低的运行时耗.CPYFinder对提高下游分析任务具有重大价值.1相关工作拷贝类函数的识别对二进制程序中内存错误漏洞
14、的发现和修补具有重大意义和价值.由于版权或者安 全 的 需 要,软 件 供 应 商 在 程 序 发 布 的 时 候 往 往 是以 二 进 制 的 形 式 进 行 发 行,甚 至 会 剥 除 程 序 中 的 函数名、符号表等信息.因此安全研究员只能在缺少源码 的 情 况 下 对 二 进 制 程 序 进 行 分 析,进 而 发 现 程 序中的脆弱点并提供给供应商进行漏洞的修补.相比于对源代码的分析6,由于二进制代码中丢失了高级语言 具 有 的 信 息,例如C/C+中 的 函 数 原 型、变 量 名、数 据 结 构 等 信 息,因 此 对 二 进 制 程 序 进 行 分 析 具 有更大的挑战.针对二
15、进制程序的分析技术主要有二进制 代 码 审 计7、污 点 分 析8-9、符 号 执 行10-11等,这 些技术在漏洞发现和分析中具有较好的效果.然而这些技 术 在 一 定 程 度 上 依 赖 函 数 名、符 号 表 等 信 息,例如Mouzarani等 人12在 提 出 的 基 于 混 合 符 号 执 行 的模糊测试技术中仍需要借助符号表对memcpy,strcpy等 函 数 的 识 别.DTaint13和SaTC14等 在 进 行 静 态 污点分析中需要借助函数名,例如memcpy,strncpy等函数,来定位关键函数,进而进行后续的污点记录和传播等操作.当二进制程序剥除了函数名等信息时,上
16、述技术的效果将会受到严重影响.此外,当前的研究中还存在一个被忽视的问题:开发者在开发程序时会自定义实现类似于内存拷贝功 能 的 函 数,进 而 会 引 入 内 存 错 误 漏 洞.例 如,漏 洞CVE-2020-842315发 生 在 一 个TP-LinkTL-WR841NV10路由器设备中,由函数int stringModify(char*dst,size_t size,char*src)引 发 的 栈 溢 出 漏 洞.尽 管BootStomp8,Karonte9,SaTC14考 虑 到 了 对 拷 贝 类 函数 的 识 别,但 是 它 们 的 识 别 方 法 依 据 简 单 的 代 码 特
17、征:1)从 内 存 中 加 载 数 据;2)存 储 数 据 到 内 存 中;3)增加1个单元(字节byte、字word等)的偏移值.然而满足上述3个特征的函数并不一定具有拷贝数据的尹小康等:基于控制流和数据流分析的内存拷贝类函数识别技术 327功能,而且会遗漏用户自定义实现的拷贝类函数,因此具有较高的误报率和漏报率.当前针对剥除函数名等信息的二进制程序中的函数识别技术,主要是以静态签名的方法为主,例如IDAPro中 使 用 库 函 数 快 速 识 别 技 术(fastlibraryidentificationandrecognitiontechnology,FLIRT)16,工具Radare2
18、17使用Zsignature技 术 对 程 序 中 的 函 数 名进 行 识 别,此 类 方 法 能 够 识 别 出 签 名 库 中 包 含 已 经签名的函数,例如strcpy,memcpy等函数.然而基于签名 的 函 数 识 别 技 术 容 易 受 编 译 器 类 型(GCC,ICC,Clang等)、编 译 器 版 本(v5.4.0,v9.2.0等)、优 化 等 级(O0O3)以 及 目 标 程 序 的 架 构(x86,ARM,MIPS等)的影响.而且,每种优化等级又可以分为数十种优化选 项18(在GCCv7.5.0中O0开 启了58种 优 化 选 项,O1开 启了92种 优 化 选 项,O
19、2开 启了130种 优 化 选项,O3开 启了142种 优 化 选 项),这 些 优 化 选 项 可 以通过配置进行手动地开启和关闭.因此,这些选项组合 起 来 将 产 生 成 千 上 万 种 编 译 方 案,即 同 一 份 源 码经过不同的编译配置编译后会产生成千上万个函数,但 这 些 函 数 的 静 态 签 名 存 在 一 定 的 差 异,给 基 于 签名的函数识别造成了阻碍.因此,为准确地识别函数需 要 构 建 各 种 各 样 的 函 数 签 名,这 些 工 作 显 得 尤 为繁重.此外,基于签名的函数识别只能识别已知的函数,对于未知的拷贝类函数(签名库中不包含该函数的签名)则无法识别,
20、这仍是一个亟待解决的问题.因 此,为 解 决 当 前 研 究 中 存 在 的 依 赖 函 数 名 等信 息、无 法 识 别 未 知 的 拷 贝 类 函 数 以 及 识 别 的 误 报率 较 高 等 问 题,本 文 提 出 了 一 种 新 颖 的 拷 贝 类 函 数识别技术CPYFinder,用于对剥除函数名等信息的二进制程序中拷贝类函数的识别.该方法基于拷贝类函数 的 代 码 结 构 特 征 和 数 据 流 特 征,通 过 对 函 数 的 控制 流19和 数 据 流20进 行 分 析,识 别 二 进 制 程 序 中 具有 内 存 拷 贝 功 能 的 函 数.CPYFinder一 定 程 度 上
21、 避 免了 编 译 器 和 优 化 等 级 的 影 响,不 依 赖 于 函 数 名 的 信息,并 且 能 够 识 别 开 发 者 自 定 义 实 现 的 内 存 拷 贝 类函数,通过将二进制代码转换成中间语言表示(inter-mediaterepresentation,IR)代码进行数据流的分析,使得CPYFinder适 用 于x86,ARM,MIPS,PowerPC(PowerPC与PPC等同)等指令集的二进制程序,具有良好的适用性和扩展性,以及较高的准确率.经过实验评估表明,CPYFinder相比于最新的工作BootStomp和SaTC,在 对 无论C语 言 库 中 的 拷 贝类函数还是对
22、用户自定义实现的拷贝类函数的识别上 都 具 有 更 好 的 表 现;在 精 准 率 和 召 回 率 上 得 到 更好 的 平 衡.在 实 际 的 路 由 器 固 件的5个CVE漏 洞 函数 测 试 中,BootStomp和SaTC均 未 发 现 导 致 漏 洞 的拷贝类函数,而CPYFinder发现4个漏洞函数.在识别效 率 测 试 中 发 现,CPYFinder具 有 更 高 的 识 别 效 率;在增加数据流分析的情况下与SaTC耗时几乎相同,耗 时 仅 相 当于BootStomp的19%.CPYFinder能 够 为下 游 的 分 析 任 务,例 如 污 点 分 析21、符 号 执 行12
23、、模糊 测 试22等 提 供 支 持,在 对 内 存 错 误 漏 洞 的 发 现 和检测上具有较高的价值.2问题描述及相关技术本 节 主 要 介 绍 相 关 的 定 义、结 合 具 体 的 实 例 对拷 贝 类 函 数 识 别 的 重 要 性 进 行 介 绍、对 现 有 方 法 存在 的 问 题 进 行 分 析 以 及对VEXIR中 间 语 言 进 行 简要介绍.2.1相关概念1)内 存 拷 贝 类 函 数(memorycopyfunction)8.将数据从内存中的一段区域(源地址)直接或者经过处理(例 如 对 字 节 进 行 转 换)转 移 到 另 一 段 内 存 区 域(目的地址)中的函数
24、,或者部分代码片段实现了内存拷贝功能的函数.GcV EGc=(V;E)V=fv1;v2;vng E=fe1e2;emg2)函 数 控 制 流 图(controlflowgraph,CFG).函 数方 法 内 的 程 序 执 行 流 的 图,是 对 函 数 的 执 行 流 程 进行简化而得到,是为了突出函数的控制结构.本文以表示程序的控制流图,以 表示节点的集合,以 表示边的集合.其中,,.需 要 注 意 的是CFG图 是 一 个 有 向 图.通 过对CFG的遍历来判断其是否包含循环结构.3)循 环 路 径(looppath,LP).从 图 中 的 一 个 节 点出发,沿着其相连接的边进行遍历,
25、若还能回到这个节点,则该图包含循环结构,其中从该节点出发又回到 该 节 点 的 所 有 节 点 及 其 边 构 成 了 循 环 的 路 径.对于CFG来 说,循 环 路 径 更 多 关 注 的 是 其 路 径 上 的 节点,即基本块和基本块内的指令,该指令序列组成了函数的执行流.4)数 据 流 图(dataflowgraph,DFG).是 记 录 程 序中的数据在内存或者寄存器间的传播和转移变化情况的图.通过对变量或者内存的数据流进行跟踪分析能够判断函数的行为.对二进制程序中拷贝类函数识别的第1步是二进 制 函 数 边 界 的 识 别,二 进 制 函 数 边 界 识 别 的 技术23-24已经
26、相对成熟,以及现有的IDAPro工具已经满足需要,这里不再赘述.328 计算机研究与发展2023,60(2)2.2拷贝类函数识别的重要性据本文研究发现,C语言库中封装的拷贝类函数并 不 能 满 足 所 有 开 发 的 需 求,例 如 需 要 在 内 存 拷 贝时对字节进行处理或者转换时无法再使用C语言库中 的 拷 贝 类 函 数,开 发 者 只 能 自 己 开 发 相 应 功 能 的函数来满足需求.此类拷贝类函数仍是安全研究需要关 注 的 重 点,对 此 类 函 数 的 不 正 确 使 用 仍 会 造 成 内存错误漏洞的产生.如图1所示,函数alps_lib_toupper在拷贝的时候将 所
27、有 的 小 写 字 母 转 换 为 大 写 字 母,开 发 者 调 用 此函 数 时 缺 乏 对 长 度 的 检 查,导 致 了 漏洞CVE-2017-673625的 产 生;另 一 个 例 子是MIPS架 构下TP-LinkWR940N无线路由器中的一个栈溢出漏洞CVE-2017-1377226,如 图2所 示,导 致 该 漏 洞 的 是 函 数ipAddrDispose中 的 一 段 负 责 内 存 拷 贝(地 址 转 换)的代 码,导 致 该 漏 洞 产 生 的 基 本 块 路 径是loc_478568,loc_478550,loc_478560,该 循 环 在 一 定 条 件 下 从
28、寄 存器$a1指 向 的 内 存 中 取出1B的 数 据 存 放 到 寄 存 器$v0中,当$v0的 值 与$t0的 值 不 相 等 时,将 寄 存 器$v0中 的 数 据 存 放到0 x1C($a2)指 向 的 内 存 中,由 于缺少对长度严格的检查导致了漏洞的产生.void alps_lib_toupper(char*dst,const char*src,unsigned short len)unsigned short ii;for(ii=0;ii len;+ii)dst ii=toupper(srcii);dst len=0 x00;Fig.1Memorycopyfunctionimp
29、lementedbydeveloper图1开发者实现的内存拷贝类函数由 此 可 见,不 仅对C语 言 库 中 拷 贝 类 函 数 的 错误 调 用 会 导 致 内 存 错 误 漏 洞,对 开 发 者 自 定 义 实 现的拷贝类函数调用也存在产生内存错误漏洞的风险.因此本文提出通过识别二进制程序中的拷贝类函数对 具 备 内 存 拷 贝 功 能 的 代 码 片 段 进 行 检 测,以 便 为下游的分析任务,例如污点分析、模糊测试等提供更多 的 支 持,提 高 分 析 的 准 确 率 和 发 现 内 存 错 误 漏 洞的可能性.2.3拷贝类函数的特点本 节 将 对 拷 贝 类 函 数 的 特 点、不
30、 同 指 令 集 下 的变化以及检测的难点进行分析.在C程 序 开 发 时,一 般 情 况 下 开 发 者 会 直 接 调用 库 中 封 装 好 的 内 存 拷 贝 类 函 数,如strcpy,memcpy等 函 数.图3展 示了C语 言 下 函数strcpy的 源 码 经 过编 译 后 的 二 进 制 代 码.图4展 示了MIPS指 令 集 下 的函数strncpy.从 源 码 中 可 以 看 出,对 于 内 存 中 数 据 的转移或者修改往往借助于while或者for循环进行实现,经 过 编 译 器 编 译 后 在 二 进 制 函数CFG中 的 表 现即为存在循环路径.char*strcp
31、y(char*dst,const char*src)while(*dst+=*src+)!=0)return dst;Fig.3ImplementationofstrcpyfunctioninClibrary图3C语言库中strcpy函数的实现 strncpy:move$v0,$a0b loc_415EC0move$v1,$a0loc_415EC0:bnezl$a2,loc_415EAClbu$a0,0($a1)jr$ranoploc_415EAC:addiu$a2,-1sb$a0,0($v1)sltu$a0,$zero,$a0addu$a1,$a0addiu$v1,1内存拷贝路径非内存拷贝路
32、径Fig.4The strncpyfunctionundertheMIPSinstructionset图4MIPS指令集下的strncpy函数ipAddrDispose:move$a0,$zeromove$v1,$zeroli$t0,0 x20#b loc_478568addiu$a3,$sp,0 xD4+var_BC loc_478568:slt$v0,$v1,$s0addu$a1,$s1,$v1addu$a2,$a3,$a0bnez$v0,loc_478550addiu$v1,1loc_478550:lbu$v0,0($a1)nopbeq$v0,$t0,loc_478568nopla$t9
33、,strcpyaddiu$a1,$sp,0 xD4+var_A0jalr$t9;strcpymove$a0,$s1loc_478560:sb$v0,0 x1C($a2)addiu$a0,1漏洞触发路径正常执行路径Fig.2FunctionforIPaddressconversioninthehttpdservice图2httpd服务中IP地址转换的函数尹小康等:基于控制流和数据流分析的内存拷贝类函数识别技术 329然而并不是所有的内存拷贝函数都存在循环路径,如图5所示为x86指令集下的函数memcpy,从图中可以看出该函数不存在循环路径,原因是x86指令集下存在特殊的指令可以直接实现字节的连续
34、转移,如repmovsb,repmovsd指令等,即由于x86指令集下存在rep指令可以完成重复的功能,借助此指令来完成内存的拷贝.但由于其他指令集下,如ARM,MIPS,PPC不 存 在 这 种 特 殊 的 指 令,则 需 要 借 助 循 环 来 实现内存的拷贝.此外,由于rep只能实现无变化的数据拷贝,因此x86指令下二进制同样存在基于循环实现的 内 存 拷 贝 类 函 数.因此CFG中 存 在 循 环 路 径 仍 是拷贝类函数最大的特点.内存拷贝类函数一定存在对内存的访问,即对内存进行读写,因此在循环路径中一 定 要 存 在 对 内 存 的 读 取 和 写 入 指 令,在 反 汇 编 代
35、码 中 即 表 现 为 存 在 内 存 的 加 载 和 存 储 的 操 作 码,例如在MIPS指令下为lbu和sb(如图4所示,在基本 块loc_415EC0和基本块loc_415EAC中);在数据流的层面 表 现 为,字 节 从 内 存 的 一 个 区 域 流 向 了 另 一 段 内存 区 域.以MIPS下 的 函数strncpy为 例,如图4所 示,即字节从寄存器$a1指向的内存流向了寄存器$v1指向的内存中,此过程未对数据进行修改.memcpy:mov esp+4,edimov edi,ebp+arg_0cmp eax,7jbe short loc_804FD02mov ecx,edin
36、eg ecxand ecx,3sub eax,ecxcldrep movsbmov ecx,eaxshr ecx,2cldrep movsdand eax,3loc_804FD02:mov ecx,eaxcldrep movsbmov eax,edi retnFig.5Thememcpyfunctionunderthex86instructionset图5x86指令集下的memcpy函数拷贝类函数的另一个特点就是存在偏移的更新,即 需 要 对 内 存 地 址 进 行 更 新,以 便 将 数 据 储 存 到 连续 的 内 存 单 元.以 简 单 的 拷 贝 类 函 数 为 例,如图4所示,即 存
37、 在 对 寄 存 器$v1(addiu$v1,1)的 更 新.然 而,自定义实现的拷贝类函数可能包含更多的复杂操作以 及 分 支 判 断,导 致 循 环 路 径 上 可 能 包 含 多 个 基 本块,并不是如图4中所示的那样只有两个基本块,并且 编 译 器 的 优 化 也 对 函 数 造 成 一 定 的 影 响,数 据 流会 经 过 多 次 的 转 移 变 化,因 此 拷 贝 类 函 数 并 不 是像BootStomp以及SaTC中 所 提 的 特 征 那 么 简 单,对 其的检测需要更准确的数据流特征.2.4现有相关方法及其不足基于循环路径的溢出漏洞检测在二进制程序分析中和源码分析中都存在诸
38、多的应用,例如2012年,Rawat等 人27提 出 检 测 二 进 制 程 序 中 由 循 环 路 径 导致 的 溢 出 漏 洞(bufferoverflowinducingloops,BOILs),实现了一个轻量级的静态分析工具来检测BOILs.然而 此 方 法 未 对 数 据 流 进 行 分 析,仅 依靠BOILs的 特征进行检测,并且只支持x86的二进制程序.2020年,Luo等人28提出在源码层面检测由循环路径导致的溢出漏洞,由于该方法针对的是源代码,而二进制程序 丢 失 了 源 码 中 较 多 的 语 义、变 量 类 型、结 构 体 等信 息,难 度 更 大,该 方 法 不 适 用
39、 于 对 二 进 制 程 序 的分析.随 着 静 态 污 点 分 析 技 术 和 物 联 网 技 术 的 发 展,研究者开始将静态污点分析应用到对固件的脆弱性检测中,如Redini等人先后在2017年和2020年分别提出BootStomp8和Karonte9,使 用 静 态 污 点 分 析 来检 测 安 卓 手 机中bootloader的 脆 弱 性 和 嵌 入 式 设 备系统中,如路由器、网络摄像头等由于多二进制交互而产生的漏洞.如图6所示,Karonte仍需要借助函数名的信息.2021年,Chen等人14提出使用静态污点分析检测嵌入式设备中与前端关键字关联的漏洞技术SaTC,如图7所示,借
40、助函数名信息对嵌入式设备的固件进行静态分析依赖于对拷贝类函数的识别.然而当 前 的 方 法 依 赖 于 函 数 名 等 信 息,并 且 仅 仅 通 过 简单 的 特 征 匹 配 模 式 进 行 检 测,存 在 较 高 的 漏 报 率 和误报率.Karonte(S&P20)1 def get_memcpy_like(p):2 addrs=get_dyn_sym_addrs(p,strcpy)3 summarized_ f=4 for f in addrs5 summarized_ f f=summary_ functions.memcpy_unsized6 addrs=get_dyn_sym_a
41、ddrs(p,strncpy,memcpy)7 for f in addrs8 summarized_ f f=summary_ functions.memcpy_sized9 return summarized_ fFig.6StatictaintanalysisinKarontereliesonfunctionnameinformation图6Karonte中静态污点分析依赖于函数名信息330 计算机研究与发展2023,60(2)本文研究发现,由于拷贝类函数多种多样,仅仅依 靠 模 式 匹 配 很 难 识 别 出 拷 贝 类 函 数.因 此 本 文 在CFG分 析 和 模 式 匹 配 的
42、基 础 上,增 加 对 函 数的DFG的分析,通过对DFG的分析来提高拷贝类函数识别的准确率,降低误报率和漏报率,并且为了支持多指令 集 架 构,将 不 同 指 令 的 二 进 制 代 码 转 换为VEXIR代码进行分析,使得该方法具有较高的适用性.2.5VEX IR中间语言由于IR能够保留指令的语义信息,具有出色的可拓展性,可以将不同指令集的代码进行归一化,被广 泛 应 用 于 跨 指 令 集 的 程 序 分 析29-30.其 中 较 为 著 名的是VEXIR,由于其支持的指令集架构相对齐全,并且提供了Python的API31,被较多的二进制分析工 具angr32,MockingBird33
43、,Binmatch34使 用.为 了 能 够 支持 对 多 指 令 集 架 构 的 二 进 制 程 序 进 行 分 析,本 文 选用VEXIR作为中间语言对函数的数据流进行分析.本节对VEXIR的指令类型进行了梳理,并给出了对应的操作码和示例,结果如表1所示.将VEXIR指 令 分为8种 类 型,分 别 为 寄 存 器 访 问、内 存 访 问、算术运算、逻辑运算、移位运算、转换、函数调用以及其他指令.其中,寄存器访问指令是对寄存器的读取 和 写 入,内 存 访 问 指 令 是 从 内 存 中 加 载 数 据 和 将数据存储到内存中;函数调用指令会修改pc寄存器的值,并给出一个关键字Ijk_Ca
44、ll;其他指令包括比较指 令 以 及 其 他 不 常 见 的 指 令,如ITE(if-then-else).通过对VEXIR指令的分析获取变量间的数据流动.3拷贝类函数识别nB=ff1;f2;fi;fngfimfi=fb1;b2;bj;bmg bifiL=fbkjbk2 fik 2LPgk LPLP=拷 贝 类 函 数 识 别 是 给 定 一 个 二 进 制 函 数(汇 编代 码 或 二 进 制 代 码),在 不 借 助 符 号 表 的 情 况 下,通过静态分析技术或者动态分析技术来判断该函数是否 具 有 内 存 拷 贝 的 功 能.二 进 制 程 序 中 拷 贝 函 数 识别 是 给 定 一
45、 个 含 有 个 函 数 的 二 进 制 程序B(剥 离 或者 保 留 函 数 名 等 信 息),即,其中 为包含 个基本块的二进制函数(通常以函数的起 始 地 址 命 名),为 函 数的基本块.用 表示参与循环的基本 块,其 中 为 基 本 块 编 号,为 循 环 的 路 径,由CFG遍历算法获得保存着参与循环的基本块的编号.因 此 当 时,函 数 不 为 拷 贝 类 函 数(x86指 令 集除 外).对 二 进 制 程 序 中 每 个 函 数 进 行 识 别,判 断 是否 为 拷 贝 类 函 数,输 出 该 二 进 制 程 序 中 对 所 有 函 数的识别结果.本 文 对 具 备 拷 贝
46、类 功 能 的 函 数 研 究 发 现,具 备拷 贝 功 能 的 函 数 可 能 不 单 单 完 成 一 项 任 务,即 将 数据 从 一 段 内 存 区 域 转 移 到 另 一 段 内 存 区 域,它 可 能具备更多其他的功能,例如数据转移后的处理.因此可以将拷贝类函数分为粗粒度的拷贝类函数和细粒度 的 拷 贝 类 函 数.细 粒 度 的 拷 贝 类 函 数 只 完 成 内 存拷 贝 的 功 能;粗 粒 度 的 拷 贝 类 函 数 除 了 做 内 存 拷 贝的功能外,还存在更多的功能.因此为减少待分析函数的数量,可以通过对函数的复杂程度进行过滤,例如 以 基 本 块 的 数 量 进 行 过
47、滤,通 常 情 况 下 细 粒 度 的拷 贝 类 函 数 的 基 本 块 数 量 小于50(这 里 阈 值 的 设 置根 据 对 当 前 的 拷 贝 类 函 数 分 析 所 得,实 际 应 用 中 可以根据具体的后续任务需求设置阈值进行过滤).4拷贝类函数识别技术本节对二进制程序中拷贝类函数识别技术进行详 细 介 绍.二 进 制 程 序 中 拷 贝 类 函 数 识 别 技 术CPYFinder的流程如图8所示:Table 1Instruction Types and Examples of VEX IR表 1 VEX IR的指令类型及示例指令类型 VEXI R 操作码 示例寄存器访问 GET,
48、PUT PUT(r 7)=t 2内存访问 LDb(l)e,STb(l)e STbe(t 22)=t 23算术运算 Sub,Add,Mul,Div t 6=Add16(t 4,0 x001)逻辑运算 Xor,Not,Or,And t 2=Not32(t 3)移位运算 Shl,Shr t 57=Shl32(t 54,0 x02)转换*to*,*Uto*,*Sto*t 16=1Uto32(t 17)函数调用 Ijk_Call PUT(pc)=0 x11008其他指令 Cmp,ITE,Ctz,Clz,if t 10=CmpNE8(t 6,t 9)SaTC(Usenix21)1 def get_memc
49、py_like(p):2 summarized_ f=3 addrs=get_dyn_sym_addrs(p,sprintf)4 for f in addrs5 summarized_ f f=summary_functions.snprintf6 addrs=get_dyn_sym_addrs(p,snprintf)7 for f in addrs8 summarized_ f f=summary_functions.snprintf9 addrs=get_dyn_sym_addrs(p,strcpy,stristr)10 for f in addrs11 summarized_ f f=s
50、ummary_ functions.memcpy_unsized12 addrs=get_dyn_sym_addrs(p,strncpy,memcpy)13 for f in addrs14 summarized_ f f=summary_ functions.memcpy_sized15 return summarized_ f Fig.7StatictaintanalysisinSaTCreliesonfunctionnameinformation图7SaTC中静态污点分析依赖于函数名信息尹小康等:基于控制流和数据流分析的内存拷贝类函数识别技术 331结果(0/1)逆向工具(IDA Pro