一种隐式类型转换安全性检测方法与流程

文档序号:18835563发布日期:2019-10-09 05:13阅读:470来源:国知局
一种隐式类型转换安全性检测方法与流程

本发明属于计算机技术领域,尤其指代一种基于llvm中间代码的c/c++隐式类型转换安全性检测方法。



背景技术:

偏向底层的高级编程语言如c、c++通常采用的是弱类型(静态类型)系统,即在声明变量时程序开发人员就必须确定变量的类型。在实际开发过程中,往往存在不同类型或类型相近的变量之间进行赋值、比较等操作,进行这些操作之前编译器会对两种不同类型的变量进行类型转换。

显式类型转换在c++中由cast操作符负责,在c语言中则是在赋值操作前加上特定的类型将该变量显式地指定为某一类型;隐式类型转换在c/c++中普遍存在,即在赋值、比较操作时没有显式地指定转换的类型,也没有使用cast操作符。

显式类型转换由于其特征明显,开发人员使用不当带来的安全风险往往可以在调试和测试时被发现,隐式类型转换相对显式类型转换而言,其安全隐患更难以在开发过程中被人为发现。从现有的类型转换安全性检测方法来看,如最早出现的检测方法caver针对的是c++中cast操作符的使用不当,typesan则是在caver的基础上进行性能和效率的优化,而hextype则是在typesan的基础上添加了内存问题的检测。综合来看,现有的检测方法并没有涉及到对更为普遍存在的隐式类型转换操作进行安全性检测。

同时,针对隐式类型转换的安全性问题,编译器在编译期间即便识别了某个类型转换属于隐式类型转换也不会对其转换合理性进行判断和提示。

在类的继承过程中,子类的成员变量重写了父类的成员变量,且子类成员变量占用的内存空间比父类成员变量占用的内存空间大,这种情况下会产生图1所示的越界读问题:

针对隐式类型转换不合理带来的安全问题却较为突出,考察近3年内谷歌、苹果、火狐浏览器和服务器脚本语言php的漏洞披露情况发现,这几个知名软件中均存在不少漏洞(cve-2016-3185、cve-2017-2415、cve-2017-5023等)是由于隐式类型转换问题产生的。



技术实现要素:

针对于上述现有技术的不足,本发明的目的在于提供一种隐式类型转换安全性检测方法,以解决现有技术中在llvm编译器编译c/c++程序源代码过程中,隐式类型转换不合理带来的安全问题,本发明方法达到在编程人员开发过程中规避隐式类型转换带来的安全隐患的目的。

为达到上述目的,本发明采用的技术方案如下:

本发明的一种隐式类型转换安全性检测方法,包括步骤如下:

1)对llvm中间代码进行分析,提取变量类型和作用域信息;

2)根据c/c++语言特性和隐式类型转换定义建立变量和作用域模型;

3)基于变量和作用域模型建立隐式类型转换安全性检测模型;

4)利用步骤3)中得到的检测模型对c/c++程序中间代码进行隐式类型转换的安全性检测,并给出安全性检测结果。

优选地,所述步骤1)中llvm中间代码由llvm编译器生成,输入被测程序源代码,指定编译选项后输出llvmbitcode格式的中间代码。

优选地,所述步骤1)中提取变量类型和作用域信息是由llvm提供的头文件完成的;其中,头文件derivedtypes.h中的类型获取方法被用来获取类型信息,头文件module.h中的getidentifiedstructtypes方法被用来获取结构类型信息;所述两个头文件获取的包括函数名、函数类型、变量名和变量类型以及函数和变量在中间代码中出现的位置信息。

优选地,所述步骤1)中的作用域信息是由提取到的位置信息进一步分析得到。

优选地,所述步骤1)还包括:判断变量和函数在出现的位置处是声明还是调用,以决定是否更新类型和作用域信息。

优选地,所述步骤2)中建立变量模型是在c/c++符号表基础上的简化和修改,修改内容包括以变量类型占用的内存空间大小为依据对所有提取到的变量进行分组;建立作用域模型是在提取所有变量和函数信息后,以函数为单位维护包含变量生命周期信息的所有变量及其类型。其中,建立变量模型是为了能够在编译阶段静态地确定变量类型和占用的内存空间,建立作用域模型是为了模拟运行时对变量生命周期维护的效果使得不会因为不同作用域下存在同名变量导致变量覆盖而分析出错。

优选地,所述步骤3)中的隐式类型转换安全性检测模型是根据当前被测程序中间代码存在的类型和作用域信息分析得出的一个针对当前被测程序的不安全的隐式类型转换操作集合,该模型是记录了被测程序中间代码从a类型转换到b类型的安全性一个二维数组;如果类型a到类型b的转换是不安全的,那么unsafeset[a][b]的值则为假(false),反之则为真(true)。

优选地,所述步骤4)中进行隐式类型转换安全性检测是以步骤3)中的隐式类型转换安全性检测模型为基础的,使用llvm的module接口,遍历被测程序中间代码的所有语句,进行隐式类型转换模式匹配;遍历过程中,如果发现隐式类型转换操作,则用隐式类型转换安全性检测模型进行检测,如果得出结果为假(false)则该语句中的隐式类型转换是不安全的,反之则被认为是安全的。

优选地,所述步骤4)中还包括:在必要时给予编程人员警示。

优选地,所述步骤4)中给予编程人员警示包含了带安全隐患的代码出现的位置和引发隐患的类型,引发安全隐患的类型有赋值操作和函数参数引用两种。

一种隐式类型转换安全性检测终端,包括:

一个或多个处理器;

存储器,用于存储一个或多个程序;

当所述一个或多个程序被所述一个或多个处理器执行时,使得所述一个或多个处理器实现上述的方法。

本发明的有益效果:

本发明的方法弥补了当前情况下针对隐式类型转换问题检测的空白,通过提取被测程序中间代码的类型和作用域信息,结合隐式类型转换安全性检测模型可以有效地在程序开发编译阶段检测出隐式类型转换中的安全隐患,达到安全开发的目的。

附图说明

图1为类继承过程中类型问题产生的内存越解读示意图。

图2为本发明进行隐式类型转换安全性检测的示意图。

具体实施方式

为了便于本领域技术人员的理解,下面结合实施例与附图对本发明作进一步的说明,实施方式提及的内容并非对本发明的限定。

参照图2所示,本发明的一种隐式类型转换安全性检测方法,包括步骤如下:

1、模块一

本模块主要是实现对llvmbitcode进行深度分析,提取类型和作用域信息,为模块二的操作提供基础。

具体地,提取类型和作用域信息首先将被测程序源代码输入llvm编译器处理后得到llvmbitcode,针对llvmbitcode,利用llvm头文件derivedtypes.h中的类型获取方法来获取类型信息,module.h中的getidentifiedstructtypes方法来获得必要的结构类型信息,包括函数名、函数变量、类型名、类型变量、变量(函数)所在位置。

具体地,建立变量模型指将提取到的变量和函数,以内存占用空间大小为单位分组(其中,函数的内存空间占用大小在这里以返回值类型的内存占用空间大小为准),在c/c++符号表的基础上修改和简化,得到一个能高效地为后续操作提供信息的模型。

具体地,建立作用域模型是对所有变量进行分组排序,分组以函数为单位,排序以变量出现的先后顺序为依据,建立以函数命名的作用域树。

2、模块二

本模块负责利用模块一中建立的变量和作用域模型以及本模块中实现的不安全的隐式类型转换操作集建立专门针对被测程序的隐式类型转换安全性检测模型;该模型结合被测程序变量在不同作用域下的不同场景,对被测程序中存在的所有隐式类型转换操作进行较为全面的安全性检测。

具体地,安全性检测模型由被测程序的变量和函数信息构成,由于变量模型已经对变量以其类型的内存空间占用大小为依据进行了分组,分析的复杂度得到了简化,再加上作用域模型中以函数为单位的作用域树,可以较好地优化分析效率。该模型本质上以被测程序的变量模型和作用域模型为依据,定义了一个用于记录类型与类型间转换安全性的二维数组,实现上,假设类型a转换为类型b,如果该转换是安全的则unsafeset[a][b]=true否则unsafeset[a][b]=false。

具体地,检测隐式类型转换安全性是利用了llvm中的module、function、codeblock等模块,遍历被测程序源代码中的每一条语句,通过预先设计的隐式类型转换规则来匹配出语句中包含的隐式类型转换操作,并利用安全性检测模型unsafeset来检测该隐式类型转换是否是安全的。

安全隐患告警则是发现隐式类型转换操作不安全时输出该操作的位置和引发安全隐患的隐式类型转换类型,引发安全隐患的隐式类型转换类型包括赋值和函数参数引用两种。

综上所述,本发明通过上述两个模块,在模块一中完成关键结构的提取与分析,在模块二中利用模块一提取分析的结果建立模型对隐式类型转换安全性进行检测。利用这两个模块组成的完整流程可以达到我们检测的目的。

为验证本发明的可行性、有效性,对给出的24个测试用例用本发明提出的方法进行检测,其中24个测试用例有13个测试用例为“不合格用例”,即13个用例在隐式类型转换过程中存在安全隐患,尽管通过编译,但是没有通过本方法检测。最终测试结果如下表1:

表1

本发明提出的方法正确地检测出了24个测试用例中13个“不合格用例”,检测成功率为100%。

本发明具体应用途径很多,以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以作出若干改进,这些改进也应视为本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1