CN112783755A - 一种基于自然语言理解函数原型发现内存破坏漏洞的方法 - Google Patents
一种基于自然语言理解函数原型发现内存破坏漏洞的方法 Download PDFInfo
- Publication number
- CN112783755A CN112783755A CN201911083435.6A CN201911083435A CN112783755A CN 112783755 A CN112783755 A CN 112783755A CN 201911083435 A CN201911083435 A CN 201911083435A CN 112783755 A CN112783755 A CN 112783755A
- Authority
- CN
- China
- Prior art keywords
- function
- prototype
- function prototype
- compared
- memory
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
- 230000006870 function Effects 0.000 title claims abstract description 150
- 238000000034 method Methods 0.000 title claims abstract description 26
- 238000001514 detection method Methods 0.000 claims abstract description 13
- 230000001066 destructive effect Effects 0.000 claims abstract description 7
- 230000011218 segmentation Effects 0.000 claims abstract description 5
- 230000000875 corresponding effect Effects 0.000 claims description 16
- 230000003044 adaptive effect Effects 0.000 claims description 4
- 238000004364 calculation method Methods 0.000 claims description 4
- 238000000605 extraction Methods 0.000 claims description 3
- 238000007781 pre-processing Methods 0.000 claims description 3
- 230000002596 correlated effect Effects 0.000 claims description 2
- 230000003068 static effect Effects 0.000 abstract description 9
- 238000004458 analytical method Methods 0.000 description 5
- 230000008569 process Effects 0.000 description 3
- 238000005516 engineering process Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 230000018109 developmental process Effects 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 239000013598 vector Substances 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3604—Software analysis for verifying properties of programs
- G06F11/3616—Software analysis for verifying properties of programs using software metrics
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明提供一种基于自然语言理解函数原型发现内存破坏漏洞的方法,涉及软件安全领域,所述方法包括步骤一:提取源代码中的函数原型,作为待比较函数原型;步骤二:提取注释中的语料生成一个自适应语料库;步骤三:使用自适应语料库对待比较函数原型进行函数原型分割,将待比较函数原型分割成为一组单词或者短语;步骤四:选取已知函数语义的函数原型作为参考函数原型,通过参考函数原型对待比较函数原型类型进行判断;步骤五:用函数匹配列表中的匹配信息标记待检测的源代码,并将函数漏洞规则作为符号执行的输入检测内存破坏型漏洞。通过提取源代码中的内存管理函数来降低静态源代码漏洞检测中产生的漏报。
Description
技术领域
本发明涉及软件安全领域,特别是涉及一种基于自然语言理解函数原型发现内存破坏漏洞的方法。
背景技术
内存破坏型漏洞的产生很大一部分原因是因为软件开发人员不正确的管理动态内存。管理动态内存通常包括比较复杂的内存管理逻辑,因此软件开发人员通常使用内存管理函数来进行动态内存管理。但是,不正确的使用内存管理函数会导致内存破坏性型漏洞的产生(例如,在释放完内存后,立马使用这块内存,重复地释放同一块内存),在静态源代码漏洞检测中,检测内存破坏型漏洞的方法包括:模式匹配、符号执行、指针分析等。有效地在源代码静态检测阶段发现源代码中可能存在的内存破坏型漏洞能够减少软件发布版本的漏洞,能够提升软件安全性,防止软件被恶意用户所利用。
现有的静态源代码漏洞检测中,检测内存破坏型漏洞的方法仅仅考虑由于C/C++等标准库内存管理函数,例如:malloc(memory allocation,动态内存分配)等标准库内存管理函数使用不当所带来的内存破坏型漏洞。但是,在实际软件开发过程中,软件开发人员除了会使用标准库内存管理函数,还会使用第三方库内存管理函数,在这种情况下,现有的静态源代码漏洞检测中依然仅仅依赖标准库的内存管理函数是不够的,在实际静态源代码漏洞检测中会产生漏报。
发明内容
鉴于以上所述现有技术的缺点,本发明的目的在于提供一种基于自然语言理解函数原型发现内存破坏漏洞的方法,通过提取源代码中的内存管理函数来降低静态源代码漏洞检测中产生的漏报。
本发明提供一种基于自然语言理解函数原型发现内存破坏漏洞的方法,所述方法包括以下步骤:
步骤一:在源代码进入预处理阶段,对源代码进行特征抓取,提取源代码中的函数原型,作为待比较函数原型;
步骤二:对源代码注释进行特征抓取,提取注释中的语料生成一个自适应语料库;
步骤三:在语义提取阶段,使用自适应语料库对待比较函数原型进行函数原型分割,将待比较函数原型分割成为一组单词或者短语;
步骤四:选取已知函数语义的函数原型作为参考函数原型,分割生成一个语境语料库,使用语境语料库比较待比较函数原型和参考函数原型,使用选取的参考函数原型的返回值类型、参数类型对待比较函数原型类型进行判断,如果类型相同,则待比较函数原型对应的函数是内存管理函数,如果返回类型不同,则该带比较函数原型对应的函数不是内存管理函数;
步骤五:若函数原型对应的函数是内存管理函数,则将对应的函数列入函数匹配列表,用函数匹配列表中的匹配信息标记待检测的源代码,并且将已知函数漏洞规则作为符号执行的输入检测内存破坏型漏洞,最后输出相应的检测报告。
于本发明的一实施例中,所述自适应语料库中还包括有微软开发者手册函数列表和谷歌网络词语的语料。
于本发明的一实施例中,所述语境语料库与编程语料强相关。
于本发明的一实施例中,所述参考函数原型为一个或者多个。
于本发明的一实施例中,采用余弦相似度计算方法对参考函数原型的和待比较函数原型进行类型判断。
如上所述,本发明的一种基于自然语言理解函数原型发现内存破坏漏洞的方法,具有以下有益效果:本发明采用分析函数原型的方法来提取函数语义,通过自然语言理解技术处理函数原型,从而提取所有的内存管理函数,将这些信息与符号执行相结合检测漏洞,降低了在源代码静态分析中的漏报。
附图说明
图1显示为本发明实施例中公开的基于自然语言理解函数原型发现内存破坏漏洞的方法的流程图。
具体实施方式
以下通过特定的具体实例说明本发明的实施方式,本领域技术人员可由本说明书所揭露的内容轻易地了解本发明的其他优点与功效。本发明还可以通过另外不同的具体实施方式加以实施或应用,本说明书中的各项细节也可以基于不同观点与应用,在没有背离本发明的精神下进行各种修饰或改变。需说明的是,在不冲突的情况下,以下实施例及实施例中的特征可以相互组合。
需要说明的是,以下实施例中所提供的图示仅以示意方式说明本发明的基本构想,遂图式中仅显示与本发明中有关的组件而非按照实际实施时的组件数目、形状及尺寸绘制,其实际实施时各组件的型态、数量及比例可为一种随意的改变,且其组件布局型态也可能更为复杂。
如图1所示,本发明提供一种基于自然语言理解函数原型发现内存破坏漏洞的方法,所述方法包括以下步骤:
步骤一:在源代码进入预处理阶段,对源代码进行特征抓取,提取源代码中的函数原型,作为待比较函数原型;
步骤二:对源代码注释进行特征抓取,提取注释中的语料生成一个自适应语料库;
其中,生成的自适应语料库中可能尽可能多地包含编程相关的单词或者短语,因此,自适应语料库中还包括有微软开发者手册函数列表和谷歌网络词语的语料。
步骤三:在语义提取阶段,使用自适应语料库对待比较函数原型进行函数原型分割,将待比较函数原型分割成为一组单词或者短语;
步骤四:选取已知函数语义的函数原型作为参考函数原型,分割生成一个语境语料库,使用语境语料库比较待比较函数原型和参考函数原型,使用选取的参考函数原型的返回值类型、参数类型对待比较函数原型类型进行判断,如果类型相同,则待比较函数原型对应的函数是内存管理函数,如果返回类型不同,则该带比较函数原型对应的函数不是内存管理函数;
其中,生成的语境语料库内容与编程强相关,并且选取的参考函数原型为一个或者多个;
具体的,采用余弦相似度计算方法对参考函数原型的和待比较函数原型进行类型判断;
步骤五:若函数原型对应的函数是内存管理函数,则将对应的函数列入函数匹配列表,用函数匹配列表中的匹配信息标记待检测的源代码,并且将已知函数漏洞规则作为符号执行的输入检测内存破坏型漏洞,最后输出相应的检测报告。
实施例一
以源代码为GraphicsMagick的图片管理库代码中存在的一个空指针引用的漏洞,即内存破坏型漏洞的例子进行举例说明,以下为源代码:
其中,MagickAllocateMemory为GraphicsMagick库中用来分配动态内存的函数,File1中定义了MagickAllocateMemory的函数原型;
MagickAllocateMemory分配的内存在File2第4行被赋值给变量comment;如果内存分配失败,则返回一个空指针;接下来File2第6行,在变量comment未被判断是为空指针的情况下,直接访问了该指针所指向的内存,从而导致空指针引用漏洞。
利用本发明所提供的方法,进行漏洞检测:
首先提取出GraphicsMagick库中所有函数的函数原型;
然后利用GraphicsMagick库中的注释以及前述的几个语料生成两个语料库,对函数原型进行分词;例如,对于函数名MagickAllocateMemory,分割成[Magick,Allocate,Memory];任意选取一个参数函数原型,例如标准库内存管理函数malloc(选取的参考函数原型要求语义已知,目前所选取的参考函数原型为常用的标准库,例如Libc中的内存管理函数,如malloc,free等);同时对malloc函数名进行分割,分割成[m,alloc];然后使用语境语料库对这两组词进行比较,即比较[Magick,Allocate,Memory]和[m,alloc]的余弦相似度;
余弦相似度计算公式为:
其中,A、B分别表示两个单词在语料库中的向量;
如果余弦相似度超出了提前设置的阀值(阈值的设置是一个实验数值,数值越高,产生的结果相似度越高,数量越少;反之则相似度较低,数量越多,实验参考值选取了0.4为最优),则将MagickAllocateMemory标记为可能的内存管理函数;然后比较MagickAllocateMemory和malloc的返回值的参数类型,由于返回值都为指针类型,参数名对应类型都为整数,因此根据malloc的函数语义,推断出MagickAllocateMemory的函数语义也为内存分配;
最后将MagickAllocateMemory为内存分配函数作为输入信息,对源代码进行符号执行分析;在符号执行到源代码File2第4行时,发现所调用的函数MagickAllocateMemory为内存分配函数,于是将变量comment所指向的内存标记为已分配,当符号执行到File2第6行时,发现访问的内存为MagickAllocateMemory所分配的内存,并且指针未被判空,于是报告一个空解引用类型的漏洞。
综上所述,本发明发现了在源代码静态检测内存破坏型漏洞时的一个遗漏点,在分析函数实体十分困难的情况下,现有的源代码分析方法是依赖标准库的内存管理函数来进行漏洞检测,会遗漏第三方库或者自定义实现的内存管理函数作为判断依据,进而导致内存破坏性漏洞检测的漏报。本发明采用分析函数原型的方法来提取函数语义,通过自然语言理解技术处理函数原型,从而提取所有的内存管理函数,将这些信息与符号执行相结合检测漏洞,降低了在源代码静态分析中的漏报。因此,本发明有效克服了现有技术中的种种缺点而具高度产业利用价值。
上述实施例仅例示性说明本发明的原理及其功效,而非用于限制本发明。任何熟悉此技术的人士皆可在不违背本发明的精神及范畴下,对上述实施例进行修饰或改变。因此,举凡所属技术领域中具有通常知识者在未脱离本发明所揭示的精神与技术思想下所完成的一切等效修饰或改变,仍应由本发明的权利要求所涵盖。
Claims (5)
1.一种基于自然语言理解函数原型发现内存破坏漏洞的方法,其特征在于,所述方法包括以下步骤:
步骤一:在源代码进入预处理阶段,对源代码进行特征抓取,提取源代码中的函数原型,作为待比较函数原型;
步骤二:对源代码注释进行特征抓取,提取注释中的语料生成一个自适应语料库;
步骤三:在语义提取阶段,使用自适应语料库对待比较函数原型进行函数原型分割,将待比较函数原型分割成为一组单词或者短语;
步骤四:选取已知函数语义的函数原型作为参考函数原型,分割生成一个语境语料库,使用语境语料库比较待比较函数原型和参考函数原型,使用选取的参考函数原型的返回值类型、参数类型对待比较函数原型类型进行判断,如果类型相同,则待比较函数原型对应的函数是内存管理函数,如果返回类型不同,则该带比较函数原型对应的函数不是内存管理函数;
步骤五:若函数原型对应的函数是内存管理函数,则将对应的函数列入函数匹配列表,用函数匹配列表中的匹配信息标记待检测的源代码,并且将已知函数漏洞规则作为符号执行的输入检测内存破坏型漏洞,最后输出相应的检测报告。
2.根据权利要求1所述的一种基于自然语言理解函数原型发现内存破坏漏洞的方法,其特征在于:所述自适应语料库中还包括有微软开发者手册函数列表和谷歌网络词语的语料。
3.根据权利要求1所述的一种基于自然语言理解函数原型发现内存破坏漏洞的方法,其特征在于:所述语境语料库与编程语料强相关。
4.根据权利要求1所述的一种基于自然语言理解函数原型发现内存破坏漏洞的方法,其特征在于:所述参考函数原型为一个或者多个。
5.根据权利要求1所述的一种基于自然语言理解函数原型发现内存破坏漏洞的方法,其特征在于:采用余弦相似度计算方法对参考函数原型的和待比较函数原型进行类型判断。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911083435.6A CN112783755B (zh) | 2019-11-07 | 2019-11-07 | 一种基于自然语言理解函数原型发现内存破坏漏洞的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911083435.6A CN112783755B (zh) | 2019-11-07 | 2019-11-07 | 一种基于自然语言理解函数原型发现内存破坏漏洞的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112783755A true CN112783755A (zh) | 2021-05-11 |
CN112783755B CN112783755B (zh) | 2024-03-22 |
Family
ID=75748006
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201911083435.6A Active CN112783755B (zh) | 2019-11-07 | 2019-11-07 | 一种基于自然语言理解函数原型发现内存破坏漏洞的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112783755B (zh) |
Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR20070023873A (ko) * | 2005-08-25 | 2007-03-02 | 최의인 | 소프트웨어 개발을 위한 취약성 룰 기반 시스템 |
US20070283338A1 (en) * | 2006-06-02 | 2007-12-06 | Rajeev Gupta | System and method for matching a plurality of ordered sequences with applications to call stack analysis to identify known software problems |
US20080301646A1 (en) * | 2007-05-29 | 2008-12-04 | Satish Chandra Gupta | Detecting Dangling Pointers and Memory Leaks Within Software |
CN103389939A (zh) * | 2013-07-03 | 2013-11-13 | 清华大学 | 一种针对堆可控分配漏洞的检测方法及系统 |
CN104636256A (zh) * | 2015-02-17 | 2015-05-20 | 中国农业银行股份有限公司 | 一种内存访问异常的检测方法及装置 |
CN105912458A (zh) * | 2016-03-28 | 2016-08-31 | 中国电力科学研究院 | 一种用于动态检测c/c++内存泄露的方法及系统 |
CN106407104A (zh) * | 2016-08-24 | 2017-02-15 | 北京奇虎测腾安全技术有限公司 | 一种用于检测与内存空间释放相关的缺陷的方法及系统 |
CN107562616A (zh) * | 2017-07-21 | 2018-01-09 | 中国科学院信息工程研究所 | 一种uaf漏洞利用判断方法及装置 |
CN108469997A (zh) * | 2017-12-01 | 2018-08-31 | 中国科学院软件研究所 | 一种基于动态特征的自定义堆管理函数的自动识别方法 |
CN109871693A (zh) * | 2019-02-21 | 2019-06-11 | 北京百度网讯科技有限公司 | 用于检测漏洞的方法和装置 |
CN110222512A (zh) * | 2019-05-21 | 2019-09-10 | 华中科技大学 | 一种基于中间语言的软件漏洞智能检测与定位方法与系统 |
-
2019
- 2019-11-07 CN CN201911083435.6A patent/CN112783755B/zh active Active
Patent Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR20070023873A (ko) * | 2005-08-25 | 2007-03-02 | 최의인 | 소프트웨어 개발을 위한 취약성 룰 기반 시스템 |
US20070283338A1 (en) * | 2006-06-02 | 2007-12-06 | Rajeev Gupta | System and method for matching a plurality of ordered sequences with applications to call stack analysis to identify known software problems |
US20080301646A1 (en) * | 2007-05-29 | 2008-12-04 | Satish Chandra Gupta | Detecting Dangling Pointers and Memory Leaks Within Software |
CN103389939A (zh) * | 2013-07-03 | 2013-11-13 | 清华大学 | 一种针对堆可控分配漏洞的检测方法及系统 |
CN104636256A (zh) * | 2015-02-17 | 2015-05-20 | 中国农业银行股份有限公司 | 一种内存访问异常的检测方法及装置 |
CN105912458A (zh) * | 2016-03-28 | 2016-08-31 | 中国电力科学研究院 | 一种用于动态检测c/c++内存泄露的方法及系统 |
CN106407104A (zh) * | 2016-08-24 | 2017-02-15 | 北京奇虎测腾安全技术有限公司 | 一种用于检测与内存空间释放相关的缺陷的方法及系统 |
CN107562616A (zh) * | 2017-07-21 | 2018-01-09 | 中国科学院信息工程研究所 | 一种uaf漏洞利用判断方法及装置 |
CN108469997A (zh) * | 2017-12-01 | 2018-08-31 | 中国科学院软件研究所 | 一种基于动态特征的自定义堆管理函数的自动识别方法 |
CN109871693A (zh) * | 2019-02-21 | 2019-06-11 | 北京百度网讯科技有限公司 | 用于检测漏洞的方法和装置 |
CN110222512A (zh) * | 2019-05-21 | 2019-09-10 | 华中科技大学 | 一种基于中间语言的软件漏洞智能检测与定位方法与系统 |
Non-Patent Citations (5)
Title |
---|
ANDREEA BICAN等: "Verification of C Buffer Overflows in C Programs", 《2018 17TH ROEDUNET CONFERENCE: NETWORKING IN EDUCATION AND RESEARCH》, pages 1 - 6 * |
ROMANGOL LIAROD: "TripleDoggy:代码漏洞自动化分析插件快速入门项目", pages 1 - 5, Retrieved from the Internet <URL:https://zhuanlan.zhihu.com/p/44899593?utm_source=wechat_timeline> * |
付晓毓等: "基于模型检测的内存泄露静态测试方法", 《微电子学与计算机》, no. 10, pages 170 - 173 * |
刘航源: "基于静态分析的软件内存漏洞检测", 《中国优秀硕士学位论文全文数据库 信息科技辑》, pages 138 - 137 * |
厉航靖: "基于缺陷模式的内存泄漏静态检测方法研究", 《中国优秀硕士学位论文全文数据库 信息科技辑》, pages 138 - 357 * |
Also Published As
Publication number | Publication date |
---|---|
CN112783755B (zh) | 2024-03-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Xi et al. | Deepintent: Deep icon-behavior learning for detecting intention-behavior discrepancy in mobile apps | |
CN110737899B (zh) | 一种基于机器学习的智能合约安全漏洞检测方法 | |
US7493596B2 (en) | Method, system and program product for determining java software code plagiarism and infringement | |
US8539475B2 (en) | API backward compatibility checking | |
US8589888B2 (en) | Demand-driven analysis of pointers for software program analysis and debugging | |
CN107967415B (zh) | 资源混淆保护方法、系统及终端装置 | |
CN113961768B (zh) | 敏感词检测方法、装置、计算机设备和存储介质 | |
CN111339531B (zh) | 恶意代码的检测方法、装置、存储介质及电子设备 | |
CN110750297B (zh) | 一种基于程序分析和文本分析的Python代码参考信息生成方法 | |
CN111159697A (zh) | 一种密钥检测方法、装置及电子设备 | |
CN112817877B (zh) | 异常脚本检测方法、装置、计算机设备和存储介质 | |
JP2009129127A (ja) | プログラムの不変物抽出処理プログラム,処理装置,および処理方法,ならびに該プログラムを記憶する記憶媒体 | |
Rabin et al. | Syntax-guided program reduction for understanding neural code intelligence models | |
CN107506622B (zh) | 一种基于内存对象访问序列的软件动态胎记及抄袭检测方法 | |
CN112287071A (zh) | 一种文本关系提取方法、装置及电子设备 | |
CN112069052A (zh) | 一种异常对象检测方法、装置、设备及存储介质 | |
Petrescu et al. | Do names echo semantics? A large-scale study of identifiers used in C++’s named casts | |
Chae et al. | Credible, resilient, and scalable detection of software plagiarism using authority histograms | |
CN112783755B (zh) | 一种基于自然语言理解函数原型发现内存破坏漏洞的方法 | |
CN116880847A (zh) | 基于开源项目的溯源方法、装置电子设备及存储介质 | |
Zheng et al. | A multitype software buffer overflow vulnerability prediction method based on a software graph structure and a self-attentive graph neural network | |
CN111552638B (zh) | 一种代码检测方法及装置 | |
CN113805861A (zh) | 基于机器学习的代码生成方法、代码编辑系统及存储介质 | |
CN111240696A (zh) | 移动恶意程序相似模块提取方法 | |
YUSYN et al. | IMPROVEMENT OF THE DETERMINISTIC METHOD OF THE TEXT DATA CORPORA GENERATION |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |