基于敏感语义关联的代码切片及应用研究

2024-05-21 05:22帅活力唐成华
科技资讯 2024年4期
关键词:控制流结点语句

帅活力 唐成华

摘  要:利用程序的可伸縮性对程序进行代码切片,识别出受敏感变量影响的关键语句,消除噪音并挖掘程序内部依赖,用以检测代码的漏洞与缺陷。针对切片对依赖过于敏感的问题,提出一种基于敏感语义关联的代码过程间切片方法,提取表征敏感信息的有效语句,捕获语义依赖关联,将代码漏洞触发点转化为上下文敏感的缺陷依赖流,并基于约束规则提升切片效率,结合缺陷约束获取代码漏洞的异常来源。实验结果表明该方法在代码切片的效率、质量以及漏洞检测的精度上有较好的表现。

关键词:代码切片 敏感语义 控制流 漏洞检测

中图分类号:TP309

Research on Code Slicing Based on Sensitive Semantic Association and Its Application

SHUAI Huoli  TANG Chenghua

Guangxi Key Laboratory of Trusted Software, Guilin University of Electronic Technology, Guilin, Guangxi Zhuang Autonomous Region, 541004 China

Abstract: By utilizing the scalability of the program to slice the code of the program, key statements affected by sensitive variables can be identified, noise can be eliminated, and the internal dependencies of the program can be mined, so as to detect vulnerabilities and defects in the code. In order to solve the problem of the excessive sensitivity of slicing to dependencies, this paper proposes an inter-procedural slicing method of the code based on sensitive semantic association, which extracts effective statements that represent sensitive information,, captures semantic dependent association, transforms the trigger points of code vulnerabilities into context-sensitive defect dependency flows, improves slicing efficiency based on constraint rules, and obtains the abnormal source of code vulnerabilities in combination with defect constraints. Experimental results show that this method performs well in the efficiency and quality of code slicing and the accuracy of vulnerability detection.

Key Words: Code slicing; Sensitive semantics; Control flow; Vulnerability detection

更新迭代的软件在提供优质服务的同时,结构不断复杂,并发、循环、函数调用等动态执行机制使得存在于整个软件开发生命周期的代码缺陷更难以避免,若在开发中复用到漏洞代码,新程序将延续其脆弱性,则识别出缺陷的难度更大。研究表明,缺陷修复将消耗软件开发成本的50%~70%。为重视代码安全,提高软件鲁棒性,进行缺陷漏洞与恶意代码检测等相关工作必不可少。程序是软件中相应表征分解的语义及其集合,程序行为特征能从指令层直观体现代码功能,而挖掘漏洞与缺陷发现往往以程序内部依赖关系、语义信息以及行為特征做支撑,由于对程序理解层面的不完善导致代码缺陷漏检等问题,学者们不断从程序代码本身提取相关信息,增强语义理解[1]。

软件的相关分析工作耗时又费力,若能先进行程序切片,排除无关代码,使缺陷特征信息变紧密,则降低检查时的工作复杂度。通过利用程序可伸缩性,程序切片能识别提取出受变量影响或影响变量的直至不动点的关键语句,能消除噪音语句干扰以灵活理解程序。由于切片程序与源程序在结果执行上语义一致,所以利用切片技术预处理输入程序后,便于推理控制流及数据流轨迹,切片后的程序分析效率要优于传统程序分析[2-3]。在分析恶意代码和缺陷程序时,注重实体内部流特征[4-5],结合语法结构和语义信息构建函数和过程间的相关依赖属性图[6-7],充分捕获数据变换和转移轨迹,能有效检测恶意操作和发现存在的数据泄露。这为我们提供了用更精确的静态方法进行数据依赖分析的空间,再结合切片技术注重行为关联,紧密缺陷特征,应用于脆弱性分析有效检测漏洞。

1  基于敏感语义关联的代码切片模型

通过程序控制流提供执行逻辑顺序,构建以结点保存依赖信息的控制流变量依赖图(CFVDG),利用图可达性执行切片,检测代码缺陷,总体模型如图1所示。首先,提取代码变量间定义使用、参数传递、返回值依赖等语义信息,并记录敏感变量的相关关联集,结点保存依赖信息;其次,生成控制流支持的程序变量依赖图,并根据交叉函数的控制流变量依赖图进行参数切片,切片轮廓保存至函数声明结点;最后,对切片准则中的变量遍历程序的控制流变量依赖图进行切片,捕捉与切片准则相关的完备切片结果,根据缺陷约束库内的约束检查切片语句的语义,发现错误执行状态,追踪敏感数据传播,在降低图时间和空间复杂度的同时,提高代码缺陷检测准确率。

1.1 控制流变量依赖图CFVDG的构建

数据流分析应保证结构层面的依赖关系是完整的、函数调用是上下文敏感的,以图作为程序中间表示时,图结点和边应尽可能包含语句执行的有效信息,以支持后续遍历图执行切片。本文构建的控制流变量依赖图由变量依赖关系,控制流执行顺序指导进行,通过将构图粒度限制在变量间,记录变量之间的影响关系,明确和区分数据传播和控制依赖路径。

控制流变量依赖图的结点主要包括普通结点、函数声明结点和函数调用结点。其中普通结点由语句行号、定义集、使用集、语句类型组成;函数声明结点由声明行号、函数名、形参、参数切片结果组成;函数调用结点由定义集、调用行号、声明行号、实参组成。通过程序代码中的语义依赖信息构建控制流变量依赖图。语义依赖信息存在于函数内的源码语句之间和函数调用时的参数传递之间,其体现了控制流支撑下的数据转移关联,可分为数据依赖和控制依赖。在构建依赖图的创建结点阶段,结点间变量的数据依赖关系包括变量定义与使用依赖、交叉函数参数依赖、返回值依赖等依赖关系。控制依赖关系包括顺序控制依赖、分支选择控制依赖、循环逻辑控制依赖等。

1.2 变量关联集合的获取

变量关联集合用于记录控制流变量依赖图忽略的依赖关联。分析与指针、数组、结构体等这类变量相关的语句时,可能涉及域敏感问题,因此将对局部成员或元素的操作视为是对整体变量的操作。使用模糊匹配观察变量依赖,如对于访问结构体成员的操作都视为是对结构体的操作。

代码切片的结果需回溯(即进行两次检查)才能保证完整的依赖关系处于切片结果中。通常采用对程序进行前向依赖后再进行后向依赖分析的方式,或是采用一次切片后根据相关依赖记录对程序进行二次完整依赖切片的方式。通过利用变量关联集合平行归档与切片准则中的变量关联的变量,使切片轮廓包括与目标变量有间接依赖关系的相关语句,以提高切片结果正确性。依赖图建立后,有选择地将变量关联集合中变量的切片语句集合并,实现切片结果的提取一次完成,以关联检查程序缺陷。

从程序语句中查找相关变量关联,输出指针、数组、结构体等类型的变量关联集合。涉及变量关联的语句主要体现为成员变量的单独定义或引用、成员变量间的别名赋值等。通过获得一个需考虑域敏感分析的变量(指针、数组和结构体等)的关联集合,集合中的变量按变量关联度降序排列。一旦获取到完整的变量关联集合,在进行语义分析时,将集合中关联度高的相关变量优先设置为切片阶段要跟踪的变量,语义分析检查相关切片语句,使代码缺陷的检测更严谨。变量关联度由变量间影响次数和影响权重计算而得,本文规定语句中变量赋值操作的影响权重大于判断比较等操作的影响权重。

2  代码切片

代码切片过程的核心是语义依赖分析和变量关联分析。在经过前述的依赖分析后进入切片阶段,依照切片规则约束对切片准则中进行切片,并补充参数或返回值的子切片构成最终切片轮廓。

2.1 切片约束规则

切片约束规则定义了在提取切片准则中的变量?的切片轮廓?时,切片过程需满足的规则,主要包括以下7条逻辑约束规则:

(1)若语句s定义变量?,语句s使用?,即满足变量定义与使用依赖,则提取两者对应结点信息存入切片轮廓?。

(2)若条件判断语句中存在相关依赖,并且其后继结点分支语句中存在关联,则将包含条件判断及关联语句行号存于切片轮廓?内。

(3)若循环结构语句中存在依赖,并且其后继结点循环语句中存在关联,则将包含循环判断及关联语句行号存于切片轮廓?内。

(4)若遇函数调用结点时,根据交叉函数参数依赖,将对应切片语句行号加入最终切片轮廓?。

(5)若结点cp顺序执行到达结点cp,cp执行到达cp,前者属于切片轮廓,后者不存在与变量?的依赖关系,则切片轮廓跳过cp,计算cp的依赖。

(6)若切片准则赋值为函数返回值,即满足返回值依赖,则将返回值的切片结果加入最终切片轮廓?。

(7)若语句为无条件跳转或其他变量无关控制语句,则将语句行号加入切片轮廓?。

2.2 代码切片的执行

在切片过程中,一方面,变量可能作为实际参数调用交叉函数,但交叉函数在内部操作形式参数时,会间接影响实际参数;另一方面,交叉函数的返回值会传递到函数外赋值给变量。因此有必要追踪形参和返回值在交叉函数中的依赖关系和执行逻辑。

即便在交叉调用函数中会存在对形式参数的操作不影响实际参数的情况,但这种传播方式给隐式恶意操作提供了可乘之机,因此追踪实参在交叉函数中依赖关系和执行逻辑是必要的。自定义函数间接辅助了程序功能的实现,对于不同的调用,其处理过程与执行语义相同。为避免不同上下文多次对交叉函数切片,使用增量方式存储参数切片结果并关联映射至函数声明结点的参数切片结果,从而减少构造交叉函数依赖图的结点空间,降低过程间依赖边的连接复杂度。

依照依赖关系图中函数调用结点保存的参数对应关系,进行参数切片,提取结点语句行号,结果语句序列映射至声明结点中,当调用函数时,根据参数对应关系先在声明该函数的现有对应列表中查找是否存在该参数的切片语句,若存在直接提取序列添加至切片轮廓,构成最终切片结果;若不存在,则依照或建立该函数的控制流变量依赖图进行参数切片,序列保存至声明节点中。另外,当变量位于赋值操作左侧时,右侧为函数调用,则说明变量被调用函数的返回值赋值,满足返回值依赖,需根据函数中返回语句的返回变量在切片规则约束下进行切片并存储。

3  应用敏感语义代码切片的漏洞检测

敏感API的不规范使用和语句约束检查的缺少会有很大概率造成漏洞,如内存分配函数和释放函数未正确配对、数组或指针加下标的元素无边界检查、取余或截断指令导致的整数溢出等,因此将敏感API和操作约束添加至缺陷约束库辅助检查缺陷。通过构建程序CFVDG对缺陷相关变量执行切片后,提供了可疑变量或函数上下文敏感的依赖信息流,利用缺陷约束库提供的敏感操作约束访问检查语句操作是否合法,检测出错误状态。

根据变量依赖关联建立CFVDG,切片分析含空指针引用的部分開源代码,如图2所示,其代码第33行的指针d在通过idvgetnode(i)函数返回值进行赋值,并在第36行被赋值使用,通过交叉函数idvgetnode ()中s指针行为操作分析,可以看到若不满足55行分支处条件,则返回 NULL 值,当调用完成后顺序执行36行d->limit=rate语句。

构建程序的CFVDG后,第36行的语句类型vist为指针操作,若以d为切片准则进行切片检查,因交叉函数idvgetnode ()中有返回值语句,则idvgetnode函数对应的CFVDG中声明结点内应存储返回值s切片,即,最终切片轮廓为,对其进行语义操作检查,发现第33行d赋值为第58行的返回值null,由于在第34-36行之间没有进行指针为空判断,则第36行赋值操作将导致空指针解引用。

4  实验过程及分析

实验环境为Inter(R)Xeon(R) CPU E5-1603 0 2.8GHz处理器,Windows10操作系统,采用PyCharm、Python语言。选用SIR(http://sir.unl.edu/portal/index.php)网站的schedule 、printtokens 、gzip 等5个项目部分错误版本作为实验数据集,同时,选取系统依赖图SDG[6]、数据流图DFG[8]进行实验对比。

4.1 切片效率

为评估代码切片方法的有效性,针对5个数据集的SDG、DFG和CFVDG3种方法的切片时间、切片约简比ω以及切片时间缩短占比进行对比,如表1所示,其中ω=(PN-SN)/PN,PN为程序总代码数,SN为切片总代码数。ω值越高,说明切片执行后与缺陷相关的特征代码越紧密,代码缺陷分析越快。

由表1可知,CFVDG方法切简比平均达28.7%,相比DFG平均提高约4.73%。另外,由于二次执行的交叉函数可直接提取CFVDG存储的参数切片轮廓,缩减了切片提取时间,使得CFVDG相比传统的SDG和DFG方法切片时间最高缩短4.23秒,时间缩短相比对应传统方法的切片时间占比最高为20%。

4.2 切片质量

实验中使用平均精度率和平均减少率来评估CFVDG质量和切片改进程度,平均精度率用a表示,代表对于每个切片准则中的变量?,是CFVDG切片与SDG(DFG)切片交集中的代码数与CFVDG切片数的平均之比;平均减少率用β表示,代表对于每个切片准则?,是CFVDG切片代码数与SDG(DFG)切片数的平均之比,计算方法如下:

(1)

(2)

式(1)和式(2)中的n(?)表示切片准则数目,SN?表示对准则中变量?的切片语句数目,不同依赖图切片方法对数据集的平均精度率和平均减少率差异如图3和图4所示。针对5个数据集,CFVDG切片的平均精度率均在88.5%之上,并且切片减少率最高达8.94%,最低到1.54%。

4.3 缺陷检测精度

为验证恶意约束库中缺陷约束发现代码漏洞和减少误报效果,选取精准率和错误率作为脆弱性分析评估指标,精确率代表实际总缺陷数中正确检测数的占比,误检率则代表实际总缺陷数中误报数占比,精准率和误检率分别用Z和X表示。

Z = tp/tp + fp                (3)

X = fp/tp + fp                (4)

式(3)和式(4)中的tp为检测缺陷正确数,fp为检测缺陷误报数,缺陷检测情况如表2所示,数据集缺陷检测精准率明显增加(范围70%~82%,平均74.8%),同比切片前提高平均约6%;误检率明显减少(范围6%~9%,平均7.4%),同比切片前减少平均2.8%。

4.4 程序规模对性能影响

为验证程序规模对切片效果影响,分析了代码行数从750~10 000的程序平均切片大小和代码缺陷覆盖率,如图5所示。随着代码行数的增加,切片仍能平均约简16.5%的代码;同时,随着程序规模的扩大,会较小程度影响切片缺陷覆盖率,但仍能覆盖平均83.8%的缺陷代码。

5  结语

本文提出了遍历控制流变量依赖图CFVDG的变量关联切片方法,约简无效漏洞代码信息,使用中间参数切片的映射,能有效提高切片的效率和质量,以及提升缺陷检测精准率,降低误检率。接下来,通过尝试对多语言、混合语言切片,优化和精确语义依赖理解,以实现深层次的漏洞检测,并结合动态切片和约束求解考虑执行状态进行缺陷定位分析。

参考文献

[1] 王淑栋,尹文静,董玉坤,等.面向顺序存储结构的数据流分析[J].软件学报,2020,31(5):1276-1293.

[2] 邹德清,李響,黄敏桓,等.基于图结构源代码切片的智能化漏洞检测系统[J].网络与信息安全学报, 2021,7(5):113-122.

[3] 梅瑞,严寒冰,沈元,等.二进制代码切片技术在恶意代码检测中的应用研究[J].信息安全学报,2021,6(3):125-140.

[4] 潘家晔,庄毅,孙炳林.基于渐进扩展的二进制程序数据流分析方法[J].软件学报,2022,33(9):3249-3270.

[5] 黎君玉,罗琴,刘智.基于控制流分析的导向性灰盒模糊测试方法[J].电子测量技术,2022,45(15):21-27.

[6] GALINDO C, Pérez S, Silva J. Exception-Sensitive Program Slicing[J]. Journal of Logical and Algebraic Methods in Programming,2023, 130:100832.

[7] 寿增,许睿超,马骁,等.基于数据依赖图聚类的开源软件静态分析系统[J].中国电子科学院研究院学报,2022,17(8):743-747,772.

[8] Jiang T, CUI L, LIN Z, et al. A Survey of Malware Classification Methods Based on Data Flow Graph[C] //Proc of 8th International Conference of Pioneering Computer Scientists, Engineers and Educators, Chengdu, China: CCIS, 2022:80-93.

猜你喜欢
控制流结点语句
抵御控制流分析的Python 程序混淆算法
工控系统中PLC安全漏洞及控制流完整性研究
抵御控制流分析的程序混淆算法
重点:语句衔接
Ladyzhenskaya流体力学方程组的确定模与确定结点个数估计
基于控制流隐藏的代码迷惑
如何搞定语句衔接题
基于Raspberry PI为结点的天气云测量网络实现
基于DHT全分布式P2P-SIP网络电话稳定性研究与设计
作文语句实录