CN116680705B - 基于特征提取的Rust程序缺陷自动检测方法及系统 - Google Patents

基于特征提取的Rust程序缺陷自动检测方法及系统 Download PDF

Info

Publication number
CN116680705B
CN116680705B CN202310947118.4A CN202310947118A CN116680705B CN 116680705 B CN116680705 B CN 116680705B CN 202310947118 A CN202310947118 A CN 202310947118A CN 116680705 B CN116680705 B CN 116680705B
Authority
CN
China
Prior art keywords
unsafe
rust
defect
bare
pointer
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
CN202310947118.4A
Other languages
English (en)
Other versions
CN116680705A (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.)
National University of Defense Technology
Original Assignee
National University of Defense Technology
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 National University of Defense Technology filed Critical National University of Defense Technology
Priority to CN202310947118.4A priority Critical patent/CN116680705B/zh
Publication of CN116680705A publication Critical patent/CN116680705A/zh
Application granted granted Critical
Publication of CN116680705B publication Critical patent/CN116680705B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/57Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
    • G06F21/577Assessing vulnerabilities and evaluating computer system security

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Computer Security & Cryptography (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Computing Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Management, Administration, Business Operations System, And Electronic Commerce (AREA)

Abstract

本发明公开了一种基于特征提取的Rust程序缺陷自动检测方法及系统,通过分析Rust中有限类不安全Rust的主要使用场景,静态分析不安全代码本质不安全原因,构成每类不安全操作数据集,作为特征提取的输入;对不安全Rust不安全具体原因、来源和使用场景进行分析,构建包含每类不安全操作的缺陷数据集;对缺陷数据集中的不安全操作的词法规则进行分析,获取每类不安全Rust操作的关键字、函数名和运算符信息;根据有限类不安全Rust的特征,设计基于特征识别的缺陷检测。本发明有效的降低假阳性和假阴性的概率,并且自动化技术有效的提高了缺陷检测的效率。

Description

基于特征提取的Rust程序缺陷自动检测方法及系统
技术领域
本发明涉及计算机操作系统技术领域,尤其公开了一种基于特征提取的Rust程序缺陷自动检测方法及系统。
背景技术
目前大多数Rust系统缺陷检测方法可以分为两类:静态分析与动态检测。静态分析是指在不运行程序的情况下,对程序的源代码、编译过程中生成的中间代码进行分析。例如,Rust研究者通过对Rust实证研究等方式提出Rust学习和编程的相关建议,以构成编程规范和建议,从而为使用Rust编程提供指导。此类方法只能对特点的问题进行分析,存在假阳性和假阴性的问题。动态分析方法,如模糊测试、符合执行等方法,存在验证时路径爆炸,导致分支覆盖低求解困难,以及开销大可扩展性差等问题。形式化的方法,只能考虑Rust的一个子集,无法包含Rust全部特性并且无法自动化进行,需要大量的人工转换。由于操作系统代码规模和结构的复杂性,现有的缺陷检测方案无法平衡漏报率、误报率、准确率和检测时间等之间的矛盾。
因此,现有Rust系统缺陷检测方法中存在的检测不全面(容易发生漏报和误报)、需要耗费大量人工验证、自动化程度低,是目前亟待解决的技术问题。
发明内容
本发明提供了一种基于特征提取的Rust程序缺陷自动检测方法及系统,旨在解决现有Rust系统缺陷检测方法中存在的检测不全面、需要耗费大量人工验证、自动化程度低的技术问题。
本发明的一方面涉及一种基于特征提取的Rust程序缺陷自动检测方法,包括以下步骤:
静态分析不安全Rust:首先分析Rust中有限类不安全Rust的主要使用场景,静态分析不安全代码本质不安全原因,最后构成每类不安全操作数据集,作为特征提取的输入;
不安全Rust特征提取:通过对不安全Rust不安全具体原因、来源和使用场景进行分析,构建包含每类不安全操作的缺陷数据集;对缺陷数据集中的不安全操作的词法规则进行分析,获取每类不安全Rust操作的关键字、函数名和运算符信息;
自动化检测与优化设计:根据有限类不安全Rust的特征,设计基于特征识别的缺陷检测;将操作系统的源代码作为算法的输入,使用正则表达式来分类、标记和提取每一种不安全操作,输出包含具体缺陷信息的缺陷报告。
进一步地,不安全Rust的不安全操作类型包括五类操作,分别为解引用裸指针、调用不安全函数或方法、实现不安全特征、访问或修改可变静态变量和访问联合字段,静态分析不安全Rust的步骤包括:
解引用裸指针:只对裸指针进行解引用时才使用不安全关键字进行标记;
调用不安全函数或方法:将调用不安全的函数或方法放到不安全代码块中;
实现不安全特征:在关键字impl前加上不安全标记;
访问或修改可变静态变量:对可变静态变量进行访问时,使用不安全块进行包裹;
访问联合字段:访问或修改联合字段。
进一步地,不安全Rust特征提取的步骤包括:
对于五类不安全Rust操作都需要使用不安全关键字进行包裹;
对于解引用裸指针,使用*const T、*mut T或者封装好的方法来创建裸指针,且创建裸指针是安全操作,只有对裸指针的解引用才是不安全操作;
对于不安全函数,使用特征为:Unsafe fn Name{ },或者调用使用extern函数调用外部代码;
对于不安全特征,使用特征为:Unsafe trait Name{ },或者Unsafe impl Namefor T{ };
对于联合而言,定义联合类型是安全的,不安全特征是对联合字段的访问。
进一步地,不安全Rust特征提取的步骤包括:
根据有限类不安全Rust的特征,设计基于特征识别的缺陷检测;
扫描并读取系统所有字符流文件,根据标记的每类缺陷特征进行正则匹配;
检测结束生成日志,日志包含每一类缺陷的具体信息。
进一步地,扫描并读取系统所有字符流文件,根据标记的每类缺陷特征进行正则匹配的步骤包括:
如果匹配到Rust程序缺陷,则通过不安全操作左括号的出现位置,将左括号压入栈中,并找出匹配的右括号,通过左右括号的位置差,提取不安全操作的具体内容;
如果没有匹配到Rust程序缺陷,则扫描下一个字符流文件,直至系统全部检测结束。
本发明的另一方面涉及一种基于特征提取的Rust程序缺陷自动检测系统,包括:
静态分析不安全Rust模块,用于首先分析Rust中有限类不安全Rust的主要使用场景,静态分析不安全代码本质不安全原因,最后构成每类不安全操作数据集,作为特征提取的输入;
不安全Rust特征提取模块,用于通过对不安全Rust不安全具体原因、来源和使用场景进行分析,构建包含每类不安全操作的缺陷数据集;对缺陷数据集中的不安全操作的词法规则进行分析,获取每类不安全Rust操作的关键字、函数名和运算符信息;
自动化检测与优化设计模块,用于根据有限类不安全Rust的特征,设计基于特征识别的缺陷检测;将操作系统的源代码作为算法的输入,使用正则表达式来分类、标记和提取每一种不安全操作,输出包含具体缺陷信息的缺陷报告。
进一步地,不安全Rust的不安全操作类型包括五类操作,分别为解引用裸指针、调用不安全函数或方法、实现不安全特征、访问或修改可变静态变量和访问联合字段,静态分析不安全Rust模块包括:
解引用裸指针单元,用于调用as_mut_ptr( )方法,创建裸指针;
调用不安全函数或方法单元,用于只对裸指针进行解引用时才使用不安全关键字进行标记;
实现不安全特征单元,用于在关键字impl前加上不安全标记;
访问或修改可变静态变量单元,用于对可变静态变量进行访问时,使用不安全块进行包裹;
访问联合字段单元,用于访问或修改联合字段。
进一步地,不安全Rust特征提取模块包括:
包裹单元,用于对于五类不安全Rust操作都需要使用不安全关键字进行包裹;
创建单元,用于对于解引用裸指针,使用*const T、*mut T或者封装好的方法来创建裸指针,且创建裸指针是安全操作;
第一处理单元,用于对于不安全函数,使用特征为:Unsafe fn Name{ },或者调用使用extern函数调用外部代码;
第二处理单元,用于对于不安全特征,使用特征为:Unsafe trait Name{ },或者Unsafe impl Name for T{ };
第三处理单元,用于对于联合而言,定义联合类型是安全的,不安全特征是对联合字段的访问。
进一步地,自动化检测与优化设计包括:
设计单元,用于根据有限类不安全Rust的特征,设计基于特征识别的缺陷检测;
匹配单元,用于扫描并读取系统所有字符流文件,根据标记的每类缺陷特征进行正则匹配;
检测单元,用于检测结束生成日志,日志包含每一类缺陷的具体信息。
进一步地,匹配单元包括:
第一匹配子单元,用于如果匹配到Rust程序缺陷,则通过不安全操作左括号的出现位置,将左括号压入栈中,并找出匹配的右括号,通过左右括号的位置差,提取不安全操作的具体内容;
第二匹配子单元,用于如果没有匹配到Rust程序缺陷,则扫描下一个字符流文件,直至系统全部检测结束。
本发明所取得的有益效果为:
本发明提供一种基于特征提取的Rust程序缺陷自动检测方法及系统,通过静态分析不安全Rust:首先分析Rust中有限类不安全Rust的主要使用场景,静态分析不安全代码本质不安全原因,最后构成每类不安全操作数据集,作为特征提取的输入;不安全Rust特征提取:通过对不安全Rust不安全具体原因、来源和使用场景进行分析,构建包含每类不安全操作的缺陷数据集;对缺陷数据集中的不安全操作的词法规则进行分析,获取每类不安全Rust操作的关键字、函数名和运算符信息;自动化检测与优化设计:根据有限类不安全Rust的特征,设计基于特征识别的缺陷检测;将操作系统的源代码作为算法的输入,使用正则表达式来分类、标记和提取每一种不安全操作,输出包含具体缺陷信息的缺陷报告。本发明提供的基于特征提取的Rust程序缺陷自动检测方法及系统,实现有限类特征提取的机制,有效的降低缺陷检测漏报和误报的概率,提升了检测精度;实现了自动化的缺陷检测,有效的降低假阳性和假阴性的概率,并且自动化技术有效的提高了缺陷检测的效率;将缺陷检测结果形成日志,为未来缺陷优化提供指导,从而为设计更加安全的操作系统提供可能性。
附图说明
图1为本发明提供的特征提取的Rust程序缺陷自动检测方法一实施例的方法示意图;
图2为本发明基于特征识别的缺陷检测的算法示意图;
图3为图1中所示的静态分析不安全Rust的实施例的细化流程示意图;
图4为本发明活动4级面表的引用的程序示意图;
图5为本发明全局特征实现堆分配器的程序示意图;
图6为本发明访问修改可变静态变量的程序示意图;
图7为本发明按字段访问联合的程序示意图;
图8为图1中所示的不安全Rust特征提取的实施例的细化流程示意图;
图9为图1中所示的自动化检测与优化设计的实施例的细化流程示意图;
图10为图4中所示的扫描并读取系统所有字符流文件,根据标记的每类缺陷特征进行正则匹配的实施例的细化流程示意图;
图11为本发明提供的基于特征提取的Rust程序缺陷自动检测系统一实施例的功能框图;
图12为图11中所示的静态分析不安全Rust模块一实施例的功能模块示意图;
图13为图11中所示的不安全Rust特征提取模块一实施例的功能模块示意图;
图14为图11中所示的自动化检测与优化设计模块一实施例的功能模块示意图;
图15为图14中所示的匹配单元一实施例的功能子模块示意图。
附图标号说明:
10、静态分析不安全Rust模块;20、不安全Rust特征提取模块;30、自动化检测与优化设计模块;11、解引用裸指针单元;12、调用不安全函数或方法单元;13、实现不安全特征单元;14、访问或修改可变静态变量单元;15、访问联合字段单元;21、包裹单元;22、创建单元;23、第一处理单元;24、第二处理单元;25、第三处理单元;31、设计单元;32、匹配单元;33、检测单元;321、第一匹配子单元;322、第二匹配子单元。
具体实施方式
为了更好的理解上述技术方案,下面将结合说明书附图以及具体的实施方式对上述技术方案做详细的说明。
如图1和图2所示,本发明提供的基于特征提取的Rust程序缺陷自动检测方法及系统,要解决的技术问题:构建一个准确、高效、低漏报和误报的缺陷检测方法,并使其适用于Rust操作系统的缺陷检测过程,为提高操作系统的安全性提供有效的支持。
本发明的详细方案如下:
本发明将Rust操作系统视为由安全Rust代码和不安全Rust代码组成的。Rust的实证研究表明,安全Rust编写的程序可以完全避免内存错误,不安全Rust的使用是导致系统漏洞的主要原因。此外,不安全Rust的不安全操作类型是有限的,只包含五类操作:(1)解引用裸指针;(2)调用不安全函数或方法;(3)访问或修改可变静态变量;(4)实现不安全特征;(5)访问联合字段。因此,Rust操作系统缺陷视为对有限类不安全Rust进行检测。本发明通过静态分析不安全Rust五类缺陷代码,提取缺陷特征,依据获取每类不安全操作的特征信息设计自动化缺陷检测方法。
请见图1,图1为本发明提供的特征提取的Rust程序缺陷自动检测方法一实施例的方法示意图,在本实施例中,基于特征提取的Rust程序缺陷自动检测方法包括以下步骤:
步骤S100、静态分析不安全Rust:首先分析Rust中有限类不安全Rust的主要使用场景,静态分析不安全代码本质不安全原因,最后构成每类不安全操作数据集,作为特征提取的输入。
首先分析Rust中不安全Rust主要使用的场景,静态分析不安全代码本质不安全原因,最后构成每类不安全操作数据集,作为特征提取的输入。不安全Rust的主要使用场景分为5类场景:解引用裸指针、调用不安全函数或方法、实现不安全特征、访问或修改可变静态变量和访问联合字段。
步骤S200、不安全Rust特征提取:通过对不安全Rust不安全具体原因、来源和使用场景进行分析,构建包含每类不安全操作的缺陷数据集;对缺陷数据集中的不安全操作的词法规则进行分析,获取每类不安全Rust操作的关键字、函数名和运算符信息。
通过对不安全Rust不安全具体原因、来源和使用场景的分析,构建了包含每类不安全操作的缺陷数据集。本实施例针对数据集中的不安全操作的词法规则进行分析,获取每类不安全Rust 操作的关键字、函数名、运算符等信息。
步骤S300、自动化检测与优化设计:根据有限类不安全Rust的特征,设计基于特征识别的缺陷检测;将操作系统的源代码作为算法的输入,使用正则表达式来分类、标记和提取每一种不安全操作,输出包含具体缺陷信息的缺陷报告。
根据有限类不安全Rust的特征,设计基于特征识别的缺陷检测,如图2所示。操作系统的源代码作为算法的输入,使用正则表达式来分类、标记和提取每一种不安全操作,输出是一份包含具体缺陷信息(如不安全类型、不安全代码、不安全统计等)的报告。
进一步地,请见图3,图3为图1中所示的步骤S100一实施例的细化流程示意图,在本实施例中,步骤S100包括:
步骤S110、解引用裸指针:只对裸指针进行解引用时才使用不安全关键字进行标记。
与引用和智能指针不同,裸指针并不受Rust安全规则限制,具有以下特点:不保证指向合法内存,比如可以是空指针;不能像智能指针那样自动清理内存,而要类似C语言手动管理内存;没有生命周期的概念,即编译器不会对其提供借用检查。所以,编译器无法对解引用裸指针的操作提供安全保证,需要依赖开发人员。如图4所示,调用as_mut_ptr( )方法创建裸指针是合法安全的,只有对裸指针进行操作时才需要单独的安全性保证。
步骤S120、调用不安全函数或方法:将调用不安全的函数或方法放到不安全代码块中。
调用不安全函数或方法是不安全代码的主要表示形式。调用不安全的函数或方法必须放到不安全代码块中,因为函数本身被标记为不安全,也就意味着调用它可能存在风险。
在内存实现时,对活动4级页面表的引用实现时,如图4所示。系统实现时常将Unsafe fn整个函数体都视作一个大的不安全块,这样使代码更加危险,可能在不注意的情况下意外引入了不安全的操作,也使发现不安全操作变得更加困难。
步骤S130、实现不安全特征:在关键字impl前加上不安全标记。
当特征中包含一个或多个编译器无法验证其安全性的方法时,特征就必须被标记为不安全类型。要实现不安全特征中的方法,首先在关键字impl前也要加上不安全标记。代码块无法被编译器验证安全性的方法,其安全性必须由开发者自己来保证。
实现不安全特征常在基于Rust实现操作系统的内存管理中使用。如图5所示,使用全局特征实现堆分配器时,由于GlobalAlloc被为声明不安全,所以基于其实现的方法也是不安全的。编译器不能自动检查,需要程序员保障分配器类型的特征实现是正确的,如alloc方法绝不能返回已在其他地方使用的内存块,否则可能导致未定义的行为。
步骤S140、访问或修改可变静态变量:对可变静态变量进行访问时,使用不安全块进行包裹。
对于不可变的静态变量,访问它不会存在任何安全问题,但是对于可变的静态变量而言,如果在多线程中访问同一个变量,就会造成数据竞争,数据安全性无法得到保障。如图6所示,对可变静态变量进行访问时,需要使用不安全块进行包裹。
步骤S150、访问联合字段:访问或修改联合字段。
如图7所示,按字段访问联合,字段联合体在初始化时,每次只能指定一个字段的值,造成在访问联合中的字段时,有可能会访问到未定义的字段。由于可以使用错误的变体解释联合中保存的数据,并且Rust无法进行检查,所以读取或写入联合字段是不安全的。
优选地,参见图8,图8为图1中所示的步骤S200一实施例的细化流程示意图,在本实施例中,步骤S200包括:
步骤S210、对于五类不安全Rust操作都需要使用不安全关键字进行包裹。
对于不安全Rust操作中的解引用裸指针、调用不安全函数或方法、实现不安全特征、访问或修改可变静态变量和访问联合字段都需要使用不安全关键字进行包裹。
步骤S220、对于解引用裸指针,使用*const T、*mut T或者封装好的方法来创建裸指针,且创建裸指针是安全操作。
对于解引用裸指针,可以使用*const T、*mut T或者封装好的方法来创建裸指针,且创建裸指针是安全操作,只有对裸指针进行解引用才会可能引发缺陷。该不安全操作特征为:&(mut) var as *const T/*mut T。
步骤S230、对于不安全函数,使用特征为:Unsafe fn Name{ },或者调用使用extern函数调用外部代码。
步骤S240、对于不安全特征,使用特征为:Unsafe trait Name{ },或者Unsafeimpl Name for T{ }。
步骤S250、对于联合而言,定义联合类型是安全的,不安全特征是对联合字段的访问。
根据数据集和不安全的词法规则进行提取,得到每类不安全Rust缺陷特征信息,如表1所示。
表1:Rust unsafe特征提取表
进一步地,参见图9,图9为图1中所示的步骤S300一实施例的细化流程示意图,在本实施例中,步骤S300包括:
步骤S310、根据有限类不安全Rust的特征,设计基于特征识别的缺陷检测。
步骤S320、扫描并读取系统所有字符流文件,根据标记的每类缺陷特征进行正则匹配。
扫描并读取系统所有字符流文件,根据标记的每类缺陷特征(关键字、函数名和运算符等)进行正则匹配。
步骤S330、检测结束生成日志,日志包含每一类缺陷的具体信息。
检测结束生成日志,其中,日志包含了每一类缺陷的具体信息(类型、代码、出现次数等)。
进一步地,请见图10,图10为图9中所示的步骤S320一实施例的细化流程示意图,在本实施例中,步骤S320包括:
步骤S321、如果匹配到Rust程序缺陷,则通过不安全操作左括号的出现位置,将左括号压入栈中,并找出匹配的右括号,通过左右括号的位置差,提取不安全操作的具体内容。
如果匹配到,通过不安全关键字操作左括号的出现位置压入栈中,找出匹配的右括号,通过左右括号的位置差,提取不安全操作的具体内容。此外还需要记录每类缺陷出现次数、字符数等信息。
步骤S322、如果没有匹配到Rust程序缺陷,则扫描下一个字符流文件,直至系统全部检测结束。
如果没有匹配到,则扫描下一个字符流文件,直至系统全部检测结束。
本实施例提供的基于特征提取的Rust程序缺陷自动检测方法,同现有技术相比,通过静态分析不安全Rust:首先分析Rust中有限类不安全Rust的主要使用场景,静态分析不安全代码本质不安全原因,最后构成每类不安全操作数据集,作为特征提取的输入;不安全Rust特征提取:通过对不安全Rust不安全具体原因、来源和使用场景进行分析,构建包含每类不安全操作的缺陷数据集;对缺陷数据集中的不安全操作的词法规则进行分析,获取每类不安全Rust操作的关键字、函数名和运算符信息;自动化检测与优化设计:根据有限类不安全Rust的特征,设计基于特征识别的缺陷检测;将操作系统的源代码作为算法的输入,使用正则表达式来分类、标记和提取每一种不安全操作,输出包含具体缺陷信息的缺陷报告。本实施例提供的基于特征提取的Rust程序缺陷自动检测方法,实现有限类特征提取的机制,有效的降低缺陷检测漏报和误报的概率,提升了检测精度;实现了自动化的缺陷检测,有效的降低假阳性和假阴性的概率,并且自动化技术有效的提高了缺陷检测的效率;将缺陷检测结果形成日志,为未来缺陷优化提供指导,从而为设计更加安全的操作系统提供可能性。
如图11所示,图11为本发明提供的基于特征提取的Rust程序缺陷自动检测系统一实施例的功能框图,在本实施例中,基于特征提取的Rust程序缺陷自动检测系统包括静态分析不安全Rust模块10、不安全Rust特征提取模块20和自动化检测与优化设计模块30,其中,静态分析不安全Rust模块10,用于首先分析Rust中有限类不安全Rust的主要使用场景,静态分析不安全代码本质不安全原因,最后构成每类不安全操作数据集,作为特征提取的输入;不安全Rust特征提取模块20,用于通过对不安全Rust不安全具体原因、来源和使用场景进行分析,构建包含每类不安全操作的缺陷数据集;对缺陷数据集中的不安全操作的词法规则进行分析,获取每类不安全Rust操作的关键字、函数名和运算符信息;自动化检测与优化设计模块30,用于根据有限类不安全Rust的特征,设计基于特征识别的缺陷检测;将操作系统的源代码作为算法的输入,使用正则表达式来分类、标记和提取每一种不安全操作,输出包含具体缺陷信息的缺陷报告。
静态分析不安全Rust模块10首先分析Rust中不安全Rust主要使用的场景,静态分析不安全代码本质不安全原因,最后构成每类不安全操作数据集,作为特征提取的输入。不安全Rust的主要使用场景分为5类场景:解引用裸指针、调用不安全函数或方法、实现不安全特征、访问或修改可变静态变量和访问联合字段。
不安全Rust特征提取模块20通过对不安全Rust不安全具体原因、来源和使用场景的分析,构建了包含每类不安全操作的缺陷数据集。本实施例针对数据集中的不安全操作的词法规则进行分析,获取每类不安全Rust 操作的关键字、函数名、运算符等信息。
自动化检测与优化设计模块30根据有限类不安全Rust的特征,设计基于特征识别的缺陷检测,如图2所示。操作系统的源代码作为算法的输入,使用正则表达式来分类、标记和提取每一种不安全操作,输出是一份包含具体缺陷信息(如不安全类型、不安全代码、不安全统计等)的报告。
进一步地,请见图12,图12为图11中所示的静态分析不安全Rust模块一实施例的功能模块示意图,在本实施例中,静态分析不安全Rust模块10包括解引用裸指针单元11、调用不安全函数或方法单元12和实现不安全特征单元13,其中,解引用裸指针单元11,用于调用as_mut_ptr( )方法,创建裸指针;调用不安全函数或方法单元12,用于将调用不安全的函数或方法放到不安全代码块中;实现不安全特征单元13,用于在关键字impl前加上不安全标记;访问或修改可变静态变量单元14,用于对可变静态变量进行访问时,使用不安全块进行包裹;访问联合字段单元15,用于访问或修改联合字段。
与引用和智能指针不同,裸指针并不受Rust安全规则限制,具有以下特点:不保证指向合法内存,比如可以是空指针;不能像智能指针那样自动清理内存,而要类似C语言手动管理内存;没有生命周期的概念,即编译器不会对其提供借用检查。所以,编译器无法对解引用裸指针的操作提供安全保证,需要依赖开发人员。如图4中所示,解引用裸指针单元11调用as_mut_ptr( )方法创建裸指针是合法安全的,只有对裸指针进行操作时才需要单独的安全性保证。
调用不安全函数或方法是不安全代码的主要表示形式。调用不安全函数或方法单元12调用不安全的函数或方法必须放到不安全代码块中,因为函数本身被标记为不安全,也就意味着调用它可能存在风险。
在内存实现时,对活动4级页面表的引用实现时,如图4所示。系统实现时常将Unsafe fn整个函数体都视作一个大的不安全块,这样使代码更加危险,可能在不注意的情况下意外引入了不安全的操作,也使发现不安全操作变得更加困难。
当特征中包含一个或多个编译器无法验证其安全性的方法时,特征就必须被标记为不安全类型。要实现不安全特征中的方法,实现不安全特征单元13首先在关键字impl前也要加上不安全标记。代码块无法被编译器验证安全性的方法,其安全性必须由开发者自己来保证。
实现不安全特征常在基于Rust实现操作系统的内存管理中使用。如图5所示,使用全局特征实现堆分配器时,由于GlobalAlloc被为声明不安全,所以基于其实现的方法也是不安全的。编译器不能自动检查,需要程序员保障分配器类型的特征实现是正确的,如alloc方法绝不能返回已在其他地方使用的内存块,否则可能导致未定义的行为。
对于不可变的静态变量,访问它不会存在任何安全问题,但是对于可变的静态变量而言,如果在多线程中访问同一个变量,就会造成数据竞争,数据安全性无法得到保障。如图6所示,访问或修改可变静态变量单元14对可变静态变量进行访问时,需要使用不安全块进行包裹。
如图7所示,访问联合字段单元15访问或修改联合字段。联合体在初始化时,每次只能指定一个字段的值,造成在访问联合中的字段时,有可能会访问到未定义的字段。由于可以使用错误的变体解释联合中保存的数据,并且Rust无法进行检查,所以读取或写入联合字段是不安全的。
优选地,参见图13,图13为图11中所示的不安全Rust特征提取模块一实施例的功能模块示意图,在本实施例中,不安全Rust特征提取模块20包括包裹单元21、创建单元22、第一处理单元23、第二处理单元24和第三处理单元25,其中,包裹单元21,用于对于五类不安全Rust操作都需要使用不安全关键字进行包裹;创建单元22,用于对于解引用裸指针,使用*const T、*mut T或者封装好的方法来创建裸指针,且创建裸指针是安全操作;第一处理单元23,用于对于不安全函数,使用特征为:Unsafe fn Name{ },或者调用使用extern函数调用外部代码;第二处理单元24,用于对于不安全特征,使用特征为:Unsafe trait Name{ },或者Unsafe impl Name for T{ };第三处理单元25,用于对于联合而言,定义联合类型是安全的,不安全特征是对联合字段的访问。
包裹单元21对于五类不安全Rust操作都需要使用不安全关键字进行包裹。
创建单元22对于解引用裸指针,可以使用*const T、*mut T或者封装好的方法来创建裸指针,且创建裸指针是安全操作,只有对裸指针进行解引用才会可能引发缺陷。该不安全操作特征为:&(mut) var as *const T/*mut T。
第一处理单元23对于不安全函数,特征为:Unsafe fn Name{ },或者调用使用extern函数调用外部代码。
第二处理单元24对于不安全特征,特征为:Unsafe trait Name{ },或者 Unsafeimpl Name for T{ }。
第三处理单元25对于联合而言,使用联合类型是安全,不安全特征是对联合字段的访问。
根据数据集和不安全的词法规则进行提取,得到每类不安全Rust缺陷特征信息,如表1所示。
进一步地,请见图14,图14为图11中所示的自动化检测与优化设计一实施例的功能模块示意图,在本实施例中,自动化检测与优化设计模块30包括设计单元31、匹配单元32和检测单元33,其中,设计单元31,用于根据有限类不安全Rust的特征,设计基于特征识别的缺陷检测;匹配单元32,用于扫描并读取系统所有字符流文件,根据标记的每类缺陷特征进行正则匹配;检测单元33,用于检测结束生成日志,日志包含每一类缺陷的具体信息。
设计单元31根据有限类不安全Rust的特征,设计基于特征识别的缺陷检测。
匹配单元32扫描并读取系统所有字符流文件,根据标记的每类缺陷特征(关键字、函数名和运算符等)进行正则匹配。
检测单元33检测结束生成日志,其包含了每一类缺陷的具体信息(类型、代码、出现次数等)。
进一步地,请见图15,图15为图14中所示的匹配单元一实施例的功能子模块示意图,在本实施例中,匹配单元32包括第一匹配子单元321和第二匹配子单元322,其中,第一匹配子单元321,用于如果匹配到Rust程序缺陷,则通过不安全操作左括号的出现位置,将左括号压入栈中,并找出匹配的右括号,通过左右括号的位置差,提取不安全操作的具体内容;第二匹配子单元322,用于如果没有匹配到Rust程序缺陷,则扫描下一个字符流文件,直至系统全部检测结束。
第一匹配子单元321如果匹配到,通过关键字`unsafe`操作左括号的出现位置压入栈中,找出匹配的右括号,通过左右括号的位置差,提取不安全操作的具体内容。此外还需要记录每类缺陷出现次数、字符数等信息。
第二匹配子单元322如果没有匹配到,则扫描下一个字符流文件,直至系统全部检测结束。
本实施例提供的基于特征提取的Rust程序缺陷自动检测系统,同现有技术相比,采用静态分析不安全Rust模块10、不安全Rust特征提取模块20和自动化检测与优化设计模块30,通过静态分析不安全Rust:首先分析Rust中有限类不安全Rust的主要使用场景,静态分析不安全代码本质不安全原因,最后构成每类不安全操作数据集,作为特征提取的输入;不安全Rust特征提取:通过对不安全Rust不安全具体原因、来源和使用场景进行分析,构建包含每类不安全操作的缺陷数据集;对缺陷数据集中的不安全操作的词法规则进行分析,获取每类不安全Rust操作的关键字、函数名和运算符信息;自动化检测与优化设计:根据有限类不安全Rust的特征,设计基于特征识别的缺陷检测;将操作系统的源代码作为算法的输入,使用正则表达式来分类、标记和提取每一种不安全操作,输出包含具体缺陷信息的缺陷报告。本实施例提供的基于特征提取的Rust程序缺陷自动检测方法,实现有限类特征提取的机制,有效的降低缺陷检测漏报和误报的概率,提升了检测精度;实现了自动化的缺陷检测,有效的降低假阳性和假阴性的概率,并且自动化技术有效的提高了缺陷检测的效率;将缺陷检测结果形成日志,为未来缺陷优化提供指导,从而为设计更加安全的操作系统提供可能性。
本实施例提供的基于特征提取的Rust程序缺陷自动检测方法及系统,下面以具体实施例来进行说明:
选择4个使用Rust编写的开源操作系统,分别为Redox,KatoOS、Theseus、BlogOS和标准库中常用内存分配API alloc.rs作为实施例,使用本实施例提供的基于特征提取的Rust程序缺陷自动检测方法及系统进行缺陷检测。
首先对本发明选取的Rust项目进行简要说明:
Redox:类Unix微内核操作系统,旨在保证功能全面同时使用Rust提升系统安全。
Theseus:利用Rust语言将更多操作系统职责转移给编译器,提升系统本身性能。
KataOS:采用几乎全Rust语言编写保障系统安全,而且建立在seL4微内核基础上(seL4在被证明是安全的,具有保密性、完整性和可用性),两者结合更好的保障操作系统的安全。
BlogOS:用于Rust操作系统教学演示,目前只具有异常中断处理和内存管理的功能。
这四类操作系统基于Rust语言进行设计,使用Rust语言安全特性来保证系统的安全。然而,为了保证系统功能的完整性,在设计的时候都使用到不安全Rust代码,并且没有为不安全代码提供安全保障,仅使用`unsafe`关键字来隔离不安全和安全代码片段。为了更好的提升基于Rust语言所设计的系统、库函数等的安全性,利用本实施例提供的基于特征提取的Rust程序缺陷自动检测方法进行检验,以发现可能存在的缺陷代码。形成的缺陷检测日志,为缺陷优化提供指导。
将实施例中系统和库放入利用本实施例提供的基于特征提取的Rust程序缺陷自动检测系统,依据得到的缺陷日志,统计得到每种类型的不安全操作比例如表2所示。
表2:Rust unsafe特征提取表
由表2可以得到,在不安全操作使用过程中,使用最多的操作是定义不安全函数,其次是解引用裸指针的操作,联合字段的访问是最少的,甚至在一些简单的操作系统中没有使用联合类型。并且无论是在操作系统还是库函数的设计时,不安全Rust代码的使用无可避免,即使是在一个很小的标准库也存在大量的不安全代码。因此,也印证了本发明基于特征提取的Rust程序缺陷检测机制及自动化检测方法设计的必要性。
总的来说,本实施例所设计的基于特征提取的Rust程序缺陷自动检测方法,相对于已有的缺陷检测方案来说,有限类和自动化缺陷检测带来的优势包括:
实现有限类特征提取的机制,有效的降低缺陷检测漏报和误报的概率,提升了检测精度。
实现了自动化的缺陷检测,有效的降低假阳性和假阴性的概率,并且自动化技术有效的提高了缺陷检测的效率。
本实施例缺陷检测结果形成日志,为未来缺陷优化提供指导,从而为设计更加安全的操作系统提供可能性。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。

Claims (4)

1.一种基于特征提取的Rust程序缺陷自动检测方法,其特征在于,包括以下步骤:
静态分析不安全Rust:首先分析Rust中有限类不安全Rust的主要使用场景,静态分析不安全代码本质不安全原因,最后构成每类不安全操作数据集,作为特征提取的输入;
不安全Rust特征提取:通过对不安全Rust不安全具体原因、来源和使用场景进行分析,构建包含每类不安全操作的缺陷数据集;对所述缺陷数据集中的不安全操作的词法规则进行分析,获取每类不安全Rust操作的关键字、函数名和运算符信息;
自动化检测与优化设计:根据有限类不安全Rust的特征,设计基于特征识别的缺陷检测;将操作系统的源代码作为算法的输入,使用正则表达式来分类、标记和提取每一种不安全操作,输出包含具体缺陷信息的缺陷报告;
所述不安全Rust特征提取的步骤包括:
对于五类不安全Rust操作都需要使用不安全关键字进行包裹;
对于解引用裸指针,使用*const T、*mut T或者封装好的方法来创建裸指针,且创建裸指针是安全操作,只有对裸指针的解引用才是不安全操作;
对于不安全函数,使用特征为:Unsafe fn Name{ },或者调用使用extern函数调用外部代码;
对于不安全特征,使用特征为:Unsafe trait Name{ },或者Unsafe impl Name for T{ };
对于联合而言,定义联合类型是安全的,不安全特征是对联合字段的访问;
所述自动化检测与优化设计的步骤包括:
根据有限类不安全Rust的特征,设计基于特征识别的缺陷检测;
扫描并读取系统所有字符流文件,根据标记的每类缺陷特征进行正则匹配;
检测结束生成日志,所述日志包含每一类缺陷的具体信息;
所述扫描并读取系统所有字符流文件,根据标记的每类缺陷特征进行正则匹配的步骤包括:
如果匹配到Rust程序缺陷,则通过不安全操作左括号的出现位置,将左括号压入栈中,并找出匹配的右括号,通过左右括号的位置差,提取不安全操作的具体内容;
如果没有匹配到Rust程序缺陷,则扫描下一个字符流文件,直至系统全部检测结束;
所述对于联合而言,定义联合类型是安全的,不安全特征是对联合字段的访问的步骤包括:
根据数据集和不安全的词法规则进行提取,得到每类不安全Rust缺陷特征信息。
2.如权利要求1所述的基于特征提取的Rust程序缺陷自动检测方法,其特征在于,所述不安全Rust的不安全操作类型包括五类操作,分别为解引用裸指针、调用不安全函数或方法、实现不安全特征、访问或修改可变静态变量和访问联合字段,所述静态分析不安全Rust的步骤包括:
解引用裸指针:只对裸指针进行解引用时才使用不安全关键字进行标记;
调用不安全函数或方法:将调用不安全的函数或方法放到不安全代码块中;
实现不安全特征:在关键字impl前加上不安全标记;
访问或修改可变静态变量:对可变静态变量进行访问时,使用不安全块进行包裹;
访问联合字段:访问或修改联合字段。
3.一种基于特征提取的Rust程序缺陷自动检测系统,其特征在于,包括:
静态分析不安全Rust模块(10),用于首先分析Rust中有限类不安全Rust的主要使用场景,静态分析不安全代码本质不安全原因,最后构成每类不安全操作数据集,作为特征提取的输入;
不安全Rust特征提取模块(20),用于通过对不安全Rust不安全具体原因、来源和使用场景进行分析,构建包含每类不安全操作的缺陷数据集;对所述缺陷数据集中的不安全操作的词法规则进行分析,获取每类不安全Rust操作的关键字、函数名和运算符信息;
自动化检测与优化设计模块(30),用于根据有限类不安全Rust的特征,设计基于特征识别的缺陷检测;将操作系统的源代码作为算法的输入,使用正则表达式来分类、标记和提取每一种不安全操作,输出包含具体缺陷信息的缺陷报告;
所述不安全Rust特征提取模块(20)包括:
包裹单元(21),用于对于五类不安全Rust操作都需要使用不安全关键字进行包裹;
创建单元(22),用于对于解引用裸指针,使用*const T、*mut T或者封装好的方法来创建裸指针,且创建裸指针是安全操作;
第一处理单元(23),用于对于不安全函数,使用特征为:Unsafe fn Name{ },或者调用使用extern函数调用外部代码;
第二处理单元(24),用于对于不安全特征,使用特征为:Unsafe trait Name{ },或者Unsafe impl Name for T{ };
第三处理单元(25),用于对于联合而言,定义联合类型是安全的,不安全特征是对联合字段的访问;
所述自动化检测与优化设计模块(30)包括:
设计单元(31),用于根据有限类不安全Rust的特征,设计基于特征识别的缺陷检测;
匹配单元(32),用于扫描并读取系统所有字符流文件,根据标记的每类缺陷特征进行正则匹配;
检测单元(33),用于检测结束生成日志,所述日志包含每一类缺陷的具体信息;
所述匹配单元(32)包括:
第一匹配子单元(321),用于如果匹配到Rust程序缺陷,则通过unsafe操作左括号的出现位置,将左括号压入栈中,并找出匹配的右括号,通过左右括号的位置差,提取不安全操作的具体内容;
第二匹配子单元(322),用于如果没有匹配到Rust程序缺陷,则扫描下一个字符流文件,直至系统全部检测结束;
所述第三处理单元(25),具体用于根据数据集和不安全的词法规则进行提取,得到每类不安全Rust缺陷特征信息。
4.如权利要求3所述的基于特征提取的Rust程序缺陷自动检测系统,其特征在于,所述不安全Rust的不安全操作类型包括五类操作,分别为解引用裸指针、调用不安全函数或方法、实现不安全特、访问或修改可变静态变量和访问联合字段,所述静态分析不安全Rust模块(10)包括:
解引用裸指针单元(11),用于只对裸指针进行解引用时才使用不安全关键字进行标记;
调用不安全函数或方法单元(12),用于将调用不安全的函数或方法放到不安全代码块中;
实现不安全特征单元(13),用于在关键字impl前加上不安全标记;
访问或修改可变静态变量单元(14),用于对可变静态变量进行访问时,使用不安全块进行包裹;
访问联合字段单元(15),用于访问或修改联合字段。
CN202310947118.4A 2023-07-31 2023-07-31 基于特征提取的Rust程序缺陷自动检测方法及系统 Active CN116680705B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310947118.4A CN116680705B (zh) 2023-07-31 2023-07-31 基于特征提取的Rust程序缺陷自动检测方法及系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310947118.4A CN116680705B (zh) 2023-07-31 2023-07-31 基于特征提取的Rust程序缺陷自动检测方法及系统

Publications (2)

Publication Number Publication Date
CN116680705A CN116680705A (zh) 2023-09-01
CN116680705B true CN116680705B (zh) 2023-12-12

Family

ID=87781362

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310947118.4A Active CN116680705B (zh) 2023-07-31 2023-07-31 基于特征提取的Rust程序缺陷自动检测方法及系统

Country Status (1)

Country Link
CN (1) CN116680705B (zh)

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111966578A (zh) * 2020-07-12 2020-11-20 复旦大学 一种安卓兼容性缺陷修复效果的自动化评估方法
CN116089302A (zh) * 2023-02-21 2023-05-09 东北大学 一种针对Rust编程语言中UNSAFE代码片段缺陷的检测方法
CN116305163A (zh) * 2023-04-03 2023-06-23 浙江大学 一种面向Rust语言的漏洞自动化定位及分析方法
CN116484439A (zh) * 2023-06-25 2023-07-25 中国人民解放军国防科技大学 基于Rust语言的安全性增强模型开发方法及系统

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7756802B2 (en) * 2007-05-29 2010-07-13 Microsoft Corporation Combiner training and evaluation with random data partition
KR101051600B1 (ko) * 2010-03-29 2011-07-22 주식회사 소프트 포 소프트 아밥 소스코드의 코드 검사를 수행하는 코드검사 수행시스템

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111966578A (zh) * 2020-07-12 2020-11-20 复旦大学 一种安卓兼容性缺陷修复效果的自动化评估方法
CN116089302A (zh) * 2023-02-21 2023-05-09 东北大学 一种针对Rust编程语言中UNSAFE代码片段缺陷的检测方法
CN116305163A (zh) * 2023-04-03 2023-06-23 浙江大学 一种面向Rust语言的漏洞自动化定位及分析方法
CN116484439A (zh) * 2023-06-25 2023-07-25 中国人民解放军国防科技大学 基于Rust语言的安全性增强模型开发方法及系统

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
基于机器学习的软件漏洞挖掘方法综述;李韵;《软件学报》;第2040-2055页 *
李韵.基于机器学习的软件漏洞挖掘方法综述.《软件学报》.2020,第2040-2055页. *

Also Published As

Publication number Publication date
CN116680705A (zh) 2023-09-01

Similar Documents

Publication Publication Date Title
Liskov et al. Programming with abstract data types
US8875110B2 (en) Code inspection executing system for performing a code inspection of ABAP source codes
US9122540B2 (en) Transformation of computer programs and eliminating errors
EP0612018B1 (en) Apparatus and method for syntactic signal analysis
US8589888B2 (en) Demand-driven analysis of pointers for software program analysis and debugging
CN110688307B (zh) JavaScript代码检测方法、装置、设备和存储介质
CN103257919B (zh) 脚本程序检查方法和装置
CN110457302A (zh) 一种结构化数据智能清洗方法
Bian et al. Detecting bugs by discovering expectations and their violations
KR101979329B1 (ko) 바이너리의 취약점을 유발하는 입력데이터 위치 추적 방법 및 그 장치
CN111177730A (zh) 一种以太坊智能合约问题检测和预防方法与装置
CN115269427A (zh) 针对web注入漏洞的中间语言表示方法及系统
CN112131120B (zh) 一种源代码缺陷检测方法及装置
CN116680705B (zh) 基于特征提取的Rust程序缺陷自动检测方法及系统
US20220198133A1 (en) System and method for validating tabular summary reports
CN111966578A (zh) 一种安卓兼容性缺陷修复效果的自动化评估方法
CN1129070C (zh) 程序设计中内存操作错误的识别方法
AU639551B2 (en) Method and apparatus for interpreting and organizing timing specification information
CN116541286A (zh) 一种基于插桩和符号执行的高覆盖率测试数据生成方法
CN113778852B (zh) 一种基于正则表达式的代码分析方法
CN114625633A (zh) 用于接口测试的方法、系统和存储介质
CN114895914A (zh) 日志输出代码的生成方法、装置、电子设备及存储介质
CN112783755B (zh) 一种基于自然语言理解函数原型发现内存破坏漏洞的方法
Spanò Information extraction by type analysis
Sintaha The role of dual slicing in automatic program repair

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