APP下载

基于模糊测试的嵌入式设备协议漏洞挖掘及分析

2020-01-07刘晋兵

山西电力 2019年6期
关键词:测试数据测试用例报文

刘晋兵, 景 峰

(1.大唐太原第二热电厂,山西 太原 030041;2.国网山西省电力公司,山西 太原 030001)

0 引言

电厂及电力监控系统广泛采用各类嵌入式设备,如测控装置、保护装置、计量装置等。嵌入式设备大多采用通用硬件芯片、开源操作系统、通用协议开发,设备厂商在追求设备功能、性能及易用性的同时,忽略了设备本体的信息安全设计与实现。另外,越来越多的设备漏洞被公之于众,嵌入式设备本体的信息安全逐渐受到公众的关注,如震网病毒(Stuxnet) 利用了西门子PLC 控制器设备漏洞及SCADA 程序漏洞进行攻击。随着两化融合、智能电厂及智能电网的建设,对协议实现的安全性和健壮性进行测试就显得非常重要,对电力行业的工控通信协议进行漏洞挖掘显得越发重要。

此次模糊测试的目标是电力行业嵌入式设备的通信协议。针对此类嵌入式设备的模糊测试定义为“通过向应用提供非预期的输入并监控输出中的异常来发现被测设备故障的方法”。模糊测试数据以自动化的方式生成向被测设备提供非预期的输入。

1 模糊测试原理

模糊测试Fuzzing 采用黑盒测试的思想,通过应用程序输入大量非预期的数据,在输入的同时监控输出中的异常。将Fuzzing 测试定义为通过向应用提供非预期的输入并监控输出中的异常来发现软件故障的方法。即Fuzzing 测试利用自动化或是半自动化的方法重复地向应用提供输入。

运用Fuzzing 测试的原理,设计编译测试用例构造变异报文,检查工控协议实现的缺陷。构建完整、可扩展的动态随机分析测试框架,监控测试目标,管理测试结果。数据生成方法也就是协议模型化,数据生成要自动化,要考虑被测设备容易出现什么错误,而不是简单地随机生成,通过这样的结合来生成测试数据。

当对某些协议的值字段进行Fuzzing 测试时,在每个测试用例中必须计算并更新这个多字节的长度字段。否则,如果通信数据被检测为违反协议规范,测试用例就面临着被废弃的风险。大多数开源框架提供了生成伪随机数据的方法,好的框架甚至会包含一个启发式攻击的列表,启发式攻击会导致软件出现错误的数据序列。

错误检测在Fuzzing 测试中扮演着重要的角色,在最简单的层面上,如果目标应用不能接受新连接,Fuzzing 测试器能够检测到它的目标可能已经出错了。更高级的错误检测通常需要借助调试器的帮助,高级的Fuzzing 测试框架应该允许模糊测试器直接与附着在目标应用上的调试器通信,甚至是自带定制的调试器。

2 嵌入式设备漏洞挖掘技术的实现

2.1 模糊测试数据

一般情况会认为Fuzzing 测试和边界值分析方法是很类似的,但不同的是,Fuzzing 测试过程中不仅仅关注边界值,同时还关注任何能够触发未定义或者不安全行为的输入,因此针对电厂及电力系统中的通信协议,研发重点在测试方法和如何生成Fuzzing 测试数据上。通常测试数据的生成分为两种:一是基于变异的测试生成器。对已有的样本进行变异等操作,实现测试用例的生成。二是基于生成的模糊测试生成器。通过为被测设备使用的协议格式和交互逻辑进行建模,从而用此模型来生成输入并据此创建测试用例。

2.2 测试流程

测试方法是决定漏洞挖掘是否有效的决定性因素,测试流程包含几个基本阶段,图1 为Fuzzing系统测试框架图。

图1 模糊系统测试框架图

2.2.1 确定测试目标

有了明确的测试目标后,才能决定使用的模糊测试工具或方法。

2.2.2 确定输入向量

输入向量是模糊测试的关键,如果不能预期输入值,模糊测试的作用就会受到很大的局限。

2.2.3 生成模糊测试数据

一旦识别出输入向量,就可以依据输入向量产生模糊测试数据。数据通过自动化过程来生成,可以使用预先确定的值、使用基于存在的数据通过变异生成的值或者使用动态生成的值。

2.2.4 执行模糊测试数据

该步骤紧接上一个步骤,一般会向被测目标发送数据包、打开文件或者执行被测应用。

2.2.5 监视异常

一个重要但经常容易被忽略的步骤是对异常和错误进行监控。模糊测试需要根据被测应用和所决定采用的模糊测试类型来设置各种形式的监控。

2.2.6 漏洞是否可能被利用的判断

对在模糊测试中发现的错误,依据审计情况,判定该错误是否构成可被利用的安全漏洞,这个过程通常采用人工过程实现。

2.3 漏洞挖掘测试用例分析

Fuzzing 漏洞挖掘测试数据的生成包括预生成、随机生成、手工协议变异等,使用多种漏洞挖掘测试用例可显著提升漏洞挖掘效率,但在选择测试用例过程中,需考虑效率问题。

a) 预生成测试用例。首先研究设备给定的或特定的协议规约,理解协议规约支持的数据结构和输入值的范围,生成用于测试边界条件或者是违反规约的测试用例。预生成测试用例存在固有的局限性,该过程缺乏随机输入生成,用例被执行完,测试即结束。

b) 随机生成用例。随机方法主要被用来快速地识别并判断目标应用中是否有非常糟糕的代码,通过向目标应用发送伪随机数据,获取测试结果。

c) 手工协议测试。手工协议测试不需要自动化模糊测试器,在此,测试者就是模糊测试器。加载了目标应用后,测试者通过输入不正确的数据,尝试诱发设备或应用的一些不正常行为。该方法依赖于分析者能否在安全审计中充分发挥自己的经验。

d) 强制性测试。强制性测试是指模糊测试器从一个有效的协议样本或数据格式样本开始,持续不断地打乱数据包中的每个字节(byte)、字(word)、双字(dword) 或者是字符串(string)。这种方式几乎不要求对应用进行研究,实现一个基础的强制性模糊测试器也是相对直接的,强制性模糊测试器只需要修改数据并将其发送给被测应用。

这种方法相对比较低效,因为许多CPU 周期会被浪费在生成完全不可解析的数据上,其优点主要为:整个测试的过程可以完全自动化实现,使用强制模糊测试方法其代码覆盖依赖于一致的合法数据包。

e) 自动协议生成测试。自动协议生成测试是一种更高级的强制性测试方法。在对被测应用进行深入研究,理解和解释协议规约的前提下,创建一个描述协议规约如何工作的语法。测试者识别数据包中的静态部分和动态部分,动态部分可以被模糊化变量替代。通过动态分析包含了静态和动态部分的模板,生成测试数据,将结果数据包发送给被测应用。在此,对电力通信协议的组成与规范了解得越多,就越能在模糊测试中关注那些易引发异常的协议中的部分。

由存在潜在危险的模糊字符串和模糊数据组成的集合又被称为模糊探值。为了保证测试数据的易用性,抽象协议的数学模型和生成数据的自动化尤为重要。相对自动化生成模糊测试数据,协议数学模型的抽象就是根本。

解决如何生成数据的问题是解决方案的一部分,同样重要的问题是“生成什么数据”。如果在协议字段中去遍历的话效率不仅低下,发现问题的概率同样无从保证。因此,不能测试整个协议所有字段的数值空间,而是应该选择其具有代表性的一些数值并且找到对协议实现逻辑有影响的区间段来生成测试数据。

f) 代理模糊测试。在典型的基于网络的客户端—服务器模型中,客户端和服务器之间会直接进行通信。正如其名称所暗示的,代理模糊测试器在客户端和服务器之间的连接上充当中继。为了有效地完成这一任务,客户端和服务器必须被手工配置为指向代理服务器。也就是说,客户端把代理当作服务器,而服务器把代理当作客户端。

目前,对代理模糊测试的改进方向是为了让其更“聪明”,使用启发式规则辅助进行自动字段检测和数据变异是其中的一种方法。可以应用启发式规则将识别出来的数据进行进一步的处理。

3 设备漏洞挖掘测试

3.1 某PLC 设备

3.1.1 测试过程

PLC 的DO 上连接一些指示灯,并让指示灯处于常亮状态。然后把测试设备和被测设备通过网线直连或者中间通过一个交换机相连。按测试环境里面的配置搭建好环境,等监视器都正常工作后开始给被测设备发送Modbus 语法测试数据包,当测试进行一段时间后,原来常亮的指示灯熄灭。设备采用linux_kernel:2.6.x 内核,对外提供telnet、ftp、modbus 等公开服务。

设备在收到0x01 功能码,起始地址为0,线圈数量为0 的modbus/tcp 数据包时,协议栈会短时间崩溃,等通信恢复后modbus 服务一直处于对外拒绝服务状态。设备在收到负载为Ethernet type 跳变的Ethernet 报文,设备出现ICMP 回应延迟、对外拒绝服务现象。

3.1.2 问题分析

设备在收到测试报文的时候ARP、ICMP、TCP端口监视器全部停止工作,说明协议栈已崩溃。在测试停止后观察事件日志可以发现在测试过程中23、100、502 端口异常,稍后23、100 恢复正常,502(modbus) 服务一直未恢复,需要下电重启才能恢复。

设备在进行Ethernet 语法测试时出现ICMP 响应延迟,对外拒绝服务等问题。分析详细报文,报文对Ethernet type 进行跳变(见图2)。

在发电及电力系统现场,存在着很多这样的PLC,它们的功能各异,执行着不同的逻辑,但是一旦黑客入侵到PLC 所在的网络,并且有足够的时间展开攻击,就有可能把PLC 原有的逻辑打乱,从而破坏电力生产,进而造成经济和其他方面的损失。

3.2 MMS 的TPKT 测试某保护装置

3.2.1 测试过程

加电后通过光电转换模块把光信号转换成电信号,然后直接连接到测试设备,或者中间通过交换机相连。

设备按测试方案的方式进行连接,等到所有监视器都正常后,开始给设备发送MMS 协议的TPKT数据段语法测试,当测试进行几分钟以后,ARP 和ICMP 监视器出现异常,网络中断,TCP 监视器对102 端口的监视出现异常,102 端口关闭。停止测试后上述失败不能自动消失。

图2 Ethernet type 跳变测试用例监视

3.2.2 问题分析

TPKT 协议处于TCP 协议之上,主要传输应用层负载,例如远程桌面协议就是靠TPKT 协议来支撑。在电力设备中,基于MMS 协议的数据使用TPKT 来传输通信的负载。对问题报文结合MMS 协议进行分析。

a) 发送报文的TPKT 的length 字段超出缓存的长度,即造成内存溢出,导致设备宕机。

b) 当测试中组装了正确的协议头,但是协议负载填充的数据不符合MMS 协议规约,而设备无法处理此类报文,该缺陷可能导致协议栈崩溃。

通过上面的论述可以证明,MMS 的TPKT 语法测试可以让该型号的变压器保护设备出现网络中断无法对外提供服务的问题。由此可见,该型号变压器保护设备对MMS 协议的实现有着一定的缺陷,这种缺陷可以导致设备对外拒绝服务,从而使得设备失效,而这种缺陷如果出现在网络中是很危险的,这种漏洞如果让黑客入侵设备所在网络后进行利用,会导致设备瘫痪,进而影响电力设备的安全。而这种漏洞的根源往往是因为工业设备对协议栈的实现只考虑了功能方面,却忽略了协议栈的健壮性,进而使得人为设计的非法的或者畸形的数据包可能导致协议栈不能正确处理而致使协议栈崩溃,进而使得工业现场的设备处于危险境地。

4 结束语

本文通过构建Fuzzing 测试用例,对电力行业工业控制系统普遍使用的PLC 及保护装置开展漏洞挖掘,发现其中存在的系统漏洞,并给出设备存在协议漏洞的分析过程。

猜你喜欢

测试数据测试用例报文
基于J1939 协议多包报文的时序研究及应用
回归测试中测试用例优化技术研究与探索
基于SmartUnit的安全通信系统单元测试用例自动生成
CTCS-2级报文数据管理需求分析和实现
浅析反驳类报文要点
测试数据管理系统设计与实现
基于自适应粒子群优化算法的测试数据扩增方法
ATS与列车通信报文分析
空间co-location挖掘模式在学生体能测试数据中的应用
基于依赖结构的测试用例优先级技术