APP下载

基于程序不变量的载荷特征提取方法﹡

2013-09-17葛子毅程绍银

通信技术 2013年9期
关键词:污点源代码应用层

葛子毅, 程绍银, 蒋 凡

(中国科学技术大学 信息安全测评中心,安徽 合肥 230027)

0 引言

指纹提取是进行协议识别、网络管控、流量计费等工作的前提。协议的指纹[1]包括以下几类:端口[2]、应用层载荷特征[3]、基于流量的统计特征、传输层行为特征[4]等。其中,应用层载荷特征具有应用范围广、识别率高的优点,目前研究的比较多,但多集中在如何利用其进行高速识别网络流量方面[5]。针对应用层载荷特征的生成问题研究得较少,工业界主要是依赖于人工分析网络流量获得该类特征,效率低下,准确性差,且在协议升级时无法及时更新指纹。

文中提出一种基于程序不变量的应用层载荷特征提取方法,该方法具有能够自动生成协议指纹,不需要分析协议的语法语义,生成的指纹精确性高等特点。

1 方法框架

该方法是一种基于程序分析的方法,方法框架如图1所示。

首先对输入的网络数据包进行污点标记,记录数据包中各字段所处的位置。网络应用程序将这些数据包作为输入,读取并进行后续处理。系统通过插桩控制模块对应用程序处理数据包的过程进行插桩,根据定制化的配置文件决定插桩时机、位置和插入的分析代码等。在插桩后的应用程序动态执行的过程中,系统可以收集程序运行时的状态,并且跟踪经过污点标记的数据包中字段的传播路径,分别生成程序状态集和污点传播记录。对程序状态集进行不变量检测,获得在动态执行过程中的程序不变量。对污点传播记录进行过滤,得到精简化的污点传播轨迹。由于程序不变量与网络数据包中字段间的关系存在对应,通过分析程序不变量中的有关变量值的污点传播路径,可以反推得到网络数据包中各个字段间的固定关系,从而获得网络应用程序的通信指纹。

图1 基于程序不变量的指纹提取方法框架

2 具体步骤

(1)污点标记

基于标记的动态污点传播技术是指在程序运行过程中,将应用程序接收到的数据包的每个字节(污染数据)进行唯一性标记,标记的方法可以有很多种,其中最简单的方法是按照每个字节在协议数据包中的偏移量进行标记,如图2所示。

图2 对某个HTTP数据包污点标记示意

(2)配置导入

配置导入是一个可选用的部分,主要用途是在对应用程序进行插桩时进行过滤,只对关注的程序段插桩,对已有库函数和系统调用等不进行插桩,减轻插桩分析的开销。

(3)插桩控制

程序插桩是指在程序源代码/二进制代码中插入分析语句,以使得在程序动态运行时获取变量值、内存状态、函数调用等信息。

对于程序源代码的插桩,即在源代码中的合适位置,插入与程序源代码兼容的程序语句,然后对包含插桩代码的源代码进行编译执行。对于没有源代码的二进制程序插桩,还可分为静态插桩和动态插桩。静态插桩是在程序运行前,通过改写二进制文件本身进行插桩,可使用的工具有ATOM[6]等;动态插桩是在程序运行时根据程序的位置和实时状态插入特定分析代码,针对性强,并且可以处理动态生成的代码,可采用的动态二进制程序插桩工具有PIN[7]等。动态程序插桩开销比较大,因此其插桩控制部分要着重提高效率,减少不必要的插桩开销。如在图1中所示,插桩控制模块根据配置信息决定何时启动插桩,并根据具体指令的不同语义插桩不同的桩程序。

(4)动态执行

动态执行即是使插桩后的应用程序实际运行,同时收集程序运行时的状态和污点传播情况。在有源代码情况下,程序状态集指的是源程序中各个变量在不同时刻的值,还可以包括函数调用轨迹,函数的参数值、返回值等。在二进制条件下,程序状态集指的是寄存器状态和内存状态,还包括具体执行的指令、库函数和系统调用等。在应用程序的运行过程中,对程序状态集进行跟踪和更新。

(5)程序不变量检测

不变量检测模块负责从动态执行过程生成的程序状态集中提取出程序不变量。

对于二进制程序,通过分析程序状态集中与不变量生成密切相关的指令,可以快速得到与协议指纹有关的程序不变量。与通信指纹有关的不变量主要是一些域变量之间的相等关系或线性关系。线性关系是一些简单的函数关系,比如a=strlen(b)。如果检测到存在这种 strlen函数关系,则可以得到域 a是域b的长度的结论。有些汇编指令本身就具有这种strlen函数关系,比如对rep指令,ECX寄存器存放的要复制的字符串的长度,ESI寄存器存放的是源字符串的首地址。若ESI和ECX分别代表着协议数据包中的不同的域,则可以得到这两个域之间存在的满足 strlen函数的不变量关系。而对于有源代码的应用程序,可以利用已有不变量检测工具(如Daikon[8])对程序状态集中的变量间关系进行检查,自动提取出程序不变量。

(6)污点传播过滤

污点传播记录非常庞杂,可通过程序切片技术,剔除不可能影响某个所关心变量值的程序执行片段,从而将影响该变量值的程序执行片段限定到一个较小的范围中,以加快指纹生成模块的分析速度。

(7)指纹生成

对于二进制程序,程序的语义信息主要由一些特殊指令和库函数引入。比如在cmp指令中,如果将协议中某个字段的污染标签反复与一个立即数比较,则该字段可能是控制循环次数的长度信息,从而可以认为该字段表示长度信息,结合该字段的污染标签的传播轨迹,即可推导出网络数据包中的某字段的语义信息。一些库函数本身也带有很重要的语义信息,比如内存拷贝函数memcpy,三个参数分别表示目的地址,源地址和要拷贝的长度。如果由污染传播轨迹知道,第二个参数(源地址)是协议中某个字段的地址,且第三个参数(长度)是协议中某个字段的值,则可以很轻易的得到这两个字段之间存在着不变量关系。指纹生成模块即是根据对这一类特殊指令和库函数的归纳和总结,对程序状态集中的记录进行检索和分析,结合污点传播信息,推导出数据包中的域间不变关系,获得通信指纹。

对于有源代码的应用程序,程序的语义信息比较清晰,记录由不变量检测得到的程序不变量中所涉及到的变量,在污点传播轨迹中查找这些变量的值的污点传播来源,即可推导出数据包中的域间不变关系,获得通信指纹。

3 实例分析

图3 BitTorrent握手数据包

本节结合一个例子进行说明,旨在阐释本方法的思想。

BitTorrent是一款P2P下载软件, 其最初版本的源代码是用python语言编写的。该例中,所使用的BitTorrent源码版本为4.0.1,因为是对于源代码插桩分析,目标比较明确,因此为提高插桩效率所使用的配置文件等可以忽略。本例将BitTorrent握手数据包作为上述方法中所涉及的网络数据包,提取的协议指纹是该握手数据包中应用层载荷第0-19个字节“19BitTorrent protocol”。BitTorrent的握手数据包如图3所示。

(1)污点标记

图3中示出的部分为BitTorrent握手数据包中的数据。从图中可知BitTorrent握手数据包中应用层载荷前的数据为“19BitTorrent Protocol”。将BitTorrent握手数据包中的数据以字节为单位分组,按照每个字节在网络数据包中的偏移量对 BitTorrent握手数据包中的每组数据进行污点标记,这样握手数据包中的应用层载荷第一个字节“19”的污染标记为0,“BitTorrent Protocol”的污染标记就为1-19。

(2)配置导入

由于BitTorrent的源码比较简单,很容易确定插桩的时机和位置,插桩的开销也很低,因此本例中省略了配置导入的过程。

(3)插桩控制

首先分析源代码,发现 encoder.py负责发起对等客户之间的连接,而connecter.py文件是负责分析连接数据包而后建立起对等连接,其中的_read_messages()是专门用来处理连接时接收到的握手数据包。其部分代码段如下:

上述代码中yield n是从变量self._message中读出n个字节。BitTorrent握手数据包内容以固定字符串“19BitTorrent protocol”开头,其中19代表的是len(protocol_name),protocol_name即为“BitTorrent protocol”。可见这段代码的功能就是识别接收到的数据包是否为BitTorrent握手数据包。

为记录程序运行时的状态信息,对以上源代码段进行插桩,加入输出语句,输出程序动态执行时的变量值,输出的变量为 self._message1(yield 1时self._message的值)、self._message2(yield len((protocol_name)时 self._message的值)、protocol_name、len(protocol_name)。进行程序插桩后的代码为:

(4)动态执行

编译执行插桩后的源代码,输出程序状态集(本例中比较简单,即是在程序不同位置以上变量的值),包括:self._message1、self._message2、len(protocol_name)和 protocol_name。

(5)不变量检测

通过对上述插桩代码输出的结果作不变量检测,可得到程序不变量关系 self._message1=len(protocol_name)=19,self._message2=protocol_name =“BitTorrent protocol”,也即存在程序不变量关系 self._message1=len(self._message2),且 self._message1 为常量“19”,self._message2 为常量“BitTorrent protocol”。

(6)污点传播过滤

本例中通过对源代码的分析,仅关注了可能与指纹相关的一些变量值的污点传播过程,所产生的污点传播记录非常简单,因此不需要污点传播过滤的过程。

(7)指纹生成

对握手数据包中字段作污染传播分析。通过代码分析数据包字节如何构成变量 self._message的值,即污染数据如何传播到变量self._message中。Connector.py文件中 data_came_in函数正是负责从数据包中读取内容存入到self._message中。如以下代码段所示。

由此,被标记的数据便从BitTorrent握手数据包中传播到self._message变量中。由于BitTorrent握手数据包比较小,在一个循环内“BitTorrent protocol”的污染标记 1-20也传播到 self._message的前20个字节处。

BitTorrent握手数据包中污染标记为0的一组数据的轨迹为“19”>> self._message >> self._message1,污染标记为1-19的数据的污染传播轨迹是相同的,都 为 “BitTorrent protocol” >> self._message >>self._message2。

由过程(5)已知程序不变量为self._message1=len(self._message2)且均为常量,再根据污点传播记录中的self._message1与BitTorrent握手数据包中的“19”相关联,self._message2与BitTorrent握手数据包中的“BitTorrent protocol”相关联,即得到BitTorrent应用程序的通信指纹可以为:应用层载荷第0-20个字节内容为常量“19BitTorrent protocol”。

事实上,在WireShark中,也是以“19BitTorrent protocol”固定字符串作为BitTorrent协议指纹的,从而可知文中提出的指纹提取方法是有效的。

4 结语

文中提出一种基于程序不变量的指纹提取方法,给出了该方法的步骤框架和具体模块的阐述。并结合BitTorrent的实例,进一步说明了该方法如何提取出有效的应用层载荷特征指纹。该方法不需分析协议语法语义,且生成的指纹精确性高。

[1] DAINOTTI A,PESCAPÈ A,CLAFFY C K.Issues and Future Directions in Traffic Classification[J]. Network,IEEE , 2012,26(01):35-40.

[2] 周江,贾茂林,朱修阳,等.P2P应用识别的研究[J].信息安全与通信保密,2009(09):96-97.

[3] 邓伟锋,程绍银,蒋凡,等.应用层负载特征定义及自动提取方法[J].通信技术,2012,45(07):20-23.

[4] 龙坤,陈庶樵,夏军波.P2P网络聚合流量识别技术研究[J].通信技术,2010,43(01):142-144.

[5] 陈曙晖.基于内容分析的高速网络协议识别技术研究[D].长沙:国防科学技术大学,2007.

[6] AMITABH S, ALAN E.ATOM: a System for Building Customized Program Analysis Tools[C]//Proceedings of the ACM SIGPLAN 1994 conference on Programming language design and implementation.ACM Press:New York,1994:196-205.

[7] LUK C K, COHN R, MUTH R, et al. Pin: Building Customized Program Analysis Tools with Dynamic Instrumentation[C]//Proc. Of the 2005 ACM Conference on Programming Language Design and Implementation(PLDI ’05). New York, NY, USA: ACM,2005:190-200.

[8] The Daikon Invariant Detector[EB/OL].Program Analysis Group of MIT[2012-10-31]. http://groups.csail.mit.edu/pag/daikon/.

猜你喜欢

污点源代码应用层
基于代码重写的动态污点分析
基于TXL的源代码插桩技术研究
污点
软件源代码非公知性司法鉴定方法探析
基于语法和语义结合的源代码精确搜索方法
使用Lightroom污点去除工具清理照片中的瑕疵
基于分级保护的OA系统应用层访问控制研究
物联网技术在信息机房制冷系统中的应用
Current advances in neurotrauma research: diagnosis, neuroprotection, and neurorepair
纯 白