陈立根,刘胜利,肖 达,彭 飞
(数学工程与先进计算国家重点实验室,郑州 450001)
随着互联网时代的到来和通信技术的发展,利用开放的网络环境进行通信已经成为时代发展的趋势。路由器是互联网络中的核心交换设备,是网络互联的基础。
目前,Cisco 公司的路由器产品应用范围非常广泛,居于市场首位。Cisco 互联网操作系统(Internet Operating System,IOS)是Cisco 公司开发的,专门用于其路由交换设备的互联网操作系统。主要考虑到速度的因素,IOS 被设计成比较简洁、驻留在存储器且受限于硬件平台的一种系统,而且并没有其他许多操作系统具有的安全保护机制[1],如进程间的存储保护。Cisco 公司没有对外公开IOS 内部的相关细节,IOS 一般基于PowerPC 或者MIPS 架构,和常见的Intel 架构存在较大的差异,且不支持第三方软件的运行,但这并不代表IOS 是完全安全的。2003 年,来自Phonoelit 黑客组织的FX 在文献[2-3]中对Cisco IOS的一些安全问题做了比较完整的分析,并给出了IOS缓冲区溢出漏洞的利用方法。2005 年BlackHat USA大会上,Michael Lynn 阐述了Cisco IOS 的体系结构,论证了在Cisco IOS 上执行任意代码的可行性,成功执行了shellcode[4]。这些攻击方法主要是利用IOS相关协议的漏洞,完成对路由器的远程控制,对网络安全造成了严重的影响。因此,研究Cisco IOS 下的漏洞挖掘方法,全面发现与及时修补IOS 的漏洞,具有重要意义。
在相关领域的典型研究成果中,微软和斯坦福大学的研究人员,分别独立提出了混合符号执行的方法,并实现了一系列有代表性的工具,如KLEE[5],EXE[6],DART[7]等。混合符号执行的核心思想是将输入数据用符号变量表示,模拟程序执行,收集程序路径约束条件,最后通过约束求解来生成驱动程序执行其他路径的测试用例,来提高测试用例的代码覆盖率。但是这些工具过度依赖于程序源代码,运行平台苛刻。之后出现了如SAGE[8],SmartFuzz[9],BitScope[10]等直接面向二进制程序进行符号执行的工具。SmartFuzz 和BitScope 使用在线的符号执行,但是由于符号执行需要占用大量计算资源,在线符号执行会导致目标程序性能严重下降,而Cisco IOS主要负责处理网络数据报文,对时延非常敏感。SAGE 系统采用离线的符号执行,使用iDNA 系统记录程序轨迹,再对轨迹重放过程中进行符号计算,与在线符号执行相比,对目标程序的性能影响比较小。但是由于Cisco IOS 不开源,且对于系统内部的进程管理等结构也不对外公开,因此在记录系统执行轨迹时,无法做到区分进程的指令记录,加上IOS 系统本身比较复杂,记录的指令数量将非常庞大,给后期处理带来严峻挑战,因此对IOS 而言该方法显得并不实用。文献[11]针对Windows 下的大型软件提出了基于污点分析的智能模糊测试技术,实现了相应的工具。
与本文中启发式模糊测试最接近的工作是文献[12]设计的TaintScope 系统。TaintScope 系统的核心思想是跟踪监控目标程序处理正常样本,获取影响安全敏感操作的输入数据,继而进行针对这些数据生成畸形样本进行测试。但是,TaintScope 与本文研究的关键区别在于,它面向x86 下的应用程序,基于Pin 插装技术实现,不支持Cisco IOS 系统,而且其并没有对安全敏感操作进行具体刻画,仅仅针对内存分配和字符串处理等安全敏感函数,也没有给出具体的判定规则,而本文除安全敏感函数外,还加入了对内存读写访问、函数跳转等安全敏感操作的处理,并给出了安全敏感操作的判定规则。
相比主流操作系统(如Windows,Linux),针对Cisco IOS 的安全性研究还不成熟,这方面公开的研究成果还比较少。在2011 年BlackHat 欧洲大会上,Muniz 等人论证了对Cisco IOS 进行Fuzz 测试的可行性[13]。2012 年,苏晓燕等人提出了基于模糊测试技术的Cisco IOS 漏洞挖掘方法[14],实现了IOS 的漏洞挖掘工具CFuzzer。但CFuzzer 在生成测试用例时,并没有利用程序内部状态信息,生成策略过于盲目,严重制约了模糊测试的效率和能力。
本文针对现有Cisco IOS 下漏洞挖掘方法的不足,并结合IOS 的特点,提出了基于细粒度动态污点分析的启发式模糊测试方法。本文的主要工作是通过研究细粒度动态污点分析技术,给出了污点传播规则。通过分析大量已公开漏洞的成因,结合IOS系统自身的特点,归纳总结产生漏洞的本质,给出了基于污点分析的安全敏感操作判定规则,提出了启发式测试用例生成方法,通过启发式信息,指导测试用例的生成,提高模糊测试效率,并开发了一套Cisco IOS 漏洞挖掘原型系统CTaintMiner。
作为一项热门的程序分析技术,动态污点分析(Dynamic Taint Analysis,DTA)已经广泛应用于信息安全的很多领域,例如恶意代码分析、软件漏洞挖掘、协议格式逆向分析等。动态污点分析的基本思想就是通过标定特定数据片段(例如网络报文、文件等)为不可信的数据(下文称之为污点),然后跟踪程序对这些污点数据的处理过程,从而收集目标程序对这些数据的具体使用信息。
动态污点分析主要包括2 个方面:污点数据的标定和污点数据的传播。污点数据的标定一般通过对系统的特定API 函数(如recv,fread 等)进行劫持来实现。污点数据的传播则需要定义一套污点的传播规则,而且通常需要维护一块影子内存(shadow memory)来存储污点的状态信息[9]。
根据污点传播的精细程度,污点分析又分为粗粒度污点分析和细粒度污点分析。粗粒度污点分析对于每一个数据其污点状态只有“0”或“1”,“0”表示干净,数据未被污染;“1”表示数据被污染。而细粒度污点分析指为每个污点数据单元分配唯一的标签,需要标识其依赖于哪些污点数据,从而能够跟踪每个污点字节的传播过程。
为了便于表述,进行以下定义:
定义1污点数据源是指对目标进程进行污点分析所关注的外部输入数据的集合,用集合D0={d0,d1,…,dn}表示,其中,di表示按单元划分的第i个污点数据单元;n为集合D0的基数,表示污点数据源按单元划分总共有n个污点数据单元。
定义2T映射,为集合V到集合S的映射,记为T:V→S,其中,集合V为寄存器、内存数据以及常量等所有数据的集合;集合S为污点属性集,S等于集合D0的幂集,对于∀v∈V,其污点属性为T(v)。特殊的,对于∀v∈D0,T(v)={v},因为污点数据源D0只是所有数据集合V的子集,而污点数据源当中的元素只依赖于其本身;当v为常量时,T(v)=Ø,因为常量不依赖于任何数据。
定义3目标进程执行的指令Ins<Type,Operand>,其中,Type表示Ins的指令类型;Operand是Ins的源操作数与目的操作数的集合。如果∃op∈Operand且T(op)≠Ø,则称Ins为污点操作相关指令。
定义4指令的污点属性为指令中目的操作数的污点属性。
当污点数据从一个位置传递到另一个位置时,则认为发生了污点传播。而污点传播规则定义了寄存器和内存数据的污点属性通过污点操作相关指令进行传播的方式。细粒度的污点分析,需要在传播过程中,传递污点数据对污点数据源的依赖关系。
对于涉及到内存访问的指令,进行污点传播时,存在内存地址被污染与内存内容被污染2 种情况,而其他指令污点传播情况相对简单。因此,为了表述方便,本文将读访问内存的指令记为RMIns,写访问内存的指令记为WMIns,并将RMIns指令与WMIns统称为内存访问指令,记为MEMIns;其他类型指令称为非内存访问指令,记为UMEMIns。
污点传播规则:
其中,R1 适用于RMIns指令,ra表示读访问的内存地址;rv表示读访问的内存地址ra处存储的值;R2 适用于WMIns指令,wa表示写访问的内存地址;wv表示将写入内存地址wa处的值;R3 适用于UMEMIns指令,Operandsrc为指令Ins中源操作数的集合;n为集合Operandsrc中元素的个数;op为集合Operandsrc中的元素;T(RMIns)表示对于读访问内存指令的污点属性,等于读访问的内存地址ra的污点属性与读访问内存内容rv的污点属性的并;T(WMIns)表示对于写访问内存指令的污点属性,等于写访问的内存地址wa的污点属性与写访问内存内容wv的污点属性的并。T(UMEMIns)表示对于非内存访问指令的污点属性,等于所有源操作数的污点属性的并。
Cisco IOS 采用PowerPC 或MIPS 架构,根据上述污点传播规则,表1 以PowerPc 指令集为例,给出了一个细粒度污点分析的示例。
表1 细粒度污点分析示例
第1 条是RMIns指令,指令的功能是从有效地址为(r3 +0)的内存处读取32 位的数,并加载到寄存器r4。M(r3)表示r3 指向的内存,根据定义2,M(r3)的污点属性为{0,1,2,3},根据污点传播规则R1,寄存器r4 的内容直接依赖于M(r3),所以其污点属性为{0,1,2,3}。
第2 条是RMIns指令,指令的功能从有效地址为(r3+4)的内存处读取32 位的数,并加载到寄存器r5。类似于第1 条指令,r5 的污点属性为{4,5,6,7}。
第3 条是WMIns指令,指令的功能是将r4 的32 位内容存储到有效地址为(r1 +8)的内存中。M(r1 +8)的内容直接依赖于r4,因此被r4 污染,根据污点传播规则R2,其污点属性为{0,1,2,3}。
第4 条是RMIns指令,指令的功能是从有效地址为(r4 +0xc)的内存处读取32 位的数,并加载到寄存器r7。读访问内存的地址直接依赖于寄存器r4的值,从而r7 的内容间接依赖于r4,根据污点传播规则R1,r7 的污点属性为{0,1,2,3}。
第5 条是UMEMIns指令,指令的功能是将寄存器r5 与r7 内容之和赋给寄存器r8。寄存器r8 的内容直接依赖于寄存器r5 与r7 的内容,根据污点传播规则R3,r8 的污点属性为r5 的污点属性与r7 的污点属性的并。
测试用例生成是模糊测试技术的关键。对于传统模糊测试而言,主要采用黑盒测试的方式,在生成测试用例时,并没有结合目标程序的内部状态信息。对Cisco IOS 而言,外部输入主要是网络协议数据报文,因此本文仅针对网络协议进行漏洞挖掘。本文基于动态污点分析技术,跟踪Cisco IOS 对协议数据报文的处理过程并反馈运行时信息,指导测试用例的生成,实现启发式测试用例生成技术,从而提高模糊测试的效率。
对于一个正常的协议数据报文而言,包括协议安全相关字段和协议安全无关字段。协议安全相关字段是指在目标程序处理过程中,可能影响到程序内部的安全敏感操作的协议字段。协议安全无关字段是指在目标程序处理过程中,对内部的安全敏感操作不会构成影响的协议字段。对于安全敏感操作,一般指一些不安全函数(如strcpy,printf 等)和内存分配函数(如malloc、realloc 等)调用。
启发式测试用例生成技术的核心思想就是首先识别协议数据报文中的协议安全相关字段,然后针对这些字段进行变异,生成测试用例对目标程序指定协议进行测试。一般而言,协议安全相关字段的数目远少于协议安全无关字段的数目。因此,相对于传统的模糊测试技术,启发式模糊测试最大的特点就是避免了对大量安全无关字段的测试,生成的测试用例具有很强的针对性,能够直接影响程序内部的安全敏感操作,引起程序异常的可能性更大,测试的效率更高。
例如,在一个协议数据报文中,往往数据报文的头部相关字段可能影响程序的内部安全敏感操作,如长度字段可能会影响目标程序中的内存分配、内存拷贝等操作。而其中的数据部分一般不会产生影响。
在图1 中,左半部分是一个正常某协议数据报文,右半部分是Cisco IOS 处理该数据报文的执行轨迹。图中的寄存器r9 依赖于数据报文中的长度字段“00 5c”,然后污染属性通过指令序列传递给了内存分配函数malloc 的入口参数r3 和内存拷贝函数memcpy 的参数r5,其中,r3 表示内存分配的大小;r5表示内存拷贝的长度。因此,数据报文的长度字段影响了内存分配函数和内存拷贝函数的调用,启发式测试用例生成就是针对这些协议安全相关字段进行变异,生成畸形的测试用例。
图1 启发式模糊测试示例
由启发式测试用例生成的原理可知,安全敏感操作的界定决定了协议安全相关字段的获取。因此,根据目标程序的特点,对安全敏感操作进行具体地判定非常重要。
通过对大量已公开漏洞的研究发现,大多数漏洞都是因为程序没有对外部输入(下文称为污点)进行严格的审查,造成程序内部的函数调用地址、内存访问地址、安全敏感函数的参数等受到污点数据的影响。本文将以下5 类操作称为安全敏感操作(假设r3 为污点数据):
(1) 内存读访问地址被污染:如lwzr4,0xc(r3),通过变异读访问地址依赖的字段,可能造成读访问的内存不存在,引发读访问异常。如果读取的内存内容,接下来作为函数调用的地址,可能引发代码执行或者异常,如以下指令序列:
L1 将(r3 +0xc)指向的32 位内容,加载到寄存器r4,之后L2 将r4 的值赋给寄存器ctr,L3 直接跳转到ctr 指向的地址处执行。
(2) 内存写访问地址被污染:如stwr4,0xc(r3),通过变异写访问地址依赖的字段,可能造成写访问的内存不存在或者改写破坏内存,引发写异常或关键数据破坏。
(3) 跳转、调用目的地址被污染:如mtctrr3;bctrl。第1 条指令将寄存器r3 的值传递给ctr 寄存器;第2 条指令意思是跳转到ctr 寄存器所指向的地址处执行,并设置lr 寄存器为下一条指令的地址,执行完后,返回到lr 指向的地址处执行。通过变异所依赖的字段,可能导致程序执行任意代码。
(4) 跳转、调用目的地址处内容被污染:类似于(3),通过变异目的地址处内容所依赖的字段,可能导致程序执行任意代码。
(5) 安全敏感函数的参数被污染:安全敏感函数主要包括不安全函数(如strcpy,sprintf)、内存分配函数(如malloc,realloc,calloc)以及内存拷贝函数(如memcpy)等,具体函数需要根据目标程序的特点来选取。如malloc 函数的size 参数被污染,通过变异size 所依赖的字段,控制内存分配的大小,可能造成size 整型异常,进而可能引发缓冲区溢出。
上述5 种安全敏感操作中,操作(1),操作(2)本质上是内存访问的地址依赖于污点数据,操作(3),操作(4)是程序跳转、调用目的地址或内容依赖于污点数据,操作(5)是安全敏感函数的参数依赖于污点数据。本文通过分析5 种情况的本质,提出了以下3 条基于细粒度动态污点分析的安全敏感操作判定规则:
R4:对于跳转指令,如果其跳转的目标地址或者目标地址处指令内容被污染,即:
其中,ba表示跳转指令的目标地址;bv为ba处的指令内容。
则该操作为安全敏感操作,T(ba)∪T(bv)中的元素即为安全相关字段。
R5:对于内存访问指令,如果内存访问的地址被污染,即:
其中ma表示内存访问的有效地址,则该操作为安全敏感操作,T(ma)中的元素即为安全相关字段。
R6:对于函数调用,如果该函数为安全敏感函数,且该函数的传入参数被污染,即:
其中,ARGIN为函数传入参数的集合,且ARGIN={ArgIN1,ArgIN2,…,ArgINn},则该操作为安全敏感操作,T(ARGIN)中的元素即为安全相关字段。
本文将满足上述安全敏感操作判定规则的行为进行报警,记录具体行为以及安全相关字段信息。在生成测试用例时,使用如边界值等异常元素对安全相关字段进行变异,实现启发式测试用例生成技术。
本文基于细粒度动态污点分析的启发式模糊测试方法,设计并实现了Cisco IOS 下的漏洞挖掘原型系统CTaintMiner,下面对系统的设计与实现,以及系统的实验评估进行阐述。
CTaintMiner 是Cisco IOS 下的漏洞挖掘原型系统,主要由目标端和测试端两部分组成。其中目标端包括基础平台模块、污点引入模块、污点跟踪模块、信息反馈模块和异常监视模块;测试端包括测试用例生成模块、消息收发模块和网络同步模块。CTaintMiner 系统整体结构如图2 所示。
图2 CTaintMiner 系统整体结构
其中,基础平台模块,主要基于Cisco 模拟器Dynamips[15]实现,主要负责路由器硬件模拟,并加载运行Cisco IOS;污点引入模块,负责对外部输入(这里指网络数据报文)进行污点标定,确立污点数据源;污点跟踪模块,负责在程序运行过程中,跟踪污点的传播过程。信息反馈模块,应用安全敏感操作判定规则对Cisco IOS 系统运行和污点传播结果进行分析监测,对满足判定规则的敏感操作进行报警,并将IOS 内部运行时信息反馈给测试端的测试用例生成模块,从而指导测试用例生成;异常监视模块,负责监视IOS 的运行状况,出现异常及时报警。测试用例生成模块,结合协议脚本与异常元素库,针对启发式信息中反馈的协议安全相关字段进行变异,生成测试用例;消息收发模块,负责测试过程中的消息发送与接收;网络同步模块,负责同步测试端与目标端的网络通信。
实验测试环境为在Intel Pentium 双核E5700 3.0 GHz CPU,3 GB 内存,主机操作系统为Windows XP sp3,在操作系统为ubuntu12.04 的虚拟机中运行CTaintMiner。
CTaintMiner 基于细粒度污点分析,通过跟踪数据报文处理过程,识别协议安全相关字段,指导测试用例生成,以此来提高测试的效率。因此,对于协议安全相关字段的识别能力,直接影响CTaintMiner 系统的功能。本文选择了路由器常用的2 种协议NHRP 和DHCP,对CTaintMiner 系统的协议安全相关字段识别能力进行了实验测试。图3 是CTaintMiner进行测试时,获取的协议安全相关字段的记录信息。协议安全相关字段识别实验结果如表2所示。
图3 协议安全相关字段的信息
表2 协议安全相关字段识别结果
在图3 中,可以看到Cisco IOS 在处理某协议数据报文时,系统内部内存分配函数alloc 的长度参数为污点数据,受到输入数据报文的第52 Byte、第53 Byte(从0 开始编号)的影响,数据报文的标识是“1406”。在记录信息中,还详细记录了污点传播的情况,第6 行~第10 行,记录了寄存器r22 污染内存单元0x8218c170 的情况,大括号中的内容为依赖的输入数据字节,中括号中的内容为输入数据报文的标识。
在表2 中,第1 列是协议类型,本文主要选取了NHRP 和DHCP 2 种协议作为示例。第2 列是同种协议的不同消息类型数据报文。第3 列给出的是输入数据报文的大小,该大小没有计入底层的协议(如IP 层等)。第4 列给出的是数据报文中影响Cisco IOS 内部安全敏感操作的协议安全相关字段的字节数,从表中可以看出协议安全相关字段占整个输入数据报文的比例相当小,不到整个输入的3.2%(第4 列中所有值之和除以第3 列中所有值之和)。因此,针对这些字段进行变异生成测试用例,能够提高测试效率。
为了验证协议安全相关字段识别的有效性,本文对FTP,TFTP、NHRP,DHCP 等多个协议进行了协议安全相关字段进行获取,并根据协议规范,通过CTaintMiner 系统中的测试用例生成模块,利用异常元素库中的元素针对获取的协议安全相关字段进行变异,生成畸形的测试用例进行测试。
目前,使用CTaintMiner 系统重现了1 个NHRP缓冲区溢出漏洞[16]、1 个DHCP 拒绝服务攻击漏洞[17]、1 个TFTP 长文件名漏洞[18]以及2 个FTP 缓冲区溢出漏洞[19]。虽然是已公开漏洞,但Cisco 公司并没有公开漏洞细节。因此,实验结果说明了CTaint-Miner 原型系统具有很强的实用性,论证了基于细粒度污点分析的启发式模糊测试方法的有效性。
本文立足安全性需求,结合Cisco IOS 自身的特点,提出一种基于细粒度污点分析的启发式模糊测试漏洞挖掘方法,设计并实现了一个漏洞挖掘原型系统CTaintMiner,该系统能够识别协议数据报文中的协议安全相关字段,继而针对这些字段进行变异生成测试用例,进行漏洞挖掘。但系统仍存在不足,CTaintMiner 实现的是在线的细粒度污点分析,再植入了细粒度污点分析模块后,性能上出现明显下降,如在处理SSH 加密协议登录过程中的D-H Key Exchange Init 类型数据报文时,时延比较明显。因此,如何优化系统结构、提高系统性能将是下一步的工作的重点。
[1]Bollapragada V,Murphy C,White R.Inside Cisco IOS Software Architecture[Z].Cisco Company,2000.
[2]Felix Linder.Design and Software Vulnerability in Embedded System[EB/OL].(2013-10-21).https://www.blackhat.com/presentation/bh-usa-03/bh-fed-03-fx.pdf.
[3]Linder F.Cisco Vulnerabilities-yesterday,Today and Tomorrow [ EB/OL].(2013-10-21).http://www.blackhat.com/presentati-on-bh-usa/bh-us-03-fx.pdf.
[4]Lynn M.The Holy Grail:Cisco IOS Shellcode and Exploitation Techniques [ EB/OL].(2005-10-13).http://cryptome.org/ly-nn-cis-co.pdf.
[5]Cadar C,Dunbar D,Engler D R.KLEE:Unassisted and Automatic Generation of High-coverage Tests for Complex Systems Programs[C]//Proceedings of OSDI’08.[S.1.]:IEEE Press,2008:209-224.
[6]Cadar C,Ganesh V,Pawlowski P M,et al.EXE:Automatically Generating Inputs of Death[J].ACM Transactions on Information and System Security,2008,12(2):10-18.
[7]Godefroid P,Klarlund N,Sen K.DART:Directed Automated Random Testing[J].ACM Sigplan Notices,2005,40(6):213-223.
[8]Godefroid P,Levin M Y,Molnar D A.Automated Whitebox Fuzz Testing[C]//Proceedings of NDSS’08.[S.1.]:IEEE Press,2008:151-166.
[9]Molnar D,Li X C,Wagner D A.Dynamic Test Generation to Find Integer Bugs in x86 Binary Linux Programs[C]//Proceedings of the 18th Conference on USENIX Security Symposium.[S.1.]:USENIX Association Press,2009:67-82.
[10]Brumley D,Hartwig C,Kang M G,et al.Bitscope:Automatically Dissecting Malicious Binaries[R].School of Computer Science,Carnegie Mellon University,Technical Report:CMU-CS-07-133,2007.
[11]Bekrar S,Bekrar C,Groz R,et al.A Taint Based Approach for Smart Fuzzing[C]//Proceedings of the 5th IEEE International Conference on Software Testing,Verification and Validation.[S.1.]:IEEE Press,2012:818-825.
[12]王铁磊.面向二进制程序的安全漏洞挖掘关键技术研究[D].北京:北京大学,2010.
[13]Muñiz S,Ortega A.Fuzzing and Debugging Cisco IOS [EB/OL].(2011-10-10).https://media.blackhat.com/bh-eu-11/Sebastian_Muniz/BlackHat _EU _2011 _MunizOrtega_Cisco_iOS-WP.pdf.
[14]苏晓艳,武东英,刘 龙,等.基于Fuzzing 的Cisco IOS 漏洞挖掘方法[J].计算机工程,2012,38(16):117-120.
[15]Anuzellil G.Dynamips/DynagenTutorial [ EB/OL ].(2011-10-12).http://materias.fi.uba.ar/7543/2010-02/ download/DynamipsTutorial.doc.
[16]Cisco IOS Next Hop Resolution Protocol Vulnerability[EB/OL].(2007-10-12).http://tools.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-20070808-nhrp.
[17]Cisco IOS Software DHCP Denial of Service Vulnerability[EB/OL].(2012-10-12).http://tools.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-20 120926-dhcp.
[18]TFTP Long Filename Vulnerability[EB/OL].(2012-10-12).http://tools.cisco.com/security/center/ content/CiscoSecurityAdvisory/cisco-sa-20020730-ioc-tftp-lfn.
[19]Multiple Vulnerabilities in the IOS FTP Server[EB/OL].(2007-10-12).http://tools.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-20070509-iosftp.