第三届未来网络发展大会

网络全球 决胜未来

当前位置:嘉宾致词> > 分论坛二

张玉军

编辑: 共浏览:490次

谢谢徐老师的介绍。大家好,今天给大家分享的题目是“未知协议的逆向分析与自动化测试”,未知协议跟今天关联比较多是工业互联网紧密相关,首先我会讲为什么有这样一个需求,在这样一个需求下,我们初步的一个解决方案,我们的解决方案,基于我们解决方案我们做相应的工具和系统的实现,希望给大家做这个领域感兴趣同事一些参考。

我们首先看需求,我们需求刚才说过,我们基于工业互联网,工业互联网从网络的角度来讲,工业互联网最终体现公共协议,公共协议最终目的是用于工业控制领域的通信传输,那我们说工控协议本身存在天然的脆弱性,最初考虑并没有那么周全,再就是工控设备,我们最初工控设备是封闭的,再一个特定的场景下进行,但是现在随着物联网各种兴起,比如说工控设备基本上不再具备物理隔离的条件,因此工控协议之上基于IP协议运行,连接在公网上,这造成了安全的问题。

这里有一个网站,这个网站能够对于全球端口进行扫描,扫描主要是工业控制里面典型的协议,(英文),它能够扫描出来,我们其实许多的设备关口以这个读取,通过特定的命令对设备的状态进行改变。因此,刚才我们说工业控制面临了问题,举了例子,比如说病毒,工业控制计算机,能够从公网上切入进去产生一些问题。

另外一个观念也说了工业控制本来属于私有的范畴,我们说随着互联网的兴起,私的公有化,我们说私有协议物理隔离条件不再具备,总之这两点,我们说第一个最初设计的时候,他是想物理隔离,因此他许多安全的设施,其实考虑并不是那么周全,他想主要我们数据能够通,有控制过程,相应的认证、授权、加密这些东西考虑都不是很清楚,第二个他的安全还是依赖于工控系统的物理隔离,这两个条件都已经打破了,为什么报告的题目我们没有取得工控协议,在于我们其实说了,不管是对工控协议还是特定的军网通信协议,还是内部通信协议在我们来说整个测试看来,都是属于一个未知协议的范畴。

所谓未知协议的范畴我们并不知道这个协议本身协议规范到底是什么,我们说试图在不知道协议规范的前提下,我们对这个协议的实现跟协议实现相关的设备,系统我们能够进行一些安全的探测,我们根据安全探测的结果对他相应的加固。我们常用安全分析手段基本三类,我们第一类当然要做静态分析,我需要对这种整个实现的代码进行分析,另外一个叫做动态分析,动态分析相当于我是把整个系统或者是设备当做一个黑盒设备,我从外面进行激发相应,观看你这种反应以及你的处理能力,还有一个符号执行,符号执行是代码更深层次的东西,我们想象一下,其实我们刚才强调了,这些应用环境以及接入手段都不是面向公众的,我们协议规范也不是面向公众的,我们做静态分析和符号执行都不是现实的一种手段。

因此我们说这种动态分析是把整个的系统当做黑盒去做,应该是可行的手段,动态分析里面其实主要的就是压力测试,这个我们都知道,压力测试一般来讲对于整个系统的业务逻辑其实要求比较严,你就把相应有效数据包进行大规模的复制,大规模的并发就可以,因此我们今天关注是模糊测试,我们希望测试它更多功能和业务逻辑层面上的反应和处理的这种准确性。

我们说到底什么是模糊测试,模糊测试是一种典型的测试技术,那么他通过自动或者是半自动的方式,生成大量的数据对于未测的系统进行发送,同时我们实时预测,我们用于检测设备或者是系统实现的安全漏洞,我们说这是他基本的流程,基本流程来讲,我们说我们总是依赖于对协议规范的理解,我们基于协议规范我们才能生成真实的测试数据,我们才会基于真实的测试数据我们添加我们的便宜规则,这样的前提在公共工业控制领域我们难以获得它协议的规范原则。

第一个前提就是我们做这样一个工作面临一个主要的挑战,那么当然我们说,模糊测试有好处,刚才说是自动化的测试过程,能够节省人力成本,测试速度快,同时加载现行已有的手段会发现,测试能力,我们今天的报告探究对未知协议我做模糊测试应该做到这一点。

我们说现在通用的模糊测试一个基本的框架,我们看到了其实是分了这几块,左上角基于对协议的理解,我们生成相应的数据,我做一个工具实现这个,右端是被测的设备,我们通过这个设备添加状态检测的代理或者是相应的模块,我在测试的过程中,我在通信的测试控制的过程中,我要实时的探测被测设备的状态,这是通用的过程,我们刚才说过了这样的测试过程,如果拿到工业控制领域里面,因为是协议未知,又面临这样的问题,我们怎么做到这一点。

我们来看这样一个通用的框架,其实我们分析这样几个问题,第一个问题显然我们知道,他的前提就不成立,我们协议规范是不知道的,那么第二点在中间的测试生成和执行环节,我们现在的便宜规则还简单,就是数据填充因为是人为的,在测试生成和执行环节不具备漏洞的针对性,或者说测试能力是有限的。

第三个因为我们说协议的规范都是未知的,我需要在被测的设备上添加一个监控显然也不具备特点,异常监控也面临着挑战,我们今天这几个方面怎么做到希望跟大家探讨,我们怎么做其实也简单。

我们说我们逐步的,不是我们存在三个问题,我们三个问题逐一的进行解决,相当于我们做这样一些东西,第一个你不是检测,很难实现,我们挪到测试这块主动的响应识别,你不是说协议的规范未知,我们知道是什么?我们知道肯定是抓取的流量,我们根据流量通过意向分析获取协议的含义,所谓协议含义包括了你协议的数据包应该是什么样子,数据包里面各字段应该代表什么样的含义,这样的话我们通过流量把协议的基本规范能够获取。

我获取基本协议规范之后,因为我整个规范以后各个字段都是通过自己学习出来的,我比人工复杂多一点,测试能力好一些,我们基本做这三块工作,逐一来看一下。这个图体现我们从标准、一个通用的解决方案过渡我们想解决的几个关键问题,关键问题就三个,我们刚才说过了,第一个我们做协议的逆向分析,第二个基于协议的逆向分析做多维的数据生成,第三个就比较简单,第三个点更多是一种想法,更多是一种很简单的工程实现,我们做主动的状态检测,你不让我安装什么东西,我外围做实时的监控,这三个点分别对应的,这个分析通过原始的数据包,我做一下分析,我做分析之后生成结构化的数据和含义,我做多维的数据生成,我通过实时的通信过程做状态的检测,获得测试的结果。

第一个协议的逆向分析,我们说目标识别协议,生成最后协议文本,我们采用是几个步骤,基础路线简单说这几个步骤,每一个步骤里面可能为了提升效率、为了提升准备性需要进一步深入研究。

第一个我们说提取是原始的数据,我从原始的数据里面把晶核数据跟协议紧密相关的数据我提取出来,第一步我把无用、协议相关的数据过渡掉,第二个我剩的跟协议相关的数据,把协议的类型记录下来、获取下来,剩下我把整个报头确定,剩下跟协议相关、直接的数据部分。

在获取晶核部分的时候,一些无意义的数据序列,什么东西是有意义的,有意义是我们数据包结构,以及我们每一个字段的含义,因此下面要做结构化的处理,结构化的处理其实就是有比较现成的方案可以满足一些需求,我们对竞合序列生成这样,建立生成(英文),对各个数据包,每个协议数据包也有可能有不同的性质,我们通过序列对比方法,合并最近的序列得到匹配之后,总之我这样一个东西目的是把无意义的这种数据流做成有结构的,可能是有价值的一些数据序列,现在这样一个步骤其实有一些方法满足需求,当然一会儿也会看到基本的方法里面其实对复杂的数据包处理很弱,我们也承认,这是我们后一步,我们现在说机器学习,刚才李丹老师说,机器学习里面做特征学习要做这一步,我们确实开始做这一步,我们讲初步可以用的方案。

做结构化处理以后只是有了结构,我们仍然享受到每一个结构到底代表着什么样的意思,我们就需要发挥我们的这种在测试领域,以前积累的经验,我们说我们觉得测试的时候,这些字段能分成这么几大类,第一个需要把特殊的字段分析出来,数据的长度等等这些东西不对的话,数据包会丢掉,还有静态的,很少发生变化,比如版本号,类型号这是静态的,还把动态字段进行合理的划分,在合理合并试图推导出到底这样一个东西背后隐藏着可能是什么样的含义,我们知道这个含义以后我们才可能进行有针对性的变异,我们后来描述协议规范的一个脚本。通过这样的表述我们知道这样的协议应该是一个什么样的东西,这样的东西我们猜的差不多,我们再往后面去看。

协议识别以后我们做数据生成,我们基于识别出来可能是正确的东西,我们做相应的变异做更大的测试案例,它的目标根据协议作出脚本,我最终测试数据,我的目的是探测是不是有已知的漏洞没有堵上,可能有未知的漏洞没有算,这个采用刚才几大类分片,我们进行填充。

第一个静态字段,当然我们给正常的填充,我们加一个正常字段的变异的,你拿样本流量很少可以变化的,有些东西你没有获取因此我们变异。再一个动态字段,我们分了几大类,分别是字符、字节、随机数、分隔符、类型字段等等,我们分成这几大类,我们相应做测试案例生成的时候,我们进行相应的变异,这些变异里面我们看到可以探索很多东西,我们能够探索命令等相关的东西,根据这些规则形成相应的多维数据。

这些多维数据可能不够的,我们定了一个可扩充的模糊数据库,可扩充的模糊数据库目的可以通过,我们说有些东西是自动生成的,有些东西我从其他地方学习到的,我上传到数据库,最终我希望生成的测试数据有更好可扩展性和代表性。

第三个填充就是特殊字段,比如说我长度字段等等这些东西有问题的话,这些数据包不会接受,称为特殊字段。最终我们数据发往测试。

第三个方向点我们主动探测,无法添加程序我们用主动的探测方式,我把最右边的监控拿到左边测试,我们探测的手段比较简单,我们分为两类,探测过程中实时探测,实时探测目标服务,这个大家一看就知道我想表达什么意思。

最后简单说一下,这样基本的解决方案,更具体我们说字段的划分,学习的算法没有讲,我们讲基本的框架和思路,基于这个我们基本框架分成三个部分,第一我们说WEB模块能做这些工作,另外它保留了一个,比如你识别出来的东西我保留人工干预的机会,能够人工结合学习的过程共同去测试。第二部分是协议识别模块,我刚才讲了几个过程。根据数据包的信息我形成协议信息,我最终生成协议的描述脚本,执行与检测模块就生成,针对数据去测试,根据响应识别来走,系统之后生成测试报告,我们做了几个简单的实验评价一下,看这个东西能够做到什么样的特征。

第一个我们说准性的评价,显然我们说总是希望这个东西识别出来的协议和原来的协议,从结构上应该差不多,我们抓取了一百个协议里面MODBUS的协议包,下面是协议本身自己的规范。

从这个图上我们能够看到下面是我们通过这样一个工具分析以后得到的协议机构,我们可以看出来对于整个字段边界的划分还是基本是吻合的,但是会也一些静态字段和动态字段的识别,这个关系我们说最终我们生成的东西是能够跟被测的系统,去跟它进行交互就可以来看。

下一个测试数据,我们刚才识别出来了一个协议的结构,我们根据识别出来协议的结构,我们去生成响应变异数据能不能更被测系统识别出来,我们装了一个(英文)版本进行测试,其实我们能够发现我们根据我们生成的变异数据,确实能够被被测的系统识别出来,并且正常的响应,这是准确性的评价。

另外效率评价,模式测试没有明确的目的,就是用大量的、非常多的数据群体的方式对你进行测试,效益是一个很重要的方向,我们比较了一个跟发展,跟它进行了一个典型网络协议的工具,我们没法做协议的意向分析,做数据的生成,我们仅仅做协议的生成效率的比较,比如我们跟他同样是以(英文)为例,我们生成数据包测试,我们可以看到对我们系统来讲,它的内存的消耗量和生成的时间都远比(英文)效率更高,我们是边执行边生成的方式,不像现在的工具靠人工输入的规则,在人工输入下变异。

另外是通用性的评价,我们总希望这样一个东西不仅仅用于工控,对SMT,SMT也是比较简单的,我们划了SMT数据包以后,我们同样能够做这种协议的意向分析和自动生成,生成以后我们真正能够测试SMT的响应能力和响应速度,因此我们说这样一个东西能适用多种简单结构的东西,这地方特意强调简单结构,我们想象一下这个事情做复杂了,是一个非常难的事情,我们后面还在继续接着做下去。

最后做一个简单的总结,我们做这样一个东西有什么用?我们主要说有一些场景里面协议的规范其实是未知的,我们总是希望通过抓取的流量对未知的协议我们具有一些简单的理解和进行脆弱性分析一些辅助的手段和可行的工具,因此我们做了这样一个工作,这样一个工作做三方面,逆向分析和主动的状态探测,我们希望在可用性、效用、通用方面真正满足现实世界的探测和测试的需求,这仍然需要我们继续努力,我的报告到此结束,谢谢大家。