CN114282226B - 单次多漏洞代码检测方法及系统 - Google Patents

单次多漏洞代码检测方法及系统 Download PDF

Info

Publication number
CN114282226B
CN114282226B CN202111673574.1A CN202111673574A CN114282226B CN 114282226 B CN114282226 B CN 114282226B CN 202111673574 A CN202111673574 A CN 202111673574A CN 114282226 B CN114282226 B CN 114282226B
Authority
CN
China
Prior art keywords
code
memory
vulnerability
function
value flow
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.)
Active
Application number
CN202111673574.1A
Other languages
English (en)
Other versions
CN114282226A (zh
Inventor
高旺
李卷孺
谷大武
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Shanghai Jiaotong University
Original Assignee
Shanghai Jiaotong University
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Shanghai Jiaotong University filed Critical Shanghai Jiaotong University
Priority to CN202111673574.1A priority Critical patent/CN114282226B/zh
Publication of CN114282226A publication Critical patent/CN114282226A/zh
Application granted granted Critical
Publication of CN114282226B publication Critical patent/CN114282226B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Debugging And Monitoring (AREA)

Abstract

一种单次多漏洞代码检测方法及系统,通过LLVM编译器将待检测代码转化为LLVM中间语言后,进行类型敏感的指针分析,进而构建整个程序代码的程序调用图;然后根据预先标记的函数构建整个程序代码内存对象和全局常量的值流图,通过将内存泄漏、指针双重释放及释放后使用、常量敏感数据进行抽象建模表示,通过值流图的遍历以及代码安全问题模式匹配的方式对存在安全漏洞的代码点进行标记;最后通过对不同代码漏洞存在的误报模式进行建模,将收集的漏洞代码点进行误报过滤,并将剩余的漏洞代码点输出,得到最终的代码安全漏洞报告。本发明具有良好的扩展性且支持更多类型的代码漏洞检测的同时,极大地保障用户代码安全性并降低人力成本。

Description

单次多漏洞代码检测方法及系统
技术领域
本发明涉及的是一种信息安全领域的技术,具体是一种单次多漏洞代码检测方法及系统。
背景技术
代码问题层出不穷,从底层的操作系统到日常生活中广泛使用的各种智能终端,不安全代码导致的漏洞问题会使用户受到恶意攻击者的威胁。内存相关的代码安全问题会导致用户数据泄漏、拒绝服务攻击甚至远程代码执行;密码学相关的漏洞也会导致用户数据的机密性、完整性以及可用性遭到破坏。上述问题的成因是编程人员的疏忽或者对相关安全知识的缺失,进而导致编写代码中出现能被恶意攻击者利用的代码片段。现有的漏洞检测工具的准确率和效率一直是检测工具开发面临的难题。具体来说,自动化漏洞检测工具所报告的漏洞存在误报的问题,以及当检测对象的代码量过大时检测工具无法对其完成检测。现有的内存检测技术仅针对特定漏洞模式进行检测,无法很好地扩展到其他漏洞模式且常规的指针分析方法,对于函数指针的指向会存在误报。
发明内容
本发明针对现有技术存在的上述不足,提出一种单次多漏洞代码检测方法及系统,针对内存泄漏、指针双重释放与释放后使用以及常量敏感数据等问题进行快速检测,对实际生产环境代码进行有效分析评估,具有良好的扩展性且支持更多类型的代码漏洞检测的同时,极大地保障用户代码安全性并降低人力成本。
本发明是通过以下技术方案实现的:
本发明涉及一种单次多漏洞代码检测方法,通过LLVM编译器将待检测代码转化为LLVM中间语言后,进行类型敏感的指针分析,进而构建整个程序代码的程序调用图;然后根据预先标记的函数构建整个程序代码内存对象和全局常量的值流图,通过将内存泄漏、指针双重释放及释放后使用、常量敏感数据进行抽象建模表示,通过值流图的遍历以及代码安全问题模式匹配的方式对存在安全漏洞的代码点进行标记;最后通过对不同代码漏洞存在的误报模式进行建模,将收集的漏洞代码点进行误报过滤,并将剩余的漏洞代码点输出,得到最终的代码安全漏洞报告。
所述的待检测代码,其经预先手工标记出代码中所使用的内存操作函数和密码学相关函数,
所述的内存操作函数是指:类似malloc的内存申请函数以及开发人员自行实现或封装的内存申请函数;类似free的内存释放函数以及开发人员自行实现或者封装的内存释放函数。
所述的密码学操作函数是指:类似OpenSSL密码库中AES_set_encrypt_key的密钥初始化函数以及其中密钥所处的参数位置。
所述的类型敏感的指针分析是指:针对参数中存在结构体的函数指针,本实施例所进行的指针分析会记录对应的结构体类型信息,并用此信息优化指针分析的结果。具体来说,本实施例所进行的函数指针分析,会将参数个数不同或者结构体参数类型不符的结果过滤,从而提高指针分析的准确率。
所述的函数调用图是指:记录不同函数与函数内所调用函数关系的有向图,由调用者指向被调用者。
所述的值流图,通过以下方式构建得到:
①收集内存对象和全局常量:遍历代码中所有内存申请函数的调用点,并将其返回值所处变量标记为内存对象;遍历代码的全局变量并判断其是否存在初始值;
②收集内存对象和全局变量的定义-使用链:根据LLVM中间语言中的Load和Store指令,沿程序的控制流对上述对象的值流传递信息进行记录,并沿途记录经过的变量,整合为定义-使用链,并根据LLVM中间语言中的Call指令,记录上述对象作为函数参数的使用信息;
③从定义-使用链构建值流图:根据不同定义-使用链上的共有节点,将定义-使用链相连,最终得到值流图。
所述的抽象建模表示包括:
①内存泄漏漏洞检测:以内存对象为起点,遍历值流图,并记录不同分支的条件表达式;当i)遇到Store指令对应的节点且当内存对象作为源操作数或ii)遇到Load指令对应的节点且当内存对象作为目的操作数或iii)内存节点作为函数参数或iv)内存节点作为函数返回时,继续遍历;当无法到达调用内存释放函数对应的节点时,则存在内存泄漏漏洞,否则进一步取不同分支条件表达式的并集,当结果不为全集时则存在内存泄漏漏洞;
②指针双重释放及释放后使用漏洞检测:以内存对象为起点,遍历值流图,并记录不同分支的条件表达式;当i)遇到Load指令或ii)遇到内存节点作为函数参数时,记录节点所对应的代码位置;遍历完值流图后,将代码位置的指令视为内存对象的使用,并判断调用内存释放函数和其他使用点的控制流次序是否存在指针双重释放和释放后使用漏洞,即:1)指针双重释放:记录的内存对象使用集合中存在多处调用内存释放函数,并且处于同一控制流上;2)指针释放后使用:记录的内存对象使用集合中,在控制流上存在位于调用内存释放函数后的内存对象使用点;
③常量敏感数据漏洞检测:i)以全局变量为起点,遍历值流图;当遇到Store指令对应的节点且当全局常量作为源操作数时,将此节点记录到Store指令对应的节点列表,并继续向前遍历值流图;当遇到全局常量作为函数调用参数指令对应的节点且该函数为预先标记的密码学函数时,则存在常量敏感数据漏洞;ii)对步骤i)中记录的Store指令对应的节点列表后向回溯,定位全局常量存入的变量,并将这些变量视为全局常量后,再通过步骤i)进行常量敏感数据漏洞检测。
技术效果
相比现有技术聚焦于针对不同类型代码漏洞提出定制化的漏洞检测方法,大多不能将其检测方法迁移到不同类型漏洞的检测上,本发明在值流图基础上对代码漏洞检测模式进行抽象建模,针对不同类型漏洞的检测只需要经过相同的预处理模块提取信息,即可在值流图上对不同漏洞模式进行建模,通过内存泄漏模式,指针双重释放及释放后使用模式以及常量敏感数据模式等等。最终可以达到对目标代码进行一次分析即可检测不同种类漏洞的效果。
本发明提出的方法具有较广的适用性和较高的可行性,并且具备一定可扩展性,可以在现有流程的漏洞检测模块增加检测其他类型漏洞的逻辑以实现扩展;同时易于学习、交流、研究、开发和部署,有利于提高当前代码开发相关领域的安全水准和开发人员的安全意识,有利于进一步推进代码安全相关的安全研究。
附图说明
图1为本发明流程示意图;
图2为内存泄漏漏洞的代码示意图;
图3为本发明分析图2所示代码生成的值流图示意图。
具体实施方式
如图1所示,为本实施例涉及的一种自动化代码漏洞检测系统,在LLVM 12.0版本框架上实现,该系统包括:预处理模块、漏洞检测模块以及误报过滤模块,其中:预处理模块利用LLVM编译器将待检测代码的C语言源码转换为LLVM中间语言,对其进行类型敏感的指针分析并构建整个项目的函数调用图;利用函数调用图和预先标记的内存操作函数和密码学函数,从待检测代码的LLVM中间语言中构建内存对象和全局常量的值流图;漏洞检测模块通过总结不同类型代码漏洞特征构建代码漏洞检测模式,进而选择特定的起点并在值流图上进行遍历以分析是否存在所定义的代码漏洞检测模式。
所述的预处理模块利用LLVM编译器将待检测代码的C语言代码转换为LLVM中间语言表示;对LLVM中间语言进行类型敏感的指针分析得到待检测代码的函数调用图;利用LLVM中间语言、预先标记的内存操作和密码学函数以及函数调用图,生成待检测代码内存对象和全局常量的值流图。
所述的漏洞检测模块利用预处理模块生成的值流图和函数调用图,结合针对不同类型代码漏洞的抽象建模结果,在值流图上遍历并匹配符合漏洞模式的代码,最终生成代码漏洞报告。
所述的误报过滤模块根据漏洞检测模块得到的漏洞报告在值流图上定位漏洞代码涉及的相关结点,并将其从值流图中提取为子图,并在此基础上进行两方面的误报判断:1)结合控制流图信息,误报过滤模块会收集漏洞代码中条件分支的信息,并对不同的条件分枝提取约束表达式,最终计算漏洞代码所描述的路径是否可达;2)根据预先总结的误报模式,误报过滤模块会在漏洞代码的值流图子图上进行遍历并判断是否存在所定义的误报代码模式。最终可以得到消除误报后的代码漏洞报告。
经过具体实际实验,在Juliet Test Suite以及Linux Kernel等开源漏洞测试集和大型开源项目上进行测试。结果显示,对于漏洞测试集中包含的上述种类的1845处漏洞代码,本实施例可以正确检测报告其中的1575处,准确率为85.4%,从生成LLVM中间语言后计时,整个检测过程可以在5分钟之内完成;对于大型开源项目,本实施例可以成功检测到多个现存的CVE漏洞,整个检测过程可以在6小时内完成。
与现有技术只针对单一类型代码漏洞进行检测的方法相比,本发明设计一种可以同时检测多种代码漏洞的自动化检测方法;针对现有的开源漏洞代码测试集的检测,本方法检测漏洞的准确率得到提升;针对现实中开源的大型代码进行测试,缩短漏洞检测所需要的时间。
上述具体实施可由本领域技术人员在不背离本发明原理和宗旨的前提下以不同的方式对其进行局部调整,本发明的保护范围以权利要求书为准且不由上述具体实施所限,在其范围内的各个实现方案均受本发明之约束。

Claims (7)

1.一种单次多漏洞代码检测方法,其特征在于,通过LLVM编译器将待检测代码转化为LLVM中间语言后,进行类型敏感的指针分析,进而构建整个程序代码的程序调用图;然后根据预先标记的函数构建整个程序代码内存对象和全局常量的值流图,通过将内存泄漏、指针双重释放及释放后使用、常量敏感数据进行抽象建模表示,通过值流图的遍历以及代码安全问题模式匹配的方式对存在安全漏洞的代码点进行标记;最后通过对不同代码漏洞存在的误报模式进行建模,将收集的漏洞代码点进行误报过滤,并将剩余的漏洞代码点输出,得到最终的代码安全漏洞报告;
所述的待检测代码,其经预先手工标记出代码中所使用的内存操作函数和密码学相关函数;
所述的抽象建模表示包括:
①内存泄漏漏洞检测:以内存对象为起点,遍历值流图,并记录不同分支的条件表达式;当i)遇到Store指令对应的节点且当内存对象作为源操作数或ii)遇到Load指令对应的节点且当内存对象作为目的操作数或iii)内存节点作为函数参数或iv)内存节点作为函数返回时,继续遍历;当无法到达调用内存释放函数对应的节点时,则存在内存泄漏漏洞,否则进一步取不同分支条件表达式的并集,当结果不为全集时则存在内存泄漏漏洞;
②指针双重释放及释放后使用漏洞检测:以内存对象为起点,遍历值流图,并记录不同分支的条件表达式;当i)遇到Load指令或ii)遇到内存节点作为函数参数时,记录节点所对应的代码位置;遍历完值流图后,将代码位置的指令视为内存对象的使用,并判断调用内存释放函数和其他使用点的控制流次序是否存在指针双重释放和释放后使用漏洞,即:1)指针双重释放:记录的内存对象使用集合中存在多处调用内存释放函数,并且处于同一控制流上;2)指针释放后使用:记录的内存对象使用集合中,在控制流上存在位于调用内存释放函数后的内存对象使用点;
③常量敏感数据漏洞检测:i)以全局变量为起点,遍历值流图;当遇到Store指令对应的节点且当全局常量作为源操作数时,将此节点记录到Store指令对应的节点列表,并继续向前遍历值流图;当遇到全局常量作为函数调用参数指令对应的节点且该函数为预先标记的密码学函数时,则存在常量敏感数据漏洞;ii)对步骤i)中记录的Store指令对应的节点列表后向回溯,定位全局常量存入的变量,并将这些变量视为全局常量后,再通过步骤i)进行常量敏感数据漏洞检测。
2.根据权利要求1所述的单次多漏洞代码检测方法,其特征是,所述的类型敏感的指针分析是指:针对参数中存在结构体的函数指针,记录对应的结构体类型信息,并用此信息优化指针分析的结果,具体为:将参数个数不同或者结构体参数类型不符的结果过滤,从而提高指针分析的准确率。
3.根据权利要求1所述的单次多漏洞代码检测方法,其特征是,所述的值流图,通过以下方式构建得到:
①收集内存对象和全局常量:遍历代码中所有内存申请函数的调用点,并将其返回值所处变量标记为内存对象;遍历代码的全局变量并判断其是否存在初始值;
②收集内存对象和全局变量的定义-使用链:根据LLVM中间语言中的Load和Store指令,沿程序的控制流对上述对象的值流传递信息进行记录,并沿途记录经过的变量,整合为定义-使用链,并根据LLVM中间语言中的Call指令,记录上述对象作为函数参数的使用信息;
③从定义-使用链构建值流图:根据不同定义-使用链上的共有节点,将定义-使用链相连,最终得到值流图。
4.一种实现权利要求1~3中任一所述方法的自动化代码漏洞检测系统,其特征在于,包括:预处理模块、漏洞检测模块以及误报过滤模块,其中:预处理模块利用LLVM编译器将待检测代码的C语言源码转换为LLVM中间语言,对其进行类型敏感的指针分析并构建待检测代码的函数调用图;利用函数调用图和预先标记的内存操作函数和密码学函数,从待检测代码的LLVM中间语言中构建内存对象和全局常量的值流图;漏洞检测模块通过总结不同类型代码漏洞特征构建代码漏洞检测模式,进而选择特定的起点并在值流图上进行遍历以分析是否存在所定义的代码漏洞检测模式;
所述的函数调用图是指:记录不同函数与函数内所调用函数关系的有向图,由调用者指向被调用者。
5.根据权利要求4所述的自动化代码漏洞检测系统,其特征是,所述的预处理模块利用LLVM编译器将待检测代码的C语言代码转换为LLVM中间语言表示;对LLVM中间语言进行类型敏感的指针分析得到待检测代码的函数调用图;利用LLVM中间语言、预先标记的内存操作和密码学函数以及函数调用图,生成待检测代码内存对象和全局常量的值流图。
6.根据权利要求4所述的自动化代码漏洞检测系统,其特征是,所述的漏洞检测模块利用预处理模块生成的值流图和函数调用图,结合针对不同类型代码漏洞的抽象建模结果,在值流图上遍历并匹配符合漏洞模式的代码,最终生成代码漏洞报告。
7.根据权利要求4所述的自动化代码漏洞检测系统,其特征是,所述的误报过滤模块根据漏洞检测模块得到的漏洞报告在值流图上定位漏洞代码涉及的相关结点,并将其从值流图中提取为子图,并进行误报判断,即:1)结合控制流图信息,误报过滤模块会收集漏洞代码中条件分支的信息,并对不同的条件分枝提取约束表达式,最终计算漏洞代码所描述的路径是否可达;2)根据预先总结的误报模式,误报过滤模块会在漏洞代码的值流图子图上进行遍历并判断是否存在所定义的误报代码模式;最终得到消除误报后的代码漏洞报告。
CN202111673574.1A 2021-12-31 2021-12-31 单次多漏洞代码检测方法及系统 Active CN114282226B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202111673574.1A CN114282226B (zh) 2021-12-31 2021-12-31 单次多漏洞代码检测方法及系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202111673574.1A CN114282226B (zh) 2021-12-31 2021-12-31 单次多漏洞代码检测方法及系统

Publications (2)

Publication Number Publication Date
CN114282226A CN114282226A (zh) 2022-04-05
CN114282226B true CN114282226B (zh) 2024-05-28

Family

ID=80879590

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202111673574.1A Active CN114282226B (zh) 2021-12-31 2021-12-31 单次多漏洞代码检测方法及系统

Country Status (1)

Country Link
CN (1) CN114282226B (zh)

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108804332A (zh) * 2018-06-14 2018-11-13 南京大学 一种基于机器学习的c程序内存泄漏智能化检测方法
CN109426615A (zh) * 2017-09-01 2019-03-05 深圳市源伞新科技有限公司 过程间的空指针解引用检测方法、系统、设备以及介质
CN111104335A (zh) * 2019-12-25 2020-05-05 清华大学 一种基于多层次分析的c语言缺陷检测方法及装置
CN111752586A (zh) * 2020-06-23 2020-10-09 上海交通大学 跨架构的嵌入式设备固件未修补漏洞检测方法及系统
CN112528240A (zh) * 2020-12-02 2021-03-19 上海交通大学 面向密码代码的自动化程序敏感数据保护方法
CN113326187A (zh) * 2021-05-25 2021-08-31 扬州大学 数据驱动的内存泄漏智能化检测方法及系统

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9530006B2 (en) * 2014-04-11 2016-12-27 Oracle International Corporation Method and system for performing a memory safety check of a program written in an unmanaged programming language

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109426615A (zh) * 2017-09-01 2019-03-05 深圳市源伞新科技有限公司 过程间的空指针解引用检测方法、系统、设备以及介质
CN108804332A (zh) * 2018-06-14 2018-11-13 南京大学 一种基于机器学习的c程序内存泄漏智能化检测方法
CN111104335A (zh) * 2019-12-25 2020-05-05 清华大学 一种基于多层次分析的c语言缺陷检测方法及装置
CN111752586A (zh) * 2020-06-23 2020-10-09 上海交通大学 跨架构的嵌入式设备固件未修补漏洞检测方法及系统
CN112528240A (zh) * 2020-12-02 2021-03-19 上海交通大学 面向密码代码的自动化程序敏感数据保护方法
CN113326187A (zh) * 2021-05-25 2021-08-31 扬州大学 数据驱动的内存泄漏智能化检测方法及系统

Non-Patent Citations (8)

* Cited by examiner, † Cited by third party
Title
Annotating, Tracking, and Protecting Cryptographic Secrets with CryptoMPK;Xuancheng Jin 等;2022 IEEE Symposium on Security and Privacy (SP);20220526;第650-665页 *
AutoFix: An Automated Approach to Memory Leak Fixing on Value-Flow Slices for C Programs;Hua Yan 等;SAC’16 Proceedings of the 2016 ACM Symposium on Applied Computing;20161230;第16卷(第4期);第38-50页 *
C程序中的内存泄漏机制分析与检测方法设计;张静 等;计算机工程与科学;20200515(第05期);第19-30页 *
SparrowHawk: Memory Safety Flaw Detection via Data-driven Source Code Annotation;Yunlong Lyu 等;Information Security and Cryptology: 17th International Conference, Inscrypt 2021;20210814;第129-148页 *
SVF: Interprocedural Static Value-Flow Analysis in LLVM;Yulei Sui 等;CC 2016: Proceedings of the 25th International Conference on Compiler Construction;20160317;全文 *
一种基于全系统仿真和指令流分析的二进制代码分析方法;邓超国;谷大武;李卷孺;孙明;;计算机应用研究;20110415(第04期);第243-247+275页 *
基于值流分析的内存释放错误自动化修复技术;李晓彤;中国优秀硕士学位论文全文数据库 信息科技II辑;20230215;I138-219 *
基于摘要的内存泄露分析方法改进;雷达;曾庆凯;;计算机应用研究;20111130;28(第11期);第4315-4319页 *

Also Published As

Publication number Publication date
CN114282226A (zh) 2022-04-05

Similar Documents

Publication Publication Date Title
CN107832619B (zh) Android平台下应用程序漏洞自动化挖掘系统及方法
CN106203113B (zh) 安卓应用文件的隐私泄露监控方法
Xu A tool for automated test code generation from high-level Petri nets
US8407800B2 (en) Method for software vulnerability flow analysis, generation of vulnerability-covering code, and multi-generation of functionally-equivalent code
CN111008376B (zh) 一种基于代码动态分析的移动应用源代码安全审计系统
CN103577324B (zh) 移动应用中隐私信息泄露的静态检测方法
CN108268371B (zh) 面向Android应用的智能模糊测试方法
Yao et al. Statsym: vulnerable path discovery through statistics-guided symbolic execution
KR101640479B1 (ko) 소스코드기반 소프트웨어 취약점 공격행위 분석시스템
Wu et al. Mutation testing for ethereum smart contract
CN115270131A (zh) 一种Java反序列化漏洞检测方法及系统
CN104766015A (zh) 一种基于函数调用的缓冲区溢出漏洞动态检测方法
CN105808430A (zh) 一种多语义动态污点分析方法
CN114707152A (zh) 联盟链智能合约的安全漏洞检测方法及装置
CN114996126A (zh) 一种针对eosio智能合约的漏洞检测方法及系统
CN116383833A (zh) 软件程序代码的测试方法及其装置、电子设备、存储介质
Autili et al. Software engineering techniques for statically analyzing mobile apps: research trends, characteristics, and potential for industrial adoption
CN111309589A (zh) 一种基于代码动态分析的代码安全扫描系统及方法
Aidee et al. Vulnerability assessment on ethereum based smart contract applications
Kang et al. Scaling javascript abstract interpretation to detect and exploit node. js taint-style vulnerability
Hao et al. Constructing benchmarks for supporting explainable evaluations of static application security testing tools
CN114282226B (zh) 单次多漏洞代码检测方法及系统
Bohluli et al. Detecting privacy leaks in android apps using inter-component information flow control analysis
Han et al. An optimized static propositional function model to detect software vulnerability
CN113553593B (zh) 基于语义分析的物联网固件内核漏洞挖掘方法及系统

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