施耐德电气PLC ModiPwn漏洞综述

  • A+
所属分类:安全新闻

作者 | 安帝科技

Armis研究人员在施耐德电气(SE)Modicon PLC中发现了一个新漏洞CVE-2021-22779,该漏洞被称为ModiPwn,影响Modicon M340、M580以及Modicon系列的其他型号PLC。该漏洞绕过了这些PLC中用来防止滥用未记录的Modbus命令的安全机制,Armis研究人员发现这些命令可用于接管PLC并获取设备本地代码执行权限,攻击者之后利用代码可更改PLC的操作,同时对管理PLC的工程工作站隐藏其操作。这是一种未经身份验证的攻击,只需要对目标PLC进行网络访问。

Armis于2020年11月13日通知SE,此后一直与他们合作以了解潜在问题,并努力开发补丁。2021年7月13日,SE发布了包含缓解措施的安全公告,完全修复这些问题的补丁仍在开发中。

在与SE合作的过程中,Armis研究人员发现并报告了两个额外的尚未被SE解决的身份验证绕过技术。由于为Modicon PLC使用的UMAS协议提供支持的Modbus协议存在固有缺陷,Armis将继续与SE和其他供应商合作解决这些问题。

 技术综述

Armis发现的漏洞CVE-2021-22779是一个身份验证绕过漏洞,可以与过去在UMAS协议中发现却只能部分缓解的其他漏洞联系在一起。Armis研究人员发现虽然这些额外的漏洞被归类为拒绝服务,它们实际上可以导致本地远程代码执行。这些漏洞本质上是UMAS协议中未记录的命令,Armis研究人员发现,SE并没有从协议中删除这些命令(可能是由于遗留的依赖关系),而是在它们周围添加了一个身份验证机制来降低它们的风险。不幸的是,这种机制被发现是有问题的,根据最新的发现,需要更加彻底的修复才可以解决这些问题。
由于上述原因,以下CVE仍会影响Modicon M340和M580PLC的最新固件版本:
  • CVE-2021-22779–通过UMAS命令MemoryBlockRead绕过身份验证漏洞
  • CVE-2018-7852–通过UMAS命令PrivateMessage(RCE)解除不受信任的指针引用
  • CVE-2019-6829–通过UMAS命令WritePhysicalAddress(RCE)进行任意内存写入
  • CVE-2020-7537–通过UMAS命令ReadPhysicalAddress读取任意内存(信息泄漏)
其他Modicon型号目前被认为不易受到攻击。
要完全理解上述发现的技术细节,需要了解Modbus和UMAS协议的一些背景知识。

 Modbus

Modbus是在SCADA系统中控制PLC的实际标准。它于1979年由Modicon首次发布。Modbus是很久以前设计的,缺少现代系统所需的功能,例如二进制对象与PLC之间的传输。
Modbus可以通过串行通信或IP通信运行。广泛使用的Modbus IP版本是Modbus/TCP标准。

施耐德电气PLC ModiPwn漏洞综述

图1 Modbus/TCP头部
Modicon之后在保留的Modbus功能代码前提下扩展了Modbus,扩展协议称为UMAS,它在基本Modbus协议的基础上增加了身份验证、二进制数据传输、固件更新和其他功能。

 UMAS预留机制

Modicon PLC(M340、M580以及其他型号)使用UMAS协议。UMAS重新实现了标准Modbus命令和一些Modbus缺少的必要功能。
施耐德电气PLC ModiPwn漏洞综述
图2 UMAS头部(包括Modbus功能代码字段)
对PLC的某些更改需要多个相互依赖的命令,为允许此类情况,Modicon实施了预留机制。创建预留机制是为了同步PLC程序的修改——一种针对某些关键更改的全局锁定机制。一旦工程工作站通过UMAS成功预留PLC,它就会收到一个1字节的令牌,用于对PLC进行修改。不修改PLC的UMAS命令不需要此令牌,并且可以在没有工作站任何身份验证的情况下执行。由于一次只有一个工作站可以保留PLC,因此该机制可以保护PLC免受可能导致损坏PLC的重复修改。
预留机制的初始版本通过使用功能代码为0x10的UMAS命令来工作。此命令不需要身份验证或质询-响应握手,并且依赖于PLC和工程工作站上SE管理软件之间的硬编码共享敏感信息:
施耐德电气PLC ModiPwn漏洞综述
图3 功能代码0x10
这种机制使用的硬编码敏感信息可以在未加密的UMAS流量中观察到,或者通过对Modicon PLC固件进行逆向工程来定位。
随着时间的推移,各种未记录的UMAS命令被证明允许远程代码执行或其他恶意意图。SE决定预留增强机制,因此它不仅可以充当锁定机制,还可以充当身份验证机制。预留增强机制基于质询-响应握手,其中对共享口令口令行身份验证。
在两种版本的预留机制中,成功预留后会发送一个1字节令牌作为响应,然后该令牌将被添加到需要身份验证的UMAS命令之前。
施耐德电气PLC ModiPwn漏洞综述
图4 预留成功后的1字节令牌

身份验证绕过-CVE-2020-7537

在对预留增强机制的算法进行逆向工程后,研究人员意识到是否可以通过未公开的UMAS命令泄露应用程序口令(或其哈希值)。对M340PLC最新固件(当时)的静态分析,揭示了一个可疑的UMAS命令:
施耐德电气PLC ModiPwn漏洞综述
图5 pu_ReadPhysicalAddress命令
pu_ReadPhysicalAddress命令拷贝从输入命令所选择地址的存储块,以响应缓冲。除了缓冲区大小的简单验证之外,该函数对从内存中读取的地址没有限制。本质上,这个未记录的命令允许泄漏PLC地址空间中的所有内存。
施耐德电气PLC ModiPwn漏洞综述
图6 来自pu_ReadPhysicalAddress命令的反编译片段
该命令可用于泄漏存储在PLC内存中的应用程序口令的哈希值,并用于未经身份验证的攻击者预留和管理PLC。
此外,诸如此类的内存读取命令可用于从PLC泄漏可能与其操作相关的敏感信息。由于此命令读取的地址没有限制,攻击者可以滥用此命令通过读取某些特定于硬件地址来使设备崩溃,这将导致PLC上的驱动程序与硬件不同步。这可能会导致各种边缘情况,从而导致拒绝服务。当PLC以这种方式崩溃时,它不能很快恢复正常运行,操作员需要按下一个物理按钮来重新启动设备。
施耐德电气PLC ModiPwn漏洞综述
图7 Wireshark捕获通过ReadPhysicalAddressUMAS命令泄露的应用程序口令哈希值
此漏洞于2020年11月报告给SE,并在2020年12月的安全公告中披露。SE为解决此问题而引入的补丁将ReadPhysicalAddress命令定义为需要保留的命令,利用该机制来抵御这种攻击。虽然这确实减轻了这种身份验证绕过,但它并没有完全解决这个命令中的风险——因为如果使用的项目文件是无口令的,它仍然可能被触发。

 身份验证绕过-CVE-2021-22779

为了更好地了解预留增强机制的UMAS消息流,可以使用EcoStruxure软件连接到PLC并分析它创建的流量。当在EcoStruxure软件中输入正确的口令时,会按预期生成一些UMAS命令,但是当输入的口令不正确时,软件拒绝了口令,而不会与PLC产生任何流量。这就提出了一个问题——EcoStruxure软件如何在不与PLC通信的情况下知道口令与否?为了回答这个问题,首先应当分析在输入口令之前工作站发送的UMAS命令。工作站使用的命令之一是MemoryBlockRead命令,它允许从内存中读取预配置的块,无需身份验证(类似于MemoryBlockWrite命令)。与ReadPhysicalAddress命令不同,块ID将内存访问限制为某些固定内存地址。
施耐德电气PLC ModiPwn漏洞综述
图8 用于从PLC读取预定义内存块的UMAS命令的结构
然而,软件似乎使用这个命令,pre-reservation,从PLC读取口令的哈希值,并验证用户输入的口令是否正确。毫无疑问,这种机制从根本上是有缺陷的——口令哈希值通过未加密的协议传递,可以被任何未经身份验证的攻击者读取,只需执行内存块读取命令。
虽然EcoStruxure软件使用内存读取命令来验证口令哈希,但未经身份验证的攻击者可以简单地使用读取口令哈希完全绕过预留增强的身份验证机制。
施耐德电气PLC ModiPwn漏洞综述
图9 实现此身份验证绕过技术的简单脚本

 远程代码执行RCE

如上所述,过去发现的两个未记录的UMAS命令WritePhysicalAddress(功能代码0x29,CVE-2019-6829)和PrivateMessage(功能代码0x6D,CVE-2018-7852),会导致拒绝服务。正如将在下面展示的,这两个命令实际上还可以导致远程代码执行。
任意内存写入
命令WritePhysicalAddress允许任意写入PLC内存中的任何地址,并在输入缓冲区中提供数据缓冲区。虽然在最新的固件版本中,在使用应用程序口令时无法访问此命令,但如果在绕过预留机制后执行降级攻击(稍后会详细介绍),它仍然可以触发。
施耐德电气PLC ModiPwn漏洞综述
图10 WritePhysicalAddress命令处理程序
这个命令可以通过用任意数据改变内存导致拒绝服务,也可以进行远程代码执行。攻击者利用payload改变其控制地址中的内存可能是RCE最简单的利用途径。许多可更改的函数指针、堆栈变量或C++vtable指针驻留在内存中,并将执行状态从其原始状态转移。可以通过ROP技术利用这些来访问攻击者控制的代码。Armis研究人员开发了一个类似的漏洞,当时利用URGENT/11的漏洞在2020年12月的白皮书(第20页)中被证明会影响Modicon PLC。

 远程过程调用RPC

第二个未记录的命令–PrivateMessage,它通过访问输入缓冲区中提供的指针所指向的C++对象,然后从这些解析对象中触发回调函数来触发PLC中的内部函数。目前尚不清楚此特定命令的商业用途是什么,但很明显,当传递的指针未指向PLC内存中的有效C++对象时,它会导致拒绝服务。
施耐德电气PLC ModiPwn漏洞综述
图11 PrivateMessage命令处理程序
将此漏洞转化为RCE只是稍微复杂一点。C++对象的有效结构可以通过MemoryBlockWrite命令上传到PLC内存中的已知地址,然后可以发送PrivateMessage命令,触发对攻击者控制的C++对象vtable指针内函数的调用。与上面详述的步骤类似,通过控制程序的PC来获取攻击者控制的代码只是通过几个ROP小工具连接点的问题。

 降级攻击

施耐德电气对上面提到的两个未记录命令的修复是相似的——在使用应用程序口令时完全禁用它们。但是,当它不使用时,这些命令仍然可以访问,也许是为了保留与使用这些命令的工具的一些遗留兼容性。
但是,通过利用身份验证绕过漏洞(例如CVE-2021-22779),攻击者可以通过上传未配置口令的新项目文件来降低PLC的安全性。一旦这种降级攻击完成,攻击者仍然可以使用上面详述的未记录的命令来获得本机代码执行。
攻击步骤如下:
1.使用CVE-2021-22779绕过身份验证并预留PLC;
2.上传未配置应用程序口令的新项目文件;
3.释放PLC预留并断开与设备的连接;
4.用基本预约方式重新连接PLC,无需口令;
5.通过利用可以到达RCE(WritePhysicalAddress或PrivateMessage)的未记录命令之一来实现代码执行。

 未来研究

正如上面技术深入探讨中所详述的那样,很明显UMAS和Modbus中的潜在设计缺陷暂时仍未修复。虽然正在尝试加强对某些命令的访问,但这些设计缺陷给开发人员带来了重大挑战——这可能会导致未来出现更多漏洞。除了上面详述的两个CVE允许完全绕过预留增强机制之外,还存在两个暂时尚未修补的额外攻击场景。

 Man-on-the-Side身份验证绕过

如上所述,当成功预留时,PLC会返回一个1字节的令牌。此令牌稍后用于所有需要预留的命令。如果攻击者位于网络中,他能够查看工程工作站和PLC之间的某些数据包,可以借此向PLC注入TCPRST数据包,这将断开工作站和PLC之间的ModbusTCP连接。此外,PLC会保留预留令牌的状态以供重复使用,持续几秒钟。如果在那个时间范围内攻击者连接到PLC,他可以重用令牌,而无需重新进行身份验证。这可以通过使用观察到的令牌(在人为场景中)或简单地强制使用255个可能的值来实现(PLC将拒绝错误的令牌,并且不会在多次尝试时重置令牌)。
尽管可以使用更长的令牌或通过拒绝蛮力尝试来部分缓解这种攻击场景,预留机制的潜在威胁依旧是缺乏加密——这允许攻击者获取可用于绕过此身份验证机制的信息。

 中间人身份验证绕过

不幸的是,PLC还可能面临一种更简单直接的攻击——中间人攻击。例如,使用ARP欺骗,攻击者可以在工程工作站和Modicon PLC之间充当中间人角色。
使用此位置,攻击者可以从工作站伏击预留尝试,并获取合法用户使用的凭据和/或令牌。虽然在当前的预留机制设计中,口令哈希值是通过MemoryBlockRead命令未加密传递的,预计将来不会使用该命令,并且不会以明文形式传递UMASModbus连接。然而,由于协议目前没有办法检测到中间人攻击,简单地将身份验证数据包转发到PLC将允许攻击者获得预留令牌,他可以滥用该令牌来运行任何未记录的可用于更改PLC配置或触发可能导致RCE的命令。
修复这种中间人身份验证绕过需要工程工作站和PLC之间的安全连接既能够加密通信又能够验证双方,验证连接是否通过中间人传递。

最后说明

虽然现在端点中的安全通信被认为是一个已解决的问题,但以类似的方式解决它还是对工业控制器构成了挑战。在传统端点中,服务使用证书进行身份验证,并以安全的方式定义信任根。在工业控制器中,不存在允许验证证书的用户界面。在没有这些方法的情况下创建安全通信需要对控制器进行物理访问,通过控制器可以在外部与网络交换密钥。这将带来部署挑战,制造商和供应商似乎还没有准备好迈出这一步。
不幸的是,如果没有这种对Modicon PLC通信方式的基本改造,上面详述的安全风险暂时仍与这些控制器相关。

 披露时间表:

2020年11月13日——关于影响Modicon PLC的三个未记录的UMAS命令的初步报告,这些命令可能导致远程代码执行和信息泄漏。
2020年11月21日-SE宣称2个命令已经修补(CVE-2018-7852,CVE-2019-6829),信息泄漏问题之前已向他们披露,预计将于2020年12月披露(CVE-2020-7537)。
2020年11月25日——Armis发现两个打补丁的命令没有正确修复,初始报告中提供的PoC脚本显示这些PLC在最新软件中仍然存在漏洞;此外,这些漏洞被确定为拒绝服务,而Armis发现它们实际上可以导致远程代码执行。
2021年2月9日——SE声称这些PLC的补丁仅在PLC项目上设置了应用程序口令时才有效。
2021年2月25日——Armis发现了应用口令机制的各种绕过技术(预留增强绕过、ARP欺骗、中间人,以及弱令牌)
2021年3月26日——Armis提供了PoC脚本,演示了在未经身份验证的攻击中绕过预留增强机制。这种攻击允许攻击者执行降级攻击——取消应用程序口令限制,从而允许访问可能导致本机代码执行的未记录的UMAS命令。
2021年3月31日——SE确认预留增强绕过中存在一个额外的漏洞(CVE-2021-22779),并且它也被另外的3rd方披露给他们。补丁预计将于2021年第四季度发布,SE将在2021年7月13日的公告中提供解决方法。由于设计限制,其他绕过技术(通过ARP欺骗和安全令牌的暴力破解的中间人)仍未打补丁。
参考资料:
https://www.armis.com/research/modipwn/


转载请注明来源:网络安全应急技术国家工程实验室

“投稿联系方式:010-82992251   [email protected]
施耐德电气PLC ModiPwn漏洞综述

本文始发于微信公众号(网络安全应急技术国家工程实验室):原创 | 施耐德电气PLC ModiPwn漏洞综述

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: