APP下载

一种基于静态分析的漏洞分类方案

2018-03-07刘嘉熹

网络安全技术与应用 2018年8期
关键词:调用漏洞程序

◆刘嘉熹



一种基于静态分析的漏洞分类方案

◆刘嘉熹

(云南大学软件学院 云南 650500)

本文通过对漏洞挖掘技术的发展现状进行分析和研究,在对大量简单程序进行漏洞分析和对前人提出的漏洞挖掘软件的学习基础上,提出了一种通过IDA反汇编,进行静态分析的漏洞分类方案。

漏洞挖掘;分类;静态分析;IDA

0 引言

在信息技术发展的历史上,漏洞一直是难以逃避的话题。随着互联网的普及,在越来越多的人接触到计算机科学技术的同时,基于现代操作系统的技术也使漏洞对于用户的影响变得越来越大。当系统漏洞被黑客利用时,用户的个人信息和财产安全会受到不同程度的潜在威胁。2018年初,两组新型CPU漏洞CVE-2017-5754-Meltdown和CVE-2017-5753/CVE-2017-5715-Spectre被公开,使得用户本地操作系统底层的信息及用户的账号、密码、邮箱等个人隐私信息都面临被泄露的风险[1]。

漏洞的存在不仅给企业带来了巨大的损失,也使用户的个人设备遭到入侵和控制的风险大大增加。因此,在信息安全领域,漏洞的挖掘和修复一直是备受关注的议题。一般情况下安全人员会使用静态和动态两种漏洞检测方式,其中静态检测主要是依靠安全人员的经验,在没有源代码的情况下,首先对存在漏洞的程序进行反汇编处理,通过对代码的分析发现漏洞,这种基于经验的处理方式以及大量的重复工作与漏洞数目与日俱增的现状并不相符。因此,本文提出了一种基于静态分析的漏洞分类方案。

1 漏洞的一般分类

对快速大量的漏洞挖掘的需求催生了漏洞自动化挖掘技术,这也是漏洞挖掘分类方案的一个重要的应用方向。在漏洞自动化挖掘发展的过程中,Automatic Exploit Generation(AEG)[2]首先提出了自动化漏洞挖掘的方法。近年来,越来越多的研究人员为漏洞的自动化挖掘提出了改进方案,在漏洞利用自动化的发展过程中,为了提高漏洞挖掘效率,开发人员在栈缓冲区溢出漏洞,堆缓冲区溢出漏洞,格式化字符串漏洞,整数溢出漏洞四种类型的基础上对漏洞分类进行了尝试。如在360冰刃实验室的科研成果Digtool[3]中,作者把漏洞分为:

(1)OOB越界访问漏洞。

(2)UAF释放后使用漏洞。

(3)Time-Of-Check-To-Time-Of-Use(TOCTTOU)漏洞。

(4)参数未检查漏洞。

(5)信息泄露。

(6)竞争条件型漏洞。这里指多线程访问共享内存,而最后的结果取决于线程运行的精确时导致的错误[4]。

Digtool软件的分类较之以往的分类方案更加细化,有利于直接根据最显著特点找到漏洞。由此可见,根据漏洞的特点对漏洞进行分类的方式可以提高漏洞查找的效率,减少漏洞自动化挖掘的误报率。

2 漏洞的三种新的分类方案

基于对目前漏洞自动化挖掘过程中对漏洞分类方案的分析,本文提出了一种新的分类方案,使用该方案对使用IDA反汇编后的程序进行分析,为自动化漏洞挖掘程序的编写提供了一种新的分类思路。

2.1 定位关键字段

在对存在漏洞的程序或文件进行分析时,为了拿到shell,在一些情况下,可以使用system()函数执行指定的字符串的内容获得目标主机的shell。因此在没有程序源码的条件下,使用IDA对程序进行反汇编,直接进行字符串搜索即可查找程序中是否存在system()函数的调用,若程序中调用了system()函数,则通过对程序的逻辑分析,找到调用system()的子函数的地址,利用程序中的漏洞劫持程序流使程序执行位置定位到调用system()的子函数处,从而获得目标主机的shell。该方式可以很快定位到shell需要执行的子函数的地址,从而利用栈或堆溢出漏洞劫持程序控制流到目标地址,执行对应的子函数获得shell。

其基本逻辑如下:

If(”system()”exsit){

search the address of the function calls “system()”;

execute that function;

get shell;

}

2.2 关键词与缓冲区大小检测

2003年Cheers Halvar发布的开源的二进制漏洞分析工具BugScam可以基于IDA Pro的反汇编结果进行汇编级的漏洞分析。BugScam采用的全部是函数模型,它总共包含8个函数(strcpy、strcat、sprintf、lstrcpyA、lstrcatA、wsprintfA、sprintf.

MultiByteToWideChar),通过对这些函数进行漏洞特征的提取进行函数特征匹配来分析文件中可能出现漏洞的位置[5]。

BugScam是一个轻量级的漏洞检测工具,用于较简单模式的漏洞,它通过针对可能导致缓冲区溢出和格式化字符串的库函数进行检查来确定程序中是否存在安全隐患[6],本文在这个基础上,又提出了结合参数和逻辑进行漏洞检测的思路。

本文提出的分类方法针对较简单的程序模式,因此在进行分析和测试时使用的均为简单的漏洞程序。对于堆溢出漏洞,BugScam工具中的函数模型没有考虑到函数参数之外的size、length等与分配内存大小有关的变量名,所以在对于逻辑性更强的堆溢出漏洞的检测中没有很好地表现。通过对大量程序的检测和分析可以看出,对于堆溢出漏洞,在对危险函数进行建模检测的基础上再对size、length、strdup()函数等与内存分配大小有关的变量及函数等进行检测,会得到更好的漏洞点定位结果。如果程序中存在size或length等变量名,则检查程序中是否把用户自定义的变量大小与为其分配的缓冲区大小进行了比较,不存在比较则存在堆溢出漏洞。同时内存分配函数如strdup()等则会由于64位下16位对齐的原因导致堆地址的溢出。这一方案对堆溢出漏洞进行了检测和定位,加快了漏洞检测速度。

2.3 函数出现次数与其参数

结合库函数在程序中的出现频率和库函数的实参进行漏洞检测是另一种分类方案。

同样对存在漏洞的程序和文件进行分析和测试,在对漏洞程序的分析中,首先统计了使用IDA反汇编后程序中库函数被调用的次数,由于较为完善的程序中同一库函数应该不会大量存在漏洞,故而被调用次数少的函数存在问题导致程序漏洞的概率较大。因此完成调用次数统计之后把库函数按照被调用次数升序排列,并检查库函数的参数,比较实参中buf和size的大小,如果size数组的范围超过了buf大小,则判断该函数存在栈溢出漏洞。

在统计中发现,这种判断方法对于栈溢出漏洞的判断比较准确,非常适用于对栈溢出漏洞的分析。

3 总结与展望

本文提出了一种汇编级的漏洞静态分类方案,并提出了一种提高漏洞挖掘效率,减少漏洞挖掘人员工作负担的思路。未来将把这一分类方案通过代码或软件编写实现,使其具有实现意义,同时还要不断完善程序,保证漏洞分类的正确率,减少误报和漏报。

[1]https://www.leiphone.com/news/201801/TIV0ThWMtqMsy.

[2]Avgerinos T, Sang K C, Hao B L T, et al. AEG: Automatic Exploit Generation[J]. Internet Society, 2011.

[3]Digtool: A Virtualization-Based Framework for Detecting Kernel Vulnerabilities. J Pan,G Yan,IS Lab,X Fan; USENIX Security 2017-VANCOUVER, BC, CANADA.

[4]http://tech.ifeng.com/a/20170823/44667365_0.shtml.

[5]刘波,文伟平,孙惠平等. ClearBug一种改进的自动化漏洞分析工具[J].信息网络安全,2009.

[6]http://www.nsfocus.net/index.php?act=magazine&do=view&mid=2096.

猜你喜欢

调用漏洞程序
漏洞
核电项目物项调用管理的应用研究
试论我国未决羁押程序的立法完善
“程序猿”的生活什么样
英国与欧盟正式启动“离婚”程序程序
基于系统调用的恶意软件检测技术研究
三明:“两票制”堵住加价漏洞
漏洞在哪儿
创卫暗访程序有待改进
高铁急救应补齐三漏洞