日期
06/23
2021
咨询
  • QQ扫一扫

  • Vision小助手
    (CMVU)

虹科物联网设备安全分析与防护平台:更智能的工业通信协议黑盒模糊测试
收藏
2021-06-23 11:33:00来源: 中国机器视觉网

工业控制系统 (ICS) 可能成为大型工业企业的重大漏洞。攻击者如果发现系统中的漏洞,可以将其作为攻击向量,也可以将其用于受攻击网络中的横向运动,在不同系统之间传播攻击。

传统上,连接工业控制系统的计算机网络被严格隔离。网络系统不经常更换,为了保证兼容性,协议也不频繁更新。因此ICS通常包含遗留代码,这些代码在开发时没有考虑到防御功能。此类设备往往包含软件实现错误,其中一些会造成严重的安全漏洞。

通常定位工业设备中的软件错误和潜在漏洞的一种方法是黑盒模糊测试。设备通过其网络通信端口接收大量部分随机输入,监控各种不当行为。这种方法可以在即发即弃模式下使用,被测设备连接到PC,该PC生成随机协议数据包并随着时间的推移监控崩溃。这种方法可以监控系统的重大问题,而无需对协议及其实现进行深入研究。并且对特殊的问题很敏感,可以定位漏洞,但并非对所有具有潜在安全隐患的漏洞都通用。由于研究人员通常无法访问设备的内部状态和精确的故障情况,获取的漏洞信息很少。因此,对使用纯黑盒模糊测试方法产生的崩溃进行分类甚至重现是难以实现的。

在本文中,我们讨论了一种更智能的黑盒模糊测试方法,该方法使我们能够成功发现Modbus协议的libmodbus实现中的CVE-2019-14462和CVE-2019-14463漏洞。


什么是Modbus协议?



Modbus 协议是一种广泛用于在工业设备之间建立主从通信的消息结构。尽管Modbus 协议不采用任何身份验证、授权或加密机制,它仍是许多工业设备的主要传输协议。有基于 RS232/RS485 (Modbus RTU) 和以太网 (Modbus TCP) 的 Modbus 协议版本。

下图显示了包含 Modbus TCP 和 Modbus RTU 版本的典型 Modbus 架构:

从图中可以看出,典型的架构可能包括以下组件:

  • Modbus 客户端(主站),例如人机界面 (HMI)、分布式控制系统 (DCS) 和监控和数据采集 (SCADA)

  • Modbus 服务器(从站),例如 PLC

  • 用于保护整个网络通信的工业防火墙

  • 用作将结构分成不同区域的屏障的开关

下图显示了请求或响应结构的总体轮廓:

面向Modbus的设备的模糊测试设置

1.标准方法

黑盒模糊测试是工业设备制造商使用的一种常用方法,通过向其发送随机通信数据包并寻找其行为异常(例如软件挂起或崩溃的迹象)来调查被测设备。

被测设备 (2) 使用检查的通信协议通过被测通信端口连接到计算机 (1)。计算机生成通信数据包,通常遵守所需的协议但具有随机内容,并通过请求来自设备的响应并检查其有效性来监控设备状态。

2.提高模糊测试的效率


在本报告中,我们为 libmodbus 库实现了一个模糊器,它是Modbus协议的特定实现。虽然理想的模糊测试方法不需要任何协议或其实现的先验知识,但了解如何使用其某些功能以及对协议内部工作的直觉,可以显着提高过程的效率。

根据经验,我们对上述标准方法进行了三项调整,在库中发现了两个新漏洞。

调整 1:更换被测设备

首先,由于libmodbus是开源的,我们可以随意对其进行重新编译,并且可以自由设置我们自己的testbench设备来直接运行待评估的代码。更重要的是,我们可以使用这个新的编译限定比真实设备的默认编译中找到的更严格检查条件。测试平台设备对内存访问违规变得更加敏感,这可能表明实现中存在漏洞。

我们使用了两种清理程序:AddressSanitizer (ASAN) 擅长检测内存损坏错误,例如堆/堆栈溢出和内存泄漏,以及MemorySanitizer (MSAN) 擅长检测 C/C++ 程序中未初始化的内存读取。MSAN暗中监视未初始化数据的传播,并在发现使用此数据的地方发出警报。正如本文后面详细描述的,MSAN帮助我们在运行Modbus写入和读取命令后找到未初始化的内存。

使用Clang编译时,包括ASAN和 MSAN就像添加 –fsanitize=address和 –fsanitize=memory编译键一样简单。

调整 2:选择正确的输入

了解协议及其可能的实现可能会提示某些字段,例如TCP modbus数据包的数据包长度、写入有效负载大小和读取有效负载大小,可能比其他字段更容易出错。因此,重要的是检查将这些特定场注入随机错误值的后果。

测试协议对完全不遵守Modbus协议的随机TCP流量的响应也很有趣。

事实上,我们可以确定Modbus数据包中最有希望进行模糊测试的字段是运行任何类型的特殊解析逻辑的字段(与可以以更简单的方式处理的地址字段相反):

调整 3:更有效地监控设备

虽然软件在接收到来自模糊器的数据包时崩溃是实施错误的明显迹象,但许多错误更加微妙,如果仅监控崩溃可能会被忽视。为了检测其他不良行为模式,而不会被后续命令覆盖,我们可以在模糊器生成的每个数据包之后发出读取命令,并验证响应的有效性。

用于此目的的读取命令的良好候选者将返回有关设备内部状态的尽可能多的信息。在Modbus的情况下,我们使用读取保持寄存器或读取线圈状态命令。

此外,设备产生的各种错误代码应该被记录下来,并通过将它们与由发出的通信数据包中的错误字段值导致的预期错误进行比较来验证。

模糊测试结果

在Raspberry Pi上运行时,运行上述模糊测试设置很快会导致模糊测试代码崩溃。崩溃是由MSAN卫生条件检查引起的(即对于此输入,真实设备不会崩溃):


MSAN打印输出提供的其他详细信息帮助我们查明崩溃的原因,这可以在源代码中清楚地看到:


在此代码中,req是接收到的Modbus有效负载,nb是请求写入的寄存器数。由于nb从接收到的数据包中独立于的长度进行控制req,通过提供足够大的nb,攻击者将 req 后的内存内容保存到Modbus寄存器单元中。


内容可以稍后读取,从而导致内存泄露漏洞。应该注意的是,MSAN对未初始化内存使用的检测仅在读取Modbus寄存器单元时(根据读取命令)触发。这突出了在模糊器发送每个数据包后从设备读取的重要性。


 结论

发现的两个漏洞的CVE得分为9.8,被归类为信息泄漏漏洞,通常在工业控制系统的环境中被认为不太重要,因为它们不能直接用于造成物理损坏。但是,在更复杂的攻击场景中,可能会导致严重后果。例如,当与堆栈溢出漏洞结合使用时,信息泄漏漏洞可用于通过获取有关内存布局的信息来破解地址空间布局随机化 (ASLR) 保护机制。

虹科Vdoo负责任地向项目维护者披露了这些漏洞,维护者非常迅速地做出回应并将他们的修复程序上传到libmodbus 3.1.6 版。




为你推荐