一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种自定义内存管理函数的代码缺陷检测方法与流程

2022-11-19 09:43:30 来源:中国专利 TAG:


1.本发明涉及程序代码安全检测技术领域,特别是涉及一种自定义内存管理函数的代码缺陷检测方法。


背景技术:

2.代码缺陷导致的软件安全问题和安全攻击事件层出不穷。尽管开发人员投入了大量的精力,制定各种安全编程规范,但代码缺陷仍然广泛存在。而在现实中,使用c/c 语言开发的软件中的内存破坏问题,例如内存泄露、双重释放和释放后使用等,往往是危害性最高的一类缺陷。内存破坏类代码缺陷可被攻击者利用,造成拒绝服务、信息泄露、代码执行甚至权限提升,最终破坏软件系统的安全性。
3.在过去数十年中,研究人员提出了许多自动化检测技术,对代码中的内存破坏类缺陷进行扫描。这些技术主要分为两大类,一种是基于程序分析的代码缺陷检测,另一种是基于数据驱动的代码缺陷检测。
4.基于程序分析的代码缺陷检测通过对代码中的行为进行推理而非实际执行,来检测代码中的异常行为。其思想是通过对代码进行解析,提取出代码中的数据流/控制流信息,然后对代码中的变量进行抽象表征,通过采用抽象的符号代替变量运行时的精确值,并在代码的每条可行路径上根据符号值来对代码缺陷行为进行近似估计,根据近似的结果来检测可能存在的代码缺陷。
5.基于数据驱动的代码缺陷检测,则是把代码当成文本,学习代码的语法表征、语义表征或者图结构表征,利用这些表征检测代码缺陷。这类检测方法通常会把代码进行词条化,切分成许多词条序列,在这些词条序列上进行推断。还有部分方法会把每个函数中的代码根据控制流转化成图的形式,通过每个节点中的代码语句学习出整个图的结构表征进行推断。
6.上述两类技术虽然能一定程度发现代码中的潜在缺陷,但均存在着固有的缺陷:基于程序分析的代码缺陷检测方法难以适用于大型程序,随着程序中代码量的增大,程序中的路径深度在不断加大的同时,可行的路径数也呈指数级扩大,巨大的时间和资源开销导致无法对整个程序进行分析。基于数据驱动的代码缺陷检测忽略了代码中的各种约束条件,缺少对于程序运行逻辑的精准推断,不能给出确定性的缺陷检测结果,导致报告出的代码片段虽然看似存在代码缺陷,但实际上路径上并不成立,最终产生大量误报。
7.现有自动化内存破坏类代码缺陷检测技术的固有缺陷,本质上是在于它们使用了一种简单的内存管理模型,这种模型认为代码中内存对象仅仅只由系统标准的内存管理函数api,例如malloc和free,并且总是成对使用,例如一次分配函数的执行总会对应一种释放函数的执行。然而,在实际的软件代码项目中,开发人员会定制更为复杂的内存管理模型,特别是在其中使用定制化内存管理函数进行内存对象管理,不完全遵循上述简单内存管理模型,导致现有检测技术在准确率和规模化上均无法达到令人满意的效果。


技术实现要素:

8.鉴于以上所述现有技术的缺点,本发明的目的在于提供一种自定义内存管理函数的代码缺陷检测方法,用于解决现有技术中代码缺陷检测的精准率较差以及难以适用大型程序的问题。
9.为解决上述技术问题,本发明是按如下方式实现的:一种自定义内存管理函数的代码缺陷检测方法,所述方法包括以下步骤:
10.步骤1,收集内存管理函数原型作为正样本,收集非内存管理函数原型作为负样本;
11.步骤2,通过正样本和负样本构建用于训练孪生神经网络模型的训练样本数据集;
12.步骤3,使用所述训练样本数据集训练孪生神经网络模型,通过已经训练完成的模型对待测内存管理函数进行分类;
13.步骤4,当被分类为内存分配函数或内存释放函数时,对其检查是否与标准内存管理函数存在关联关系;如果存在关联关系,则被判定为自定义内存管理函数;
14.步骤5,捕捉待测内存管理函数的特征信息,记录其内存对象结构信息,通过所述内存对象结构信息进行代码缺陷检测。
15.为了进一步解决本发明所要解决的技术问题,本发明提供的一种自定义内存管理函数的代码缺陷检测方法中,所述步骤2包括对所述正样本和负样本中函数原型的函数名和参数名进行分词化处理,并且将函数原型的返回类型和参数类型根据指针类型进行归一化处理。
16.为了进一步解决本发明所要解决的技术问题,本发明提供的一种自定义内存管理函数的代码缺陷检测方法中,所述步骤3中,使用所述训练样本数据集训练孪生神经网络模型包括以下步骤:
17.步骤3.1,将卷积神经网络作为两个分支使用;
18.步骤3.2,将所述正样本和负样本中的函数原型映射为数字向量;
19.步骤3.3,将所述正样本和负样本中函数原型对应的数字向量进行平均值计算,得到参考向量;
20.步骤3.4,待分类样本通过与所述参考向量的余弦相似度进行分类;
21.步骤3.5,每次选择将两个不同的待分类样本输入到上下两个分支中,根据其分类结果进行反馈训练。
22.为了进一步解决本发明所要解决的技术问题,本发明提供的一种自定义内存管理函数的代码缺陷检测方法中,所述参考向量包括内存分配函数参考向量、内存释放函数参考向量和非内存函数参考向量。
23.为了进一步解决本发明所要解决的技术问题,本发明提供的一种自定义内存管理函数的代码缺陷检测方法中,所述步骤4包括分类结束后产生被归类为内存分配函数或内存释放函数的候选函数,对候选函数进行内部实现的数据流分析;如果候选函数的子分支调用了至少一个标准内存管理函数,且该标准内存管理函数分配或释放的内存对象通过子分支返回到该候选函数的参数或返回值中,则判定该候选函数为自定义内存管理函数。
24.为了进一步解决本发明所要解决的技术问题,本发明提供的一种自定义内存管理函数的代码缺陷检测方法中,所述特征信息包括函数名、函数属性、内存对象和对象类型。
25.为了进一步解决本发明所要解决的技术问题,本发明提供的一种自定义内存管理函数的代码缺陷检测方法中,生成以函数名、函数属性、内存对象和对象类型为内容的自定义内存管理函数的特征列表。
26.为了进一步解决本发明所要解决的技术问题,本发明提供的一种自定义内存管理函数的代码缺陷检测方法中,在生成所述特征列表时,对自定义内存管理函数进行数据流分析,跟踪标准内存管理函数分配或释放的内存对象;如果标准内存管理函数执行内存分配操作,则将所有从标准内存管理函数流向返回值和参数的数据流进行合并;如果标准内存管理函数执行内存释放操作,则合并所有从函数参数流向标准内存管理函数的数据流。
27.为了进一步解决本发明所要解决的技术问题,本发明提供的一种自定义内存管理函数的代码缺陷检测方法中,所述步骤5包括通过建立或销毁一个抽象内存对象进行代码缺陷检测。
28.为了进一步解决本发明所要解决的技术问题,本发明提供的一种自定义内存管理函数的代码缺陷检测方法中,如果待测内存管理函数是自定义内存分配函数,则按照其动态管理的内存对象生成用于指代该内存对象的符号表达式,并将其加入到当前内存对象列表中,并传递给后续分析;如果待测内存管理函数是自定义内存释放函数,则根据其传入参数指定的符号表达式,更新其状态为释放,并将其从当前内存对象列表中移除销毁;如果一个标记为释放状态的符号表达式被再次更新为释放状态,则检测出双重释放缺陷;如果一个标记为释放状态的符号表达式被读写后续代码访问,则检测出释放后使用缺陷。
29.如上所述,本发明的一种自定义内存管理函数的代码缺陷检测方法,通过巧妙的设计,使用训练好的孪生神经网络模型来对函数进行分类确定是否为自定义内存管理函数,捕获特征信息记录其内存对象结构信息,通过内存对象结构信息进行代码缺陷检测,从很大程度上提高了精准度,也使其适用于大型程序的检测。
附图说明
30.图1显示为本发明实施例中一种自定义内存管理函数的代码缺陷检测方法的流程图;
31.图2显示为本发明实施例中一种自定义内存管理函数的代码缺陷检测方法的孪生神经网络模型训练示意图;
32.图3显示为本发明实施例中一种自定义内存管理函数的代码缺陷检测方法的特征列表生成示意图。
具体实施方式
33.以下通过特定的具体实例说明本发明的实施方式,本领域技术人员可由本说明书所揭露的内容轻易地了解本发明的其他优点与功效。本发明还可以通过另外不同的具体实施方式加以实施或应用,本说明书中的各项细节也可以基于不同观点与应用,在没有背离本发明的精神下进行各种修饰或改变。需说明的是,在不冲突的情况下,以下实施例及实施例中的特征可以相互组合。
34.需要说明的是,以下实施例中所提供的图示仅以示意方式说明本发明的基本构想,遂图式中仅显示与本发明中有关的组件而非按照实际实施时的组件数目、形状及尺寸
绘制,其实际实施时各组件的型态、数量及比例可为一种随意的改变,且其组件布局型态也可能更为复杂。
35.请参阅图1,本发明提供一种自定义内存管理函数的代码缺陷检测方法,方法包括以下步骤:
36.步骤1,收集内存管理函数原型作为正样本,收集非内存管理函数原型作为负样本。收集的过程中采用人工收集的方式,正样本中的内存管理函数原型可以收集典型代码项目中常见的内存管理函数接口原型,数量不限,这里优选收集100个左右。负样本中的非内存管理函数原型可以收集典型代码项目中常见的非内存管理函数接口原型,例如加密函数和日志记录函数等,数量不限,这里同样优选收集100个左右。
37.步骤2,函数原型包括返回类型、函数名、参数类型和参数名等信息。先对正样本和负样本中函数原型的函数名和参数名进行分词化处理,并且将函数原型的返回类型和参数类型根据指针类型进行归一化处理,例如转化成c语言中的int和char等。通过正样本和负样本构建用于训练孪生神经网络模型的训练样本数据集。
38.步骤3,使用训练样本数据集训练孪生神经网络模型,通过已经训练完成的模型对待测内存管理函数进行分类。
39.如图2所示,使用孪生神经网络训练模型,训练生成特定的transformer encoder,可以将一个函数原型映射成一个数字向量。使用训练样本数据集训练孪生神经网络模型包括以下步骤:
40.步骤3.1,将卷积神经网络作为两个分支使用。
41.步骤3.2,将正样本和负样本中的函数原型映射为数字向量,该方法是通过keras的embedding函数实现的。
42.步骤3.3,将正样本和负样本中函数原型对应的数字向量进行平均值计算,具体地是把正样本中内存分配函数、内存释放函数以及负样本中所有函数原型对应的数字向量求平均值得到参考向量,该参考向量包括内存分配函数参考向量、内存释放函数参考向量和非内存函数参考向量。例如,对内存分配函数,如果有n组m维向量w,则对这n组向量的每个维度wi求和,然后除以n,得到每个维度的平均值后,组成一个平均值向量。
43.步骤3.4,待分类样本通过与参考向量的余弦相似度进行分类,通过分别计算与参考向量的余弦相似度分类出是内存分配函数、内存释放函数还是非内存管理函数。
44.步骤3.5,每次选择将两个不同的待分类样本输入到上下两个分支中,根据其分类结果进行反馈训练。步骤4,当被分类为内存分配函数或内存释放函数时,对其检查是否与标准内存管理函数存在关联关系。如果存在关联关系,则被判定为自定义内存管理函数。分类结束后产生被归类为内存分配函数或内存释放函数的候选函数,对候选函数进行内部实现的数据流分析;如果候选函数的子分支调用了至少一个标准内存管理函数,且该标准内存管理函数分配或释放的内存对象通过子分支返回到该候选函数的参数或返回值中,则判定该候选函数为自定义内存管理函数。
45.步骤5,当被判定为自定义内存管理函数时,捕捉待测内存管理函数的特征信息,记录其内存对象结构信息,通过内存对象结构信息进行代码缺陷检测。特征信息包括函数名、函数属性、内存对象和对象类型。
46.如图3所示,生成以函数名、函数属性、内存对象和对象类型为内容的自定义内存
管理函数的特征列表。对函数dma_page的特征列表生成过程为:
47.1)识别出内存函数(kmalloc、dma_alloc_coherent)及其性质(分配或者释放)。
48.2)对识别出内存函数进行数据流分析,确定分配或释放的内存对象(page,page-》vaddr)。
49.3)确定分配或释放的内存对象影响的函数参数和返回值。
50.4)生成特征列表,包括主函数名、主要属性、内存对象列表、对象类型四部分。
51.在生成特征列表时,对自定义内存管理函数进行数据流分析,跟踪标准内存管理函数分配或释放的内存对象;如果标准内存管理函数执行内存分配操作,则将所有从标准内存管理函数流向返回值和参数的数据流(从标准内存管理函数流向返回值和参数的数据流)进行合并;如果标准内存管理函数执行内存释放操作,则合并所有从函数参数流向标准内存管理函数的数据流(从函数参数流向标准内存管理函数的数据流),这样可以完整记录自定义内存管理函数分配或释放的内存对象的完整结构信息。
52.检测时,选择待检测代码项目的入口(默认为代码的main函数),开始遍历整个代码,在遍历过程中,一旦发现某个函数为自定义内存管理函数,通过建立或销毁一个抽象内存对象进行代码缺陷检测。如果待测内存管理函数是自定义内存分配函数,则按照其动态管理的内存对象生成用于指代该内存对象的符号表达式,并将其加入到当前内存对象列表中,并传递给后续分析;如果待测内存管理函数是自定义内存释放函数,则根据其传入参数指定的符号表达式,更新其状态为释放,并将其从当前内存对象列表中移除销毁;如果一个标记为释放状态的符号表达式被再次更新为释放状态,则检测出双重释放缺陷;如果一个标记为释放状态的符号表达式被读写后续代码访问,则检测出释放后使用缺陷。
53.本发明在linuxkernel、freebsdkernel、openssl、redis等不同规模(代码规模从10万行至3000万行不等)的c/c 代码库上进行了测试,结果显示,其中可以识别超过10000个自定义内存管理函数,对任一项目的整个分析过程(包括内存管理函数识别和内存破坏代码缺陷检测,使用双intelxeoncpu,256g内存)可在10小时内完成,极大提升了分析效率(与之相比,传统的分析工具需要超过100小时运行时间,且无法对大型项目完成完整的分析),并发现了80余个此前未被报告的代码缺陷,验证了本发明的保护效果。
54.综上所述,本发明的一种自定义内存管理函数的代码缺陷检测方法,通过巧妙的设计,使用训练好的孪生神经网络模型来对函数进行分类确定是否为自定义内存管理函数,捕获特征信息记录其内存对象结构信息,通过内存对象结构信息进行代码缺陷检测,从很大程度上提高了精准度,也使其适用于大型程序的检测。所以,本发明有效克服了现有技术中的种种缺点而达到更好的实用效果。
55.上述实施例仅例示性说明本发明的原理及其功效,而非用于限制本发明。任何熟悉此技术的人士皆可在不违背本发明的精神及范畴下,对上述实施例进行修饰或改变。因此,举凡所属技术领域中具有通常知识者在未脱离本发明所揭示的精神与技术思想下所完成的一切等效修饰或改变,仍应由本发明的权利要求所涵盖。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献