中国IDC圈12月28日报道,12月20-22日,第十一届中国IDC产业年度大典(IDCC2016)在北京国家会议中心隆重召开。本次大会由中国信息通信研究院、云计算发展与政策论坛、数据中心联盟指导,中国IDC产业年度大典组委会主办,中国IDC圈承办,并受到诸多媒体的大力支持。

中国IDC产业年度大典作为国内云计算和数据中心领域规模最大、最具影响力的标志性盛会,之前已成功举办过十届,在本届大会无论是规格还是规模都"更上一层楼",引来现场人员爆满,影响力全面覆盖数据中心、互联网、云计算、大数据等多个领域。

会上,长亭科技高级研发工程师 李昌志 出席IDC服务大会并为当天的安全运维分论坛做《论正则防护系统的全自动绕过与下一代防护方案》主题演讲。

李昌志-(2)

长亭科技高级研发工程师 李昌志

以下是演讲实录:

大家好,今天跟大家分享的议题是说一下正责防护系统的全自动绕过方案,以及提一个下一代防护方案。简单做一下自我介绍。我来自长亭科技,叫李昌志,之前在腾讯安全应急响应中心,负责应急响应工作,2015恩年加入长亭科技,现在做长亭雷池WAF产品相关的工作。

我们先看一下WAF,以WAF现在的情况来说,业内有两种方案是做这种东西。一种是传统的方法,在一个通用的正则体系有很多的规则,当一个请求出发到一个规则就会出发WAF内部的规则,在服务器后端干掉。新一点的方案就是基于没有规则的无规则体系,匹配一整套规则的文本,用这种方式会达到一个比较高的准确率和召回率。目前来看,从2014年年底提出这种方案到实施到产品落地大概有两年,我们是全球第一家提出用这种方式去做外部攻击检测的公司。到目前为止,业内有很多厂家赞同我们的这种做法。2015年,我们在全球发了一个议题,也是讲关于这个东西,当时同行也觉得这个方案非常好。可以看到前几天阿里云发了一篇文章,说阿里云的WAF云盾已经做了一些相关的工作。在上一周阿里云也发布了一套新的WAF的检测体系,也是基于这种规则。传统的WAF使用的方案已经比较陈旧,已经存在大量的被绕过、被攻击的可能,要解决这么多问题,必须要提出一个新的思路,怎么去建立一个比较新的外部检测的流程和方案。

先看一下传统WAF是怎么做这个东西的。首先一个传统的WAF拿到用户的请求,会看到一个这样的UIL,首先进入WAF以后,这是WAF整个内部的执行流程,它首先会有流量清晰的模块,像这样的UIL被解析以后,可能会PASS成上面这种情况,它有Q参数,这个Q参数的内容是这个东西,这个东西还是有编码的,这边普通的用户都使用不了它,WAF会在下一步有输入标准化的东西,输入标准化的模块在后端可以把它理解为解码的标准,但是在传统的WAF里面,它并没有很好地实现解码这个功能。看一下结果,当它没有去实现一些经常的解码功能,它就会使用一系列比较古老的替换方案。比如它看到这个%3C,就会替换成小于号,它会通过这样的方案,把一些大小写的问题都转成小写,通过这个输入标准化模块以后,这个请求就会得到一条像输入标准化那边列出来的责任标签的东西,经过这个东西以后,WAF在最后还有一个匹配的规则集,传统的WAF会有传统的规则系统,根据黑客的攻击特征,会抽象出很多的规则和特征。当某一个请求里面PASS出来的东西,PC到某一条规则,我们就认为它是一条攻击。可以看到这边输入标准化出来的东西,在那边输入规则集里面匹配的第一条规则,我们就认为它是一个匹配那条攻击的规则。当WAF知道现在请求已经被匹配了,WAF说你是个攻击,在最后它就会执行一个相应的策略,这个策略是由管理员来配置的,可能是把你干掉,或者是记一些相关的日志。这就是整个传统WAF对流量的解析和拦截的过程。

我们看一下思考题。写过代码的同学大家应该都知道,这是一个括号匹配的问题。传统的WAF既然是使用正则表达式去抽象一些规则,那怎么去使用正则表达式描述这样的规则呢?你怎么写一个正则表达式,使你写出的正则表达式可以匹配出括号需要的规则。你如何使用正则表达式描述这样的规则,有N个A和N个B的链接行为。使用正则表达式完全做不到这一点,当一个攻击符合这样的特点,假如有5个A跟5个B,那一个正则表达式是完全没有办法匹配到这样的特征。当一个攻击符合这样的特征,你使用传统的WAF结合体系就根本没有办法拦截这样的攻击。这是一个非常大的弱点。

我们说下RE与FA。RE就是正则表达式,FA是有限自动机。它们之间有什么关系呢?我们先看几张图。

这是一个比较简单的正则表达式,一个这样的正则表达式,我们画出一个正则表达式的流程图是这样的,这是它的一个起点,从起点开始它可以匹配一个大写的HA,或者没有,后面循环无限是小写的ha,最后可以匹配一个或多或没有的感叹号,像这样的整个规则就可以用这样的正则表达式来说明。如果把它画成一个有限自动机是什么样的呢?在这边可以看到,首先是它的出始状态什么都没有,接受一个大写H和一个小写h,一直循环,有两个终止状态,5和6,当你接受一个小写a的时候,你的个自动机可以终止,或者接受一个感叹号的时候。既然这样的话,你可以通过判断发现这两张图虽然表现的方式不一样,但是它们表达的意思完全相同,这样可以得出一个结论,正则表达式和有限自动机是完全等价了,可以互相表示。

还要牵扯到另外一个概念就是CFG,把这种形式语言分为四类,根据表达能力的强弱一次往下排,0型是图文完备的语言,1型是上下文有关,2型是上下文无关,3型是正则文法。像3型文法的表达能力是属于最弱的,它可以表达文法的类型会非常局限,非常少。我们经常使用的编程语言都属于上下文无关文法,像常见的C语言、java都属于上下文无关文法,而且其中有一小部分会使用上下文有关文法的东西。如果是这样说,现在看一下RE和CFG的区别在哪里。RF使用的是正则文法,CFG使用的是上下文无关文法,CFG能表达的语言范畴、规则集远大于正则文法。我们还知道每一种形式语言的文法都可以用一种自动机来表示。可以用自动机去匹配这种文法,去匹配正则文法称为FA,去匹配上下文无关文法的类型称为PDA下推自动机。

这样的话可以看到有一个这样的图。蓝色的圈是RE整个上下文无关文法描述语言的集合,可以看到RE正则文法所描述的文法的集合、语言的集合,CFG所描述的语言可以包括RE描述语言,并且远大于它。

这样我们想到一个基于正则防护系统存在的很明显的弱点。现在像行业里边存在的很多安全软件,它去匹配一些攻击特征的时候,都是使用RE描述一些常见的特征,但是刚才提到,常见的使用文法都是CFG,那么就会存在一系列的问题。SQR语言本来存在的语法结合是CFG的圈,现在存在三种情况,一种是只保函RE,不包含CFG,或者重叠,或者只包含CFG不包含RE,在这种防御系统分别代表什么意义呢?当一个WAF使用RE的规则库使用CFG的时候,它们重叠的部分可以认为是WAF所命中的攻击。只存在RE的地方不包含CFG,这整块是误报。另外一块相对就弱了,可以根据这个图看到,这么大两个圈,它们重叠的部分是很小的,会存在大量的漏报和误报。

这样的话我们就可以把传统的基于正则表达式的规则集合,可以列出它存在的热点。首先是维护规则问题,一个基于正则表达式的WAF拿出去以后,并不说这个WAF永远就不更新了,其实它的规则库是需要随着时间、随着事件,一直要有人维护它,但是这个维护的过程是非常费心费力的,其次作为一个人去维护这样大的规则库也不会做得非常正确,这是一件吃力不讨好的事情。其次针对刚才那个图我们得到的结论是这样一个东西做出的效果会存在大量的漏报和误报。其次一个正则表达式要去匹配一个CFG这样的文法,一条正则表达式肯定不行,需要大量的正则表达式集合才能完备它的文法,量多了以后WAF的性能就会越来越差,并且你是根据攻击的特征去匹配流量、匹配攻击,这样的话在发生一些之前没有见过的攻击,你根本没有办法去防范未知的漏洞,当一个新型的攻击法身以后,传统的WAF完全没有办法抵挡。其次是怎么自动化绕过的算法,我们通过写一个程序,这个程序跑起来以后,就可以通过调试WAF,WAF搭在一个远端,通过一系列的行为,可以把整个正则表达的规则库弄下来,其实是非常敏感的东西。

大家都知道WAF最核心的东西就是规则库,当然规则库被别人拿到的时候,他很容易手动的找到绕过,他会抄袭你的东西复制一套新的东西出来。

我们怎么自动化绕过?首先它为什么会存在自动化绕过呢?首先传统的WAF缺少一个对不同协议、不同编码、不同内容的支持,现在外部的内容多样化,随着不同的外部应用,它会延伸出很多不同的攻击,在很多种不同的攻击下,一个传统WAF很难去支持这么多的东西,它支持不好的话,很难识别里面存在的攻击。其次传统WAF会受限于长度、字符集、参数类型等条件,其次WAF组建更新不及时,需要人工手工及时地匹配、维护一些规则库,当你的工作做的不是很好、不是很及时的话,当一个新型的攻击爆发,这个时候你的网站就会存在非常大的威胁。

既然这样的话,为什么WAF会存在这样的绕过呢?我们找了两个根本的原因:第一特征不完备,因为特征不完备所以传统WAF需要人工手工持续地更新、持续地维护这样一个规则库。其次一个正则表达式存在差异,RE想要匹配一个上下文无关的文法,你只能无限的接近,永远不能等价,当你想表达的文法无限接近它,跟它相同的时候你能表达的文法的结合远大于它,导致的结果就是你的网站存在大量的误报。综合一下就是说传统的WAF在准确率和召回率两方面是不可能同时做到都特别高。

我们这边会提出一种绕过思路。我们以SQL语言为例说一下,SQL语言使用的文法是CFG,正则表达式与CFG描述的语言存在差集,它存在的差集有两部分,首先漏报,持续漏报,我们用什么方法呢?当找到一个存在点,我们可以大概猜测,定位到这点使用什么样的敏感语法,并且我们使用CFG来有效地编码,使RE无法完全匹配CFG,当发生这种情况的时候,恭喜攻击者就找到了一种通用的WAF绕过方案。

这是我从MySQL官方5.7版本找到了文法规则,我们可以看到,刚才select,一个表,后面WHERE,后面跟了一个东西叫where-condition,既然它存在这么多东西,说明存在误报。如果是这样的话,最简单的方案,就是说我们可以升CFG,来编码where-condition,它属于表达式,我们写1+1可以,写个(1+1)÷2也行。

我们想做什么样的事情,首先知道CFG是匹配SQL这样的东西,但是我们的WAF使用的是RE。当这两个东西发生碰撞,最后找出来的东西就是一个语法判断有这样的特征,它存在于CFG,但是不存在于WAF所匹配的RE所描述的语言,当发生这样的情况,出现这样的语句,它就是一个典型的WAF绕过。

针对其他攻击,使用这种方案会更有利。因为其他语言从理论上来讲会表现的更灵活一点,因为我们知道这个SQL语言没有办法去执行,像很多常见的语言都提供一个像函数,你会传给它一个字符串,它会去执行,但是SQL不存在这个东西。五其次就是说它会存在更多的变形,字符串变形只是其中的一种。这两个问题的根本原因就是其他语言,它的语法结构相对于SQL来说会表现的更灵活一点。

说了这么多,怎么去自动化地转到WAF的绕过。在LightBulb有一个美国人发了一个议题,他讲了他的团队做了一个自动化的工具,叫作lightbulb。它是一个在WAF之间,或者浏览器之间,或者数据库之间寻找差异的系统。它会寻找WAF于浏览器的差异、MySQL的差异、寻找WAF与WAF的差异。如五你找到WAF与浏览器的差异或者WAF和数据库的差异,就绕过。

传统WAF存在一个比较明显的可以让攻击者去识别它、窃取它、绕过它的一整套方案,怎么绕过这个东西呢?

我们两年前就提出一个的方案,使用词法、语法合理的分析,对整个流量进行整体的分析,经过一个人工智能的打分,通过机器学习模型学习一整套匹配方案,会得出一个完备的模型。通过这个模型,我们得出的结果就是模型可以拿到一个语言式的攻击请求,可以深度地挖掘它里面的攻击片断,看是不是完整的攻击,如果是的话,我们可以把它标为一个恶意的请求。

今天要说的是WAF常见的三个指标。怎么去判断它是一个好的WAF,我们给它定了三个比较明显的指标。准确率、销毁率和准确率。一个WAF准确率高了以后说明它存在少量的漏报,召回率说明它存在的漏报数量,一个WAF如果存在大量的误报,它的影响就是你放防御的网站,但是你会对互联网站产生非常大的影响。召回率说的是漏报,一个黑客可以用很常用的绕过手段绕过你的WAF,你在一个网站驻守了WAF完全没有形成一个防御的体系。检测性能对后边产生的影响就是在部署WAF以后,整个网站速度有没有变慢,以及我在买这样的东西以后,我的网站请求量是50KPS,但你的WAF只能拦10万,我需要买五台,但是别的WAF一台可以撑住,我只需要买一台就可以。

WAF在保证准确率这个点的时候会有一些怎样的特征呢?首先是语法分析,传统WAF使用的是RE,新的防御思路使用的是CFG。RE和CFG是完全无法等价的,RE只能无限地接近CFG,但是永远无法等价。当无限地接近它的时候,存在的语言匹配的集会远大于CFG,这样会存在大量的误报,这是传统WAF无法做到的。使用这个方案以后,整个WAF的检测准确率就会得到非常大的提升。其次是语义分析,当语法通过了我们规定的CFG以后,我们认为现在你的请求里存在某一段攻击,但是语义分析可以精确地识别出有没有无疑的语法片断,如果有的话我们会对整个请求的恶意进行打分。打分的结果就是说,这条攻击或者这条请求存在于请求中的恶意程度。当一些小黑客去攻击一些网站的时候,他写的一些语言没有写对,这样的东西也没有必要去打分,因为它到后端得不到任何数据。其次就是打分模型,新一代的防御思路使用了一个机器学习的思路,会根据大量的流量规则库,根据所有的东西进行学习以后,会匹配出一个模型,这样的模型在现实中其实是非常有可行性的。在我们现在的结果里面,可以看到的准确率和召回率都达到99%以上,传统的WAF很难达到80%以上。

其次是召回率。如果这样做的话就需要写一个亿完整的引擎,我们可以根据一个流量特征精确地匹配出一个流量中使用了哪些编码、哪些变形,通过这些解码,以及解变形以后,我们就可以精确地提取出这个工具,或者这个请求里边哪个片断使用了什么样的攻击。其次使用语法分析也是召回率得到提升的根本原因。这个跟刚才说的那个是一样的,因为RE和CFG无法完全等价,所以我去使用一个RE这样的东西,跟SQL和GS,深存在的CFG是等价的,我们可以匹配的语言跟它可以匹配的语言不存在差异情况,你只要能够通过SQL把引擎这样的攻击片断在我们这边也可以完全把它匹配出来。

最后就是检测性能,为什么说使用了这种方法以后,一个WAF的检测性能就会得到非常明显的提升呢。CFG只需要用一套语法就可以解决所有事情,但是想让RE和CFG无限期的接近,你需要写很多的正则表达式,才能完成这样的事情。正则表达式长了以后,导致直接效率不会提升,可能有些WAF厂商把正则表达式使用了合并的引擎压缩在一起,这样存在的情况就是你没有办法去精确地、灵活地、随时地去删减一条正则表达式的规则。我们之前试过这种方法,我们可以看到在平均长度为100个字节的正则表达式,它去做一个合并的时候,当有40条这样的正则表达式,它生成的文法和规则,已经能达到100万行C源代码的规模,你去编它的的过程中会非常的痛苦。如果你的WAF存在40条这样的规则,你现在想添加一条,你重新编一个引擎所花的时间大概是好几个小时。其实传统WAF存在的正则表达式的规则数量远大于40个,你使用这种方案灵活地删减一些规则,效率也会大打折扣。

这边是我列的传统的WAF和新的WAF存在的流量检测时候的实现复杂度。可以看到传统WAF多了一个M,为什么会多一个M,其实新的也是存在一个M,但是它的M永远是1,但是旧的M是好几百,甚至好几千,像我们去分析一些比较大型的防火墙的时候,可以发现它里边其实有好几万条规则。当N和L完全相同的时候,使用新的方案效率是老的方案的好几万倍。

综合刚才所说的这些东西,现在提出一个新的WAF的检测思路,它其实是在准确率、召回率以及检测的性能三个方面都是完全可以跟传统WAF去抗衡,甚至可以比传统WAF做得更好,好很多倍这样的效果。

这是长亭科技根据一个新的WAF的拦截思路做的一整套外部应用防火墙,也是使用刚才所说的这些思路。谢谢大家!

关注中国IDC圈官方微信:idc-quan或微信号:821496803 我们将定期推送IDC产业最新资讯

查看心情排行你看到此篇文章的感受是:


  • 支持

  • 高兴

  • 震惊

  • 愤怒

  • 无聊

  • 无奈

  • 谎言

  • 枪稿

  • 不解

  • 标题党