ISSN1000-9825,CODENRUXUEWE-mail:jos@iscas.
ac.
cnJournalofSoftware,Vol.
19,No.
6,June2008,pp.
15191532http://www.
jos.
org.
cnDOI:10.
3724/SP.
J.
1001.
2008.
01519Tel/Fax:+86-10-625625632008byJournalofSoftware.
Allrightsreserved.
基于异常诊断的代码注入攻击自动分析和响应系统李闻+,戴英侠,连一峰,冯萍慧,鲍旭华(中国科学院研究生院信息安全国家重点实验室,北京100049)Code-InjectionAttackAutomaticAnalysesandResponseSystemBasedonAbnormalSceneDiagnoseLIWen+,DAIYing-Xia,LIANYi-Feng,FENGPing-Hui,BAOXu-Hua(StateKeyLaboratoryofInformationSecurity,GraduateUniversity,TheChineseAcademyofSciences,Beijing100049,China)+Correspondingauthor:E-mail:wli@is.
ac.
cnLiW,DaiYX,LianYF,FengPH,BaoXH.
Code-Injectionattackautomaticanalysesandresponsesystembasedonabnormalscenediagnose.
JournalofSoftware,2008,19(6):15191532.
http://www.
jos.
org.
cn/1000-9825/19/1519.
htmAbstract:Thepaperpresentsacode-injectionattackautomaticanalysesandresponsesystem.
Bymeansofanalyzingabnormalsceneandsyntaxofdatapayload,itgeneratesvulnerability-orientedsignatureswhichareusedtofilteroffvariantformofcodeinjectionattackbasedonsameattackschemeofsamevulnerability.
Bycombiningwithprotocolstateandprocessstateduringsignaturesgeneratingandattackrespondingprocess,verylowfalsepositiverateandlaggingwithoutelevatingfalsenegativeratecanbegained.
SometechnicaldetailsoftheprotocoltypesystemonLinuxandWindows2000andexperimentalresultsarealsopresented.
Keywords:abnormalscenediagnose;automaticattacksignaturesgeneration;automaticattackresponse;automaton摘要:提出了一种基于进程异常场景分析的代码注入攻击自动分析和响应系统.
该系统根据进程异常场景自动分析攻击载荷句法,并生成面向漏洞的攻击特征,由该攻击特征,可以识别和阻断基于同一未知漏洞同种利用方式的各种代码注入攻击的变形.
通过在生成攻击特征以及响应攻击的过程中结合网络协议和进程的状态,可以在不升高检测漏警概率的前提下显著地降低响应虚警概率和系统对外服务的响应时间.
另外,还简要介绍了基于Linux和Windows2000的原型系统,并给出了功能和性能的实验结果.
关键词:异常场景诊断;攻击特征自动提取;自动攻击响应;自动机中图法分类号:TP393文献标识码:A代码注入攻击是指攻击者本地或者远程向进程的线性地址空间注入一段可执行的二进制代码,然后通过某种手段修改进程的正常控制流程,使进程执行这段代码,从而达到预定目的的攻击行为.
早期文献中提到的"缓冲区溢出攻击(bufferoverflow)"在严格意义上是指这一类攻击的一个子类,由于攻击者注入代码的位置通SupportedbytheNationalNaturalScienceFoundationofChinaunderGrantNos.
60403006,60503046(国家自然科学基金);theNationalHigh-TechResearchandDevelopmentPlanofChinaunderGrantNo.
2006AA01Z437(国家高技术研究发展计划(863))Received2006-08-15;Accepted2006-10-101520JournalofSoftware软件学报Vol.
19,No.
6,June2008常在缓冲区,而且修改进程的正常流程往往需要利用对缓冲区缺乏边界检查的编程错误,所以,以"缓冲区溢出攻击"指代全体.
其实,某些代码注入攻击从实现手段上,例如格式字符串误用、double-free等等,与"溢出"都不直接相关,所以在近来的一些文献中都采用了"代码注入攻击(codeinjection)"这一比较严格的称谓,在本文中也将采用这个称谓取代"缓冲区溢出攻击".
系统管理员面对的安全挑战主要是如何有效地防护服务器系统的机密性、完整性和可用性不被远程攻击者破坏.
对于配置合理的服务器,安全漏洞主要来自服务器程序自身的编码缺陷,其中,由于程序内存管理缺陷导致的代码注入攻击危害最大.
据统计,仅去年基于代码注入的攻击就占使CERT/CC提出建议的所有重大安全性错误的50%以上.
许多著名的蠕虫也是利用代码注入攻击实现传播的目的,例如冲击波(基于RPCDCOM远程溢出)和CodeRedII(基于IIS.
IDA/IDQISAPI远程溢出).
对于这些漏洞,厂家会提供补丁供管理员下载和安装.
随着计算机网络规模的增大以及新的漏洞挖掘技术的出现,这种基于静态补丁的传统响应方式越来越难以满足需要.
首先,由于漏洞挖掘及利用技术的成熟,厂家发布补丁的时间几乎总是落后于攻击者利用新漏洞(0day漏洞)发动攻击的时间.
厂家必须在每一个版本的产品上充分测试他们的补丁以确保补丁的可用性,而攻击者不必关心攻击程序是否会危害系统.
其次,厂家发布补丁到补丁被应用于实际系统有一个时间间隔.
对于商用系统,可用性比安全性更为重要,所以,管理员在安装系统之前需要充分测试补丁和系统的兼容性.
这些因素导致了漏洞利用时间和补丁部署时间的间隔.
这就需要有一种实时的防护手段替代传统的静态补丁方案,这种手段必须能够:a)抵抗大多数针对未知漏洞的代码注入攻击;b)检测和响应攻击的过程不需要过多的人为干预;c)虚警概率低,不会显著降低系统的可用性;d)部署和拆除容易,不用重新编译现有的应用程序.
国外的研究者做了大量相关的理论性和工程性的研究,一大批可以满足一个或者几个需求的原型系统和工具被提出.
早期的研究着眼于如何加强程序的安全性,这些研究可以被分为如下两类:(1)静态的解决方案(staticsolution):这一类方案通过使用安全的编程语言[13]、对源代码的静态检查[4]、对编译器的增强[5]、使用特殊的安全函数库[6]等,从源代码级别消除代码注入攻击的危害,但是需要重写或者重新编译应用程序甚至操作系统的源代码;(2)运行时解决方案(run-timesolution):这一类方案通过使用局部或者全局的砂箱或虚拟机[7]、指令随机化(randomizedinstructionsetemulation,简称RISE)[8]和线性地址空间随机化(addressspacelayoutrandomization,简称ASLR)[9],可以在极低的漏警概率下有效地阻断代码注入攻击,不需要重写重编译源代码,但在成功地阻断攻击后,系统往往因处于不确定状态而崩溃,系统的可用性被破坏.
近来的一些研究着重于如何阻断代码注入攻击,而且不会显著地降低系统可用性.
Shield[10]根据漏洞的特性,在该攻击程序广泛传播之前手工定义攻击特征并基于网络协议状态阻断攻击,但是不能防护基于未知漏洞的攻击.
TaintCheck[11]使用模拟器动态跟踪来自网络的数据在进程中的传播,同时,生成攻击特征并且过滤网络数据,效率比较低.
DIRA[12]始终维护一个内存数据的更新日志,当攻击发生时做"回卷".
ARBOR[13]使用静态的方法检查缓冲区的边界,在攻击发生前截断网络数据流,但是,该系统只能防护代码注入攻击的一个子类——缓冲区溢出攻击,对格式字符串攻击等无能为力.
本文描述了一种使用基于异常场景诊断的代码注入攻击自动分析及响应系统.
该系统根据进程受攻击时的异常场景分析得出攻击载荷的句法结构,并且结合进程状态以及网络协议的状态自动产生面向漏洞的攻击特征,通过把攻击特征反馈给前端的过滤模块.
该系统可以对大多数基于未知漏洞的代码注入攻击做出自动响应.
通过在分析和响应过程中结合进程状态和协议状态,该系统在不升高漏警概率的情况下获得几乎为0的虚警概率.
本系统不需要重新改写或编译现有的应用程序,也不需要改写内核,从而易于部署和拆除.
本文第1节描述系统组成和基本工作流程.
第2节描述攻击载荷句法分析原理并简要介绍句法分析引擎模块.
第3节构造应用状态自动机模型,并且阐述在攻击特征提取和攻击响应过程中作为一种降低虚警概率和系统响应时间的有效手段的应用.
第4节给出对系统的功能和性能的测试结果.
最后是对现有工作的总结和对未李闻等:基于异常诊断的代码注入攻击自动分析和响应系统1521来工作的展望.
1系统结构进程线性地址空间随机化技术(ASLR)[9]是近年来新出现的一种进程保护技术.
在使用ASLR加固进程后,进程的栈(stack)、堆(heap)和代码段等关键数据结构将处于随机的地址,攻击者将不能准确定位这些地址,从而不能按预计方式运行恶意代码,结果是造成进程处于不确定状态从而崩溃.
如果只想阻止恶意代码运行,这一类技术很好,但它无助于保持系统的正常运行.
如果从系统的可用性角度考虑,这一技术远远不及厂家发布的补丁更可靠.
在我们的系统中,利用ASLR技术高敏感性的特点,把它作为一种检测而不是阻断代码注入攻击发生的手段,把进程异常事件作为触发攻击特征分析的信号.
由于ASLR的检测漏警概率极低,所以我们的系统也可以获得极低的漏警概率.
该系统由5个模块构成,如图1所示.
本地进程监测模块LPMM(localprocessmonitormodule)启动一个ASLR化的服务器进程,以进程状态自动机(localprocessautomaton,简称LPA)实例记录进程的运行状态;协议状态监测模块NPMM(netprotocolmonitormodule)在TCP/IP传输层之上以协议状态自动机NPA(networkprotocolautomaton)实例记录每一个协议会话的状态;攻击载荷句法分析引擎ASAE(attacksignatureanalysesengine)在NPMM检测到进程异常时,根据NPMM提供的NPA状态、攻击载荷数据和LPMM提供的LPA状态、内存镜像分析得出攻击特征并保存在ASDB中;攻击特征库ASDB(attacksignaturedatabase)以树状结构保存攻击特征,按照漏洞类型、程序名、攻击句法类型作分类,便于攻击特征的快速存取;网络数据过滤模块NFM(networkfiltermodule)在TCP/IP传输层之上监测各个网络数据会话,根据当前NPA、LPA的状态、当前会话数据载荷和从ASDB反馈回的攻击特征之间的比较结果,检测并截断恶意会话.
ASLRedprogramASAEASDBNPMM(NPA)StateNPAandattackpayloadStateLPASignatureMem.
ImageSignatureNetworkdataflowCur.
StateNPACur.
StateLPANFMPassInternetLocalLPMM(LPA)BeyondtransportlayerFig.
1Systemarchitecture图1系统结构ASAE根据三元组(NPA状态,LPA状态,内存镜像)产生攻击特征的过程,是一个高资源消耗非实时的过程,在我们的系统中,只有进程异常才会触发这一过程,只有遇到基于未知漏洞的攻击时才有可能发生这种情况.
在一个实用的自动化的响应系统中,对虚警概率的要求比漏警概率更为苛刻.
如果虚警概率过高,系统虽然不容易漏过攻击数据流,但是很可能拒绝很多正常的数据会话,其结果是系统的可用性被显著降低.
我们的系统在过滤网络数据流的,同时也兼顾NPA和LPA的状态,可以在不提高漏警概率的前提下显著地降低虚警概率.
由于NFM比较消息载荷是否符合攻击句法的过程是一个相对低效的过程,如果在阻断恶意会话中没有NPA和LPA的参与,系统就不得不在每一次收到网络数据的时候都与攻击句法比较.
我们的系统只在NPA和1522JournalofSoftware软件学报Vol.
19,No.
6,June2008LPA的状态都匹配时才开始一个比较操作,显著地提高了系统的数据吞吐率.
由于代码注入攻击与网络层无关,所以,NPMM和NFM部署于网络传输层和应用层之间对系统功能没有影响,同时,部署于传输层之上使得系统可以处理像HTTPS,SFTP这样的使用传输层加密的应用协议.
2攻击载荷的自动化句法分析现有的一些自动化的攻击特征生成方法,如文献[1517],其本质上是基于统计的方法,把消息载荷看作无差别的字节串,完全忽略了攻击载荷中包含的句法信息,所以生成的特征在更大程度上依赖于具体的攻击程序而不是面向漏洞,而且这些方法需要大量的攻击样本数据,不适用于对实时性要求很高的系统.
我们希望生成一种面向漏洞的攻击特征,从而可以识别和滤除基于该漏洞的各种攻击变化.
一个思路是利用攻击载荷中包含的句法信息.
同一个漏洞利用方式可能有多种,但是每一种利用方式有固定的句法.
例如,一个栈溢出漏洞,可能的利用方式只有溢出某一特定的缓冲区,用特定的数值覆盖某几个特定的指针或者返回地址.
缓冲区的位置,被覆盖的指针、返回地址等是确定的,所以,不同目的的攻击载荷必须按照某一确定的顺序包含这些确定的值.
我们把代码注入攻击按照漏洞类型分为4种,即基于栈溢出漏洞的攻击、基于堆管理信息的攻击、基于格式字符串滥用的攻击和基于其他数据结构的攻击.
前3种可以分析出攻击类型和句法结构,最后一种可以得出类型信息,但是不能准确得出句法结构,此时,系统的漏警概率没有显著变化;而响应攻击时,虚警概率有所升高.
幸而目前大多数代码注入攻击都是基于前3种类型的,因此,目前我们将主要的研究工作集中在针对这3种攻击类型的防护上.
这里需要指出的是,对于攻击者来说,不是每一个漏洞都有多种可用的利用方式,大多数情况下只有一种方式是可能的.
由于篇幅所限,对于每一种类型的漏洞,我们只示例性地给出对一种利用方式的攻击载荷句法分析过程.
代码注入攻击在实现过程上可以分为两步:首先,攻击者利用进程的某些缺陷(如对缓冲区缺乏检查、对格式字符串处理不当、存在悬疑指针等等)远程向进程的线性地址空间注入一段代码;其次,设法利用函数调用指令等控制流转移指令转而执行这段代码.
我们注意到,进程的控制流程改变是代码注入攻击过程的分水岭,在执行控制流转移指令之前,进程执行的是本地代码,在执行这一指令之后,进程执行的是恶意代码.
我们以符号Ij表示这一控制流转移指令,以符号Ic表示引起进程崩溃异常的指令.
我们记Ij跳转的目标地址为Addrshellcode,这一数值必须在注入代码的过程中写入某个内存线性地址,记为Addroverwrite.
记代码注入前该地址保存的数值为Addrredirect,即代码注入前[Addroverwrite]=Addrredirect,代码注入后[Addroverwrite]=Addrshellcode.
2.
1基于栈溢出漏洞的载荷句法分析图2给出了函数调用栈的结构.
攻击成功发生的前提条件是函数局部变量中必须包含一个足够长的、可以被越界改写的数组,并且该数组以上必须包含可被利用的地址数据,例如,函数指针或者函数返回地址.
如果进程对接受外界输入的数组a缺乏合适的边界检查,则攻击者写入包含恶意代码的数据到数组a,并且用数值Addrshellcode覆盖地址Addroverwrite处的内容Addrredirect,当该数值由于函数调用(调用返回)被载入EIP时,恶意代码得以执行.
进程异常原因有两种:一种是攻击者不能猜测出恶意代码的入口地址,所以Addrshellcode指向的是一个无效的地址,当进程把这个值载入EIP后将发生内存访问违例,此时Ij=Ic.
通过分析Ij引用的线性地址,我们可以获得Addrshellcode;另一种是Addrshellcode被误指向进程的其他数据结构,进程在执行完Ij后的若干步内,执行Ic试图引用一块无效的内存区域发生异常,并且有Ij≠Ic.
此时,仅仅从Ic反向推演出Ij是不可能的,我们采用的办法是在LPMM中从LPA记录下的进程状态为起点正向重新运行程序,同时跟踪进程控制转移指令的目的地址从而发现Ij,进而得出Addrshellcode,这个过程可能需要重复多次.
无论哪种情况,在发生内存访问违例时,控制寄存器CR2存放违例线性地址,在内核栈上会保存当前EIP指向引起内存访问违例的指令.
通过比较EIP和CR2的内容是否匹配就可以区分这两种情况.
最后,我们可以得出此种栈溢出攻击载荷的句法结构:{SYNTAX}={VLB|Addrshellcode|VLB},其中,Addrshellcode是只与具体漏洞相关的确李闻等:基于异常诊断的代码注入攻击自动分析和响应系统1523定值.
VLB是指不定长度的字节串.
Returnaddressf0SavedFPf0Localvariablesf0Argumentsf1Returnaddressf1SavedFPf1ArrayaFunctionpoint*pFunctionf0:.
.
.
callf1.
.
.
retFunctionf1:.
.
.
void*p;chara[];*p=a_function;.
.
.
retLocalvariablesf0Stackframef1Stackframef0Code:HigheraddressLoweraddressReturnaddressf0SavedFPf0Localvariablesf0Argumentsf1AddrshellcodeShellcodeFig.
2Astack-basedcodeinjectionattack图2一种栈溢出攻击2.
2基于堆管理信息的攻击载荷句法分析基于堆的溢出攻击一般通过改写堆管理数据块内的内容来实现.
由于篇幅所限,本节给出对基于堆管理数据块的溢出攻击的最一般的利用方式的分析,其他基于堆管理数据块的高级利用方式,例如double-free、构造虚假数据块等的利用方式细节,可参考文献[19],分析方法不在本文给出.
图3给出了Linux平台上的堆结构,堆由一系列不同大小的数据块组成,所有的空闲数据块使用双向链表连接起来.
有些数据块已被分配给用户,例如chunk1;有些数据块处于空闲状态,例如chunk2/chunk3/chunk4.
两个空闲块在线性地址空间永远不会相邻,如果在堆内存分配/释放函数调用后有这种情况发生,则两个相邻的空闲块被合并为一个.
Fig.
3Aheap-basedcodeinjectionattack图3一种堆溢出攻击在图3中,如果chunk1被释放,chunk2就必须要被从空闲块链表中摘出,于是有chunk2→Fp→Bp=chunk2→Bp,相当于:[chunk2→Fp+12]=chunk2→Bp(1)chunk2→Bp→Fp=chunk2→Fp,相当于:[chunk2→Bp+8]=chunk2→Fp(2)如果攻击者在chunk1释放前溢出了chunk1内的数组,则导致改写了chunk2的Fp和Bp指针,使得UserdataArrayaSizeofpreviouschunkOlduserdataSizeofchunk1Sizeofchunk1Sizeofchunk2ForwardpointerFpBackwardpointerBpShellcodeSizeofpreviouschunkOlduserdataSizeofchunk1Sizeofchunk1Sizeofchunk2Addroverwrite-12AddrshellcodeCodetojumpover8bytesAddroverwrite-12OlduserdataSizeofpreviouschunkSizeofchunk3ForwardpointerFpBackwardpointerBpOlduserdataSizeofpreviouschunkSizeofchunk4ForwardpointerFpBackwardpointerBpChunk1Chunk2Chunk3Chunk4Addrredirect(returnaddressf0)SavedFPf0Localvariables1Localvariables2StackAddroverwriteAddrshellcode+8HigheraddressLoweraddressAddrshellcodeAddroverwrite12Addroverwrite121524JournalofSoftware软件学报Vol.
19,No.
6,June2008Bp=Addrshellcode且Fp+12=Addroverwrite(3)当块释放函数调用时,Addroverwrite原来包含的地址数据Addrredirect将被Addrshellcode覆盖,于是,当控制流程转向Addrredirect时,恶意代码得以执行.
在部署了地址随机化之后,堆块的基地址是一个随机值,攻击者不能猜测出Addrshellcode和Addroverwrite的确切值而引起进程异常.
第1种情况是,由于块释放函数执行时,Addroverwrite指向的不是一个可写的线性地址,在执行块释放函数时异常,此时Ij还未执行且Ij≠Ic.
通过分析Ic试图写入的地址可以获得Addroverwrite,进一步根据公式(1)、公式(3)获得Addrshellcode.
第2种情况是,Addroverwrite可写,但是Addrshellcode+8指向的地址不可写,此时与情况1相同,可获得Addrshellcode,进一步由公式(2)、公式(3)获得Addroverwrite.
第3种情况是,进程在执行完堆释放函数,执行指令Ij或者是执行Ij后继的某一指令时异常,对于前者有Ic=Ij,我们直接分析Ij的目标地址可以获得Addrshellcode进而获得Addroverwrite,对于后者有Ic≠Ij,我们需要使用类似于第2.
1节中的自动调试过程最终获得Addrshellcode和Addroverwrite.
最后,我们可以获得攻击载荷的句法结构,可以表示为{SYNTAX}={VLB|JMPAddrshellcode+8|VLB|Addroverwrite12|Addrshellcode|VLB},其中,Addrshellcode和Addroverwrite是只与具体漏洞相关的确定值.
2.
3基于格式字符串滥用的攻击载荷句法分析基于格式化函数攻击是1999年前后出现的一种攻击方法[18],程序中的格式函数,例如*printf,syslog等的格式串参数如果部分地可以被攻击者控制,攻击者就有可能以任意值覆盖进程任意内存区段的内容.
一串"%"格式符指导格式化函数如何处理后继参数.
在使用_stdcall函数调用方式时,参数被由右到左依次压入栈中,如图4所示.
格式参数中每一个格式符对应一个调用栈中参数,格式字符串函数根据格式符把对应参数位置处的4个字节解释为一个数值或者是一个地址.
格式符"%n"使得格式化函数把当前打印的字节数以长整数的形式写入对应参数指向的内存区段中,通过巧妙地构造格式参数,攻击者可以利用"%n"结合其他的格式符在格式化函数调用中以任意值覆盖任意内存区段的4个字节.
Fig.
4Aformatstringattack图4一种格式字符串滥用攻击格式字符串攻击比较特殊的一点是,攻击者构造的跳转地址及其覆盖目的地址可能都不直接包含在攻击载荷中,而是通过"%nx","%nu"(n为一个大整数)等格式符间接写入,所以很难把通过分析进程异常得出的特征地址Addrshellcode,Addroverwrite和攻击载荷对应起来.
但是,由于我们在LPMM中保存了函数调用的参数信息,所以,我们可以准确获得格式字符串参数.
在实践中,我们检查消息载荷中是否包含"%n"格式符且该格式符之前是否包含形如"%nx","%nu"的格式符.
由上所述,攻击载荷的句法结构为{SYNTAX}={VLB|/%n/|VLB|/%(\d)*u|%(\d)*x|%(\d)*d/|VLB}.
2.
4攻击载荷句法分析引擎ASAE和自动调试ASAE根据LPMM提供的进程异常后的数据映像判断攻击类型Type,然后调用句法分析逻辑分析句法Returnaddressf0HigheraddressLoweraddressFunctionf0:.
.
.
charbuf[100];sprintf(buf,%d,%x,%10000u,%x,%n,1,2,3);.
.
.
SavedFPf032"%d,%x,%10000u,%x,%n"1AddressofformatSavedFPsprintfReturnaddresssprintfAddressofbufbuf%n%x%10000u%x%dCodeDataOverwritewith10003.
.
.
"%d,%x,%10000u,%x,%n"李闻等:基于异常诊断的代码注入攻击自动分析和响应系统1525Syntax.
进程发生异常时,某些情况下可以直接获得攻击类型、攻击载荷的句法结构信息(可辨别的异常),其他情况下需要重新启动进程,改变进程栈、堆和数据段的基地址,反复这一过程直到可辨别的异常出现为止,这一过程称为自动调试.
改变数据结构的基地址,相当于改变这些结构在进程的线性地址空间中的布局,在调试过程中,每两次布局相互不重叠.
如果始终没有可辨别的异常出现,则把整个攻击载荷作为攻击特征,此时,该攻击特征不能用来识别攻击变种.
所幸,在绝大多数情况下,经过自动调试都可以出现可辨别的异常.
目前采用的这种自动调试策略是一种比较低效的枚举策略,虽然不影响系统的性能(自动调试过程只有在进程异常时才可能被启动),但是会降低攻击特征的分析效率.
基于先验知识的高级调试器正在研究中.
在不同的硬件平台/软件平台/函数库版本上,同一种利用方式的分析逻辑可能有所不同.
如果对于一个漏洞类型可能的利用方式有多种,相应的句法结构也有多种.
每一种句法的分析逻辑被做成一个插件.
在目前的系统已经实现的插件中,基于栈溢出漏洞的有4个,基于堆溢出漏洞的有8个,基于格式字符串漏洞的有18个,基于其他数据结构的有2个.
3进程自动机和协议自动机本质上,服务器进程就是一个对网络消息自动作出响应的状态自动机,我们用应用自动机模型(applicationstateautomaton)对它作一般性的抽象.
一个应用自动机对网络消息作出响应的同时,改变外部协议的状态(protocolstate),反映网络协议进行到了哪一步.
而它的每一个协议状态可以细化为若干个进程状态(processstate),进程状态的转移,反映了该自动机处理某个网络消息时进程内部数据的改变,如图5所示.
在我们的模型中,分别以进程自动机和协议自动机加以抽象.
ASLR化的服务器进程在受到攻击而异常之前将停留在某个状态,我们定义该状态为受攻击状态(vulnerablestate).
我们的模型基于以下两点假设:(1)攻击者必须使被攻击进程达到受攻击状态时,才有可能实施代码注入攻击;(2)有效攻击代码是一次注入的.
首先,在现实世界中,大多数漏洞利用起来需要严格的前置条件,攻击者必须使服务器处于某一个特定握手阶段或者获得一定的权限,例如,Serv-UFTP服务器的MDTM栈溢出必须在攻击者以合法账户登陆之后才能利用;其次,攻击者必须精心构造消息载荷保证消息载荷的完整和有序性.
由于两次注入间隔之间进程的状态不能完全由攻击者控制,所以,分次注入实现困难而且成功率很低.
不排除攻击者首先注入一段有效攻击代码,下载另一段有效代码的情况.
在这种情况下,第1段攻击代码必须能够生效,从而必须被一次注入.
基于上述两个假设,我们可以仅仅检查攻击状态之前该会话所接受的一个网络消息载荷是否匹配攻击语法.
这样做可以极大地提高使用复杂网络协议的服务器系统的效率,同时,消息载荷匹配算法的设计可以大幅度简化,而不会提高响应虚警概率.
有些服务器使用非常简单的网络协议例如HTTP.
此时,仅仅把受攻击协议状态包含在攻击特征中对提升系统性能和降低虚警概率没有太多帮助,所以,我们需要在攻击特征中引入更细粒度的状态——进程状态.
S3S0S1S2S4S5S6S2.
0S2.
2S2.
1VulnerablestateNormalstateSxProtocolstateSx.
xProcessstateMessagetopayattentiontoNetworkmessageFig.
5Applicationstateautomaton图5应用状态自动机3.
1网络协议自动机和协议状态监测模块3.
1.
1网络协议自动机定义语言通过分析网络协议,我们发现应用层协议的复杂性使得仅仅从收到的网络数据无法自动地区分NPA的各1526JournalofSoftware软件学报Vol.
19,No.
6,June2008个状态,必须事先对每一个需要关注的应用层协议定义对应的NPA.
目前,没有自动化的方法替代手工的定义过程,所幸这一过程可以根据现有的RFC文档来完成.
我们必须定义:应用程序标识(applicationidentification):NPMM如何区分消息数据属于何种应用程序.
消息标识(eventidentification):如何从收到的消息数据中获得消息类型.
会话标识(sessionidentification):如何得知该消息属于哪一个会话.
自动机定义(NPAspecification):定义NPA的状态、消息以及状态的转移函数.
这些定义与具体的应用程序及攻击事件无关,而仅与应用层协议相关.
所有的定义脚本只用写一次,然后随着我们的系统一起发布给用户.
事实上,可以分多次定义一个NPA,例如,在HTTP协议中只定义"GET"和"POST"这两个方法(method)的相关状态,本质上分多次定义了整个协议状态图的各个子图,在处理过程中需要对各个子图加以合并.
附录1给出了用我们自己开发的协议自动机定义语言(processstatedefinitionlanguage,简称PSDL)对FTP协议用户认证阶段的定义.
3.
1.
2消息识别和会话分发会话(session)是在NPMM中对客户端和服务器通信单位的一种抽象,一个会话可能包含多次消息传递和状态的转移.
所以,如果NPMM的状态超过1个,必须有手段识别消息类型以及该消息属于哪一个会话.
一个服务器可能同时为多个客户端提供服务,每一次服务可能包含多个网络连接.
在NPMM中为每一个会话维护了一个NPA实例.
由消息数据中的TCP/UDP端口字段可以得知,该消息属于哪一个应用程序(applicationidentification).
根据PSDL中定义的消息标识(eventidentification),我们可以得知该消息的消息类型.
根据每一个NPA实例维护的会话列表/端口列表,我们可以得知该消息的会话ID.
当NPMM收到一个消息后,根据应用程序名、消息类型和会话ID把消息分发给对应的应用程序,同时驱动NPA实例的状态变化,NPMM不必保存所有消息数据,而只用维护当前的状态和最后一个消息载荷即可.
NPA实例的寿命不长于与之相联系的会话的寿命,现代的网络服务器应用层都有超时机制用来防止过多的未完成会话存在过长的时间而耗尽系统资源.
在我们的系统中,由于NPA要占用额外的资源,每一个NPA的寿命可能还会小于这个超时时间,如果NPA提前终止,相应的会话也被终止.
该机制可以防止攻击者恶意生成许多"半开"会话而造成服务器资源耗尽.
3.
1.
3数据块重组在传输层之上,IP分片已经被重组,NPA建立于网络传输层和应用层之间,所以无须关心底层的IP分片细节.
虽然如此,每一块被NPA接收的数据不一定代表一个完整的应用层消息,这种现象可能是由于TCP拥塞或者是应用程序的特殊消息处理实现机制引起的.
NPA必须区分每一块数据属于哪一个消息.
在应用层协议中,一个消息不可能跨过多个网络连接,所以,我们为每一个网络连接维护一个缓存,在接收到一块数据时复制一份并加以组装,当能够辨别出该消息的类型时,把消息传送给NPA并且清除缓存.
与第3.
1.
2节的原因相同,每一个缓存也有不大于对应连接的超时时间.
3.
2进程状态自动机和进程状态监测模块3.
2.
1函数调用返回动作到下推自动机的对应引入进程状态自动机的难点是如何定义进程自动机的状态,我们不可能像对待网络协议自动机那样为每一个应用程序通过预定义脚本的方式预定义,这样做需要为每一个应用程序写一个脚本,在没有程序源码时是几乎不可能的,即使有源代码,工作量也是巨大的.
一个想法是,通过某种对应方式在进程的函数调用——返回动作和进程自动机之间建立某种对应关系,自动化地构造进程状态自动机.
如果进程某子函数fi被调用的动作用符号callif表示,该函数返回调用者的动作以retif表示,所有的符号构成字母表Σ.
假设程序除main函数包含的子函数数目为N,则理想情况下,一个服务器在从启动到正常退出过程中的函数调用返回动作可以用形如110,1],,,,callcallcallretcallretretretcallretcallretmainijjjjimainiijjffffffffijNffffΣ的符号串表示,满足李闻等:基于异常诊断的代码注入攻击自动分析和响应系统1527(1)[0,1],,callretiiiNff∈必须成对出现(子函数必须返回).
(2)[0,1],,callretiiiNff∈之间必须有成对出现的,callretjjff(函数不能交叉嵌套).
该文法G可形式化地表示为G=(V,T,P,S),其中:文法变量集合V={A}∪{Bi|i∈[0,N1]}.
终极符号集合{,|[0,1],,}callretcallretiiiiTffiNffΣ产生式集合0,1]callretcallretcallretmainimainiijiiijPAfBfBfBfffBijNε文法的开始符号S=A.
转化为Greibach范式:V={A}∪{Bi|i∈[0,N1]}∪{Ci|i∈[0,N1]}∪{C}.
{,|[0,1],,}callretcallretiiiiTffiNffΣS={A}.
callretcallcallretmainimainiijijjiiPAfBCCfBfBCfCCfε引理1.
G的产生语言L(G)不是正则语言,G不是正则文法.
证明:见附录2.
由于该文法不是正则文法,所以不存在有穷状态自动机与它对应.
但是,该文法显然是上下文无关文法,所以,我们可以构造如下所述的下推自动机与其对应.
mansora怎么样?mansora是一家国人商家,主要提供沪韩IEPL、沪日IEPL、深港IEPL等专线VPS。现在新推出了英国CN2 KVM VPS,线路为AS4809 AS9929,可解锁 Netflix,并有永久8折优惠。英国CN2 VPS,$18.2/月/1GB内存/10GB SSD空间/1TB流量/100Mbps端口/KVM,有需要的可以关注一下。点击进入:mansora官方网站地址m...
atcloud怎么样?atcloud刚刚发布了最新的8折优惠码,该商家主要提供常规cloud(VPS)和storage(大硬盘存储)系列VPS,其数据中心分布在美国(俄勒冈、弗吉尼亚)、加拿大、英国、法国、德国、新加坡,所有VPS默认提供480Gbps的超高DDoS防御。Atcloud高防VPS。atcloud.net,2020年成立,主要提供基于KVM虚拟架构的VPS、只能DNS解析、域名、SS...
Virmach对资源限制比较严格,建议查看TOS,自己做好限制,优点是稳定。 vCPU 内存 空间 流量 带宽 IPv4 价格 购买 1 512MB 15GB SSD 500GB 1Gbps 1 $7/VirMach:$7/年/512MB内存/15GB SSD空间/500GB流量/1Gbps端口/KVM/洛杉矶/西雅图/芝加哥/纽约等 发布于 5个月前 (01-05) VirMach,美国老牌、稳...