CVE-2021-22779:Modicon PLC 中的 RCE 分析 - PureT

admin 2021年12月31日14:49:44评论141 views字数 7547阅读25分9秒阅读模式

本文为翻译文章,原文地址:https://www.armis.com/research/modipwn/

CVE-2021-22779:Modicon PLC 中的 RCE 分析

Armis 研究人员在 Schneider Electric Modicon PLC 中发现了一个严重漏洞。该漏洞允许攻击者绕过身份验证机制,从而导致在易受攻击的 PLC 上存在原生代码的远程执行

发现了什么:

Armis 研究人员在施耐德电气 (SE) Modicon PLC 中发现了一个新漏洞 (CVE-2021-22779),该漏洞允许绕过 PLC 中防止滥用未公开的 Modbus 指令的安全机制。这些未公开的指令允许完全控制 PLC —— 覆盖关键内存区域,泄漏敏感内存信息又或者调用内部函数。Armis 研究员发现这些命令被用来接管 PLC 并且可以在设备上执行原生代码,改变 PLC 的操作。同时还可以对管理 PLC 的工程工作站隐藏更改。这种攻击是一种未经身份验证的攻击,仅需要与目标 PLC 建立网络访问

事情发展过程:

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

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

要点:

  • 这篇分析揭示了 Modbus 协议的弱点 —— 一种广泛用于工业控制的行业标准协议。SE 的 UMAS 协议运行在 Modbus 协议之上,该协议缺乏加密和适当的身份验证机制。这些已知的缺陷导致了漏洞被发现、修补然后再一次被修补,不断重复,像是在一个经典的打地鼠循环之中

  • SE 曾经表示打算采纳 Modbus 安全协议以提供经典 Modbus 协议不具备的加密和身份验证机制,然而相关采纳措施尚未实施

  • 在野攻击中发现了针对工业控制器的恶意程序 —— 例如针对 SE 的 Triconex 安全控制器的 Triton 恶意程序。这个恶意程序是运行在工业控制器上通过获得原生代码执行实现巨大破坏潜力的一个例子。这个最新的漏洞显示了攻击者在类似控制器上获得原生代码执行的潜力

Armis 如何提供帮助:

  • Armis 强烈建议使用 Schneider Electric 指南来为 Modicon PLC 做安全配置 —— 例如在项目文件中使用应用程序密码,正确使用网络分段,并且通过实施访问控制列表来保护工业控制器免受有害的通信和攻击

  • 当前研究强调了能够监控设备,识别风险,阻止脆弱的工业控制器受到攻击的第三方解决方案的重要性

  • Armis 平台为操作技术(OT)提供先进的特性支持识别和监控针对 OT 设备的风险。这涵盖了检测易受攻击的 PLC ,ICS 协议中的异常,检测可能破坏未加密的 ICS 协议安全的中间人攻击以及识别主动的漏洞利用尝试

  • Armis 平台也提供了一系列的集成方案帮助组织实施安全策略 —— 举个例子,根据 OT 设备的严格 Purdue 级别确定应该使用的正确边界,并通过与网络基础设施方案的集成来配置这些边界

技术研究概述

当前被发现的漏洞 (CVE-2021-22779) 是一个身份验证绕过漏洞,它可以与 UMAS 协议中的其他漏洞相关联,这些漏洞在过去被发现,但只能部分缓解。Armis 研究人员发现(我们将在下面详细介绍)虽然这些额外的漏洞 ( CVE-2018-7852CVE-2019-6829 ) 被归类为拒绝服务,它们实际上可以导致原生远程代码执行。这些漏洞本质上是 UMAS 协议中未公开的命令,Armis 研究人员发现,SE 并没有从协议中删除这些命令(可能是由于遗留的依赖关系),而是在它们周围添加了一个身份验证机制来降低它们的风险。不幸的是,这种机制被发现是存在问题的,因此根据最新的发现,这些命令需要更根本的修复才能完全缓解

由于上述原因,以下 CVE 仍会影响 Modicon M340 和 M580 PLC 的最新固件版本:

  • CVE-2021-22779 - 通过 UMAS 命令 MemoryBlockRead 的身份验证绕过漏洞

  • CVE-2018-7852 - 通过 UMAS 命令 PrivateMessage (RCE) 取消引用不受信任的指针

  • CVE-2019-6829 - 通过 UMAS 命令 WritePhysicalAddress (RCE) 进行任意内存写入

  • CVE-2020-7537 - 通过 UMAS 命令 ReadPhysicalAddress 读取任意内存(信息泄漏)

其他 Modicon 型号目前被认为不易受到攻击,而 Armis 研究人员将继续分析它们的全部影响

要完全理解上述发现的技术细节,需要了解 Modbus 和 UMAS 协议的一些背景知识

Modbus

Modbus 是在 SCADA 系统中控制 PLC 的实际标准。它于 1979 年由 Modicon(现为施耐德电气)首次发布。 Modbus 是很久以前设计的,缺少现代系统所需的功能,例如二进制对象与 PLC 之间的传输

Modbus 可以通过串行通信或 IP 通信运行。广泛使用的 Modbus 的 IP 版本是 Modbus/TCP 标准

Modicon 选择在保留的 Modbus 功能码下扩展 Modbus 实现。扩展协议称为 UMAS,它在 Modbus 协议的基础上增加了身份验证、二进制数据传输、固件更新等其他特性

UMAS

Modicon PLC(M340、M580 和其他)实现 UMAS。UMAS 重新实现了标准 Modbus 命令和一些缺少的必要的 Modbus 功能

例如,UMAS 专有的命令之一是 MemoryBlockWrite 命令(功能码 0x21),它不需要身份验证

该命令将一组二进制数据写入特定 ID 块内的偏移量。这些块位于固定的内存地址中,并被标记为可写或只读块。尝试写入只读块时,MemoryBlockWrite 命令返回错误响应

UMAS 预定机制

对 PLC 的某些更改需要多个相互依赖的命令。为允许此类情况下能够正常运行,Modicon 实现了预定机制。创建预定机制是为了同步 PLC 程序的修改 —— 一种针对某些关键更改的全局锁定机制。一旦工程工作站通过 UMAS 成功预定 PLC,它就会收到一个一字节的令牌,用于对 PLC 进行修改。此令牌允许工作站更改在 PLC 上运行的应用程序的任何方面。不修改 PLC 的 UMAS 命令不需要此令牌,并且可以在没有工作站任何身份验证的情况下执行。由于一次只有一个工作站可以预定 PLC,因此这种机制可以保护 PLC 免受可能损坏 PLC 的重叠修改的危害,并控制和保持工厂的正常运转

预定机制的初始版本(我们给它命名为 basic reservation)通过使用功能代码为 0x10 的 UMAS 命令来工作。此命令不需要身份验证或询问-响应( challenge-response )握手,并且依赖于 PLC 和工程师工作站上 SE 的管理软件之间的硬编码共享密钥

这种机制使用的硬编码密钥可以在未加密的 UMAS 流量中观察到,或者通过对 Modicon PLC 固件进行逆向工程来定位

增强预定机制

随着时间的推移,安全问题被提出,各种未公开的 UMAS 命令被证明允许远程代码执行或其他恶意意图。SE 决定增强预定机制,因此它不仅可以充当锁定机制,还可以充当身份验证机制

增强的预定机制基于对共享密码进行验证的询问-响应( challenge-response )握手。共享密码称为应用程序密码,是在项目文件上传到 PLC 时动态设置的。增强预定机制使用功能码为 0x6E 的 UMAS 命令:

在此命令中,工作站和 PLC 交换随机生成的 0x20 字节缓冲区:

这些缓冲区的散列值与应用程序密码的散列值相结合,用于完成预定

如上所述,该机制中使用的秘密的共享密钥是在工程工作站上运行的 EcoStruxure 软件中配置的密码的哈希值。EcoStruxure 软件鼓励用户在创建新项目时配置密码。将项目文件传输到 PLC 时,还会在 PLC 上配置新的应用程序密码

在两种版本的预定机制中,成功预定后会发送一个 1 字节令牌作为响应,然后该令牌将被添加到需要身份验证的 UMAS 命令之前

绕过验证 —— Take 1 (CVE-2020-7537)

在对增强预定机制的算法进行逆向工程后,我们想看看是否可以通过未公开的 UMAS 命令泄露应用程序密码(或其哈希值)。对 M340 PLC 最新固件(当时)的静态分析,揭示了一个可疑的 UMAS 命令:

所述 pu_ReadPhysicalAddress 从输入命令所选择的地址的存储块拷贝到响应缓冲区。除了缓冲区大小的简单验证之外,该函数对从内存中读取的地址没有限制。本质上,这个未公开的命令允许泄漏 PLC 地址空间中的所有内存

该命令可用于泄漏存储在 PLC 内存中的应用程序密码的哈希值,用于未经身份验证的攻击者预定和管理 PLC

此外,诸如此类的内存​​读取命令可用于从 PLC 泄漏可能与其操作相关的敏感信息,甚至用作拒绝服务原语 (!)。由于此命令读取的地址没有限制,攻击者可以滥用此命令通过读取某些特定于硬件的地址来使设备崩溃,这将导致 PLC 上的驱动程序与硬件不同步。这可能会导致各种边缘情况,从而导致拒绝服务。当 PLC 以这种方式崩溃时,它不会很快恢复正常运行 —— 操作员需要按下一个物理按钮来重新启动设备

此漏洞于 2020 年 11 月报告给 SE,并在 2020 年 12 月的安全公告中披露。SE 为解决此问题而引入的补丁将 ReadPhysicalAddress 命令定义为需要预定的命令 —— 利用该机制来抵御这种攻击。虽然这确实减轻了这种身份验证的绕过,但它并没有完全解决这个命令中的风险 —— 因为如果使用的项目文件是无密码的,它仍然可能被触发

绕过验证 —— Take 2 (CVE-2021-22779)

为了更好地了解增强预定机制的 UMAS 消息流,我们使用 EcoStruxure 软件连接到 PLC 并分析了它创建的流量。我们注意到一些有趣的事情:当在 EcoStruxure 软件中输入正确的密码时,会按预期生成一些 UMAS 命令,但是当输入的密码不正确时,软件拒绝了密码,而不会与 PLC 产生任何流量

这就提出了一个问题 —— EcoStruxure 软件如何在不与 PLC 通信的情况下知道密码不正确?为了回答这个问题,我们分析了在输入密码之前工作站发送的 UMAS 命令。工作站使用的命令之一是 MemoryBlockRead 命令 —— 它允许从内存读取预配置的块,无需身份验证(类似于 MemoryBlockWrite 命令)。与 ReadPhysicalAddress 命令不同,块 ID 将内存访问限制为某些固定内存地址

然而,软件似乎使用这个命令,提早预定,从 PLC 读取密码的哈希值,并验证用户输入的密码是否正确。不用说,这种机制从根本上是有缺陷的 —— 密码哈希既通过未加密的协议传递,也可以被任何未经身份验证的攻击者读取,只需执行内存块读取命令

虽然 EcoStruxure 软件使用内存读取命令来验证密码哈希 —— 未经身份验证的攻击者可以简单地使用读取的密码哈希完全绕过增强预定的身份验证机制

从认证绕过到 RCE

之前提到过,过去发现的两个导致拒绝服务的未公开的 UMAS 命令 —— UMAS 命令WritePhysicalAddress(功能码 0x29,CVE-2019-6829)和 PrivateMessage(功能码 0x6D,CVE-2018-7852))。正如我们将在下面展示的,这两者实际上可以导致远程代码执行

任意内存写入

命令 WritePhysicalAddress 是写,相当于上述提到过的 ReadPhysicalAddress 命令。此命令允许任意写入 PLC 内存中的任何地址,并在输入缓冲区中提供数据缓冲区。虽然在最新的固件版本中,当使用应用程序密码时无法访问此命令,但如果在绕过预定机制后执行降级攻击(稍后会详细介绍)或应用程序密码从来没有被设置过的情况下它仍然可以触发

虽然很清楚为什么这个命令会导致拒绝服务(通过用任意数据改变内存),但不清楚为什么这个漏洞不被归类为远程代码执行。使用攻击者控制的有效载荷改变攻击者控制地址指向的内存可能是 RCE 最简单的利用路径。许多函数指针、栈变量或 C++ 虚表指针驻留在内存中可以更改,并将执行状态从其原始状态转移。可以使用 ROP 技术使用这些来访问攻击者控制的代码。 Armis 研究人员开发了一个类似的 exp,当时利用的 URGENT/11 漏洞在 2020 年 12 月的白皮书(第 20 页)中被证明会影响 Modicon PLC

远程过程调用 (RPC,又名 PrivateMessage)

第二个未公开的命令 —— PrivateMessage 是一个通过访问输入缓冲区中提供的指针指向的 C++ 对象来触发 PLC 中的内部函数的命令,然后从这些解析的对象中触发回调函数。目前尚不清楚此特定命令的商业用途是什么,但很明显,当传递的指针未指向 PLC 内存中的有效 C++ 对象时,它会导致拒绝服务

将此漏洞转化为 RCE 只是稍微复杂一点。一个有效的 C++ 对象的结构可以通过MemoryBlockWrite 命令上传到 PLC 内存中一个已知的地址处。然后可以发送PrivateMessage 命令 —— 触发对攻击者控制的 C++ 对象的虚表内的函数的调用。与上面详述的步骤类似,通过控制 PC 的程序来获取攻击者控制的代码只是通过几个 ROP gadgets 的连接问题

降级攻击

施耐德电气对上面显示的两个未公开的命令的修复是相似的 —— 在使用应用程序密码时完全禁用它们。但是,当它不使用应用程序密码时,这些命令仍然可以访问,也许是为了保留与使用这些命令的工具的一些遗留兼容性

但是,通过利用身份验证绕过漏洞(例如 CVE-2021-22779),攻击者可以通过上传未配置密码的新项目文件来降低 PLC 的安全性。一旦这种降级攻击完成,攻击者仍然可以使用上面详述的未公开的命令来获得本机代码执行

攻击步骤如下:

  1. 使用 CVE-2021-22779 绕过身份验证并预定 PLC
  2. 上传未配置应用程序密码的新项目文件
  3. 释放 PLC 预定并断开与设备的连接
  4. 用基本预定方式重新连接 PLC,无需密码

通过利用可以到达 RCE( WritePhysicalAddress 或 PrivateMessage )的未公开命令之一来实现代码执行

未来的研究

正如上面技术深入探讨中所详述的那样,很明显 UMAS 和 Modbus 中的潜在设计缺陷暂时仍未修复。虽然正在尝试加强对某些命令的访问,但这些设计缺陷给开发人员带来了重大挑战 —— 这可能会在未来导致更多的漏洞

除了上面详述的两个 CVE 允许完全绕过增强的预定机制之外,我们还能够识别出两个暂时仍未修补的额外攻击场景

旁观者( Man-on-the-side )身份验证绕过

如上所述,当成功预定时,PLC 会返回一个 1 字节的令牌。此令牌稍后用于所有需要预定的命令。如果攻击者位于网络中,工程工作站和 PLC 之间的某些数据包会被他查看 —— 他可以使用该位置向 PLC 注入 TCP RST 数据包,这将断开工作站和 PLC 之间的 Modbus TCP 连接。PLC 将保留预定令牌的状态以供重复使用,持续几秒钟。如果在那个时间范围内攻击者连接到 PLC,他可以重用令牌,而无需重新进行身份验证。这可以通过使用观察到的令牌(在 man-on-the-side 场景中)或简单地强制使用 255 个可能的值来完成(PLC 将拒绝错误的令牌,并且不会在多次尝试后重置令牌)

尽管使用更长的令牌或通过拒绝暴力尝试可以部分缓解这种攻击场景 —— 但是预定机制的潜在威胁是缺乏加密 —— 这允许旁侧攻击者获取信息可用于绕过此身份验证机制

中间人身份验证绕过

更直接的攻击,不幸的是,执行起来非常简单 —— 是中间人攻击。例如,使用 ARP 欺骗,攻击者可以在工程工作站和 Modicon PLC 之间设置中间人位置

使用此位置,攻击者可以从工作站伏击一个尝试预订的请求,并获取合法用户使用的凭据或令牌。而在当前的预定机制设计中,密码散列是通过 MemoryBlockRead 命令未加密传递的,预计将来不会使用该命令,并且密码散列不会通过 UMAS\Modbus 连接以明文形式传递。然而,由于协议目前没有办法检测到中间人攻击,简单地将身份验证数据包转发到 PLC 将允许他获得预定令牌,他可以滥用该令牌来运行任何未公开的可用于更改 PLC 配置或触发可能导致 RCE 的命令

进一步说,修复这种 MiTM 身份验证绕过将需要工程工作站和 PLC 之间的安全连接 —— 既能够加密通信又能够验证双方的身份,验证连接不是通过 MiTM 传递的

最后的笔记

虽然现在终端中的安全通信被认为是一个已解决的问题,但用类似的方式在工业控制器上却构成了挑战。在传统终端中,服务使用证书进行身份验证,并以安全的方式定义信任根。在工业控制器中,不存在允许验证证书的用户界面,并且缺乏 Internet 连接(设计上)阻止使用 CA(证书颁发机构)。在没有这些方法的情况下创建安全通信需要对控制器进行物理访问,通过控制器可以在外部与网络交换密钥。这将带来部署挑战,制造商和供应商似乎还没有准备好迈出这一步

不幸的是,如果没有这种对 Modicon PLC 通信方式的基本改造,上面详述的安全风险暂时仍与这些控制器相关

披露时间表:

  • 2020 年 11 月 13 日 —— 关于影响 Modicon PLC 的三个未公开的 UMAS 命令的初步报告,这些命令可能导致远程代码执行和信息泄漏

  • 2020 年 11 月 21 日 —— SE 声称其中两个命令已经修复(CVE-2018-7852,CVE-2019-6829 由 Talos 发现),并且先前公开的信息泄漏问题他们原本预计将于 2020 年 12 月披露(此处为 CVE-2020-7537)

  • 2020 年 11 月 25 日 - Armis 发现两个打补丁的命令没有被正确修复,初始报告中提供的 PoC 脚本显示这些 PLC 在最新软件中仍然存在漏洞;此外,这些漏洞被确定为拒绝服务,而 Armis 发现它们实际上可以导致远程代码执行

  • 2021 年 2 月 9 日 - SE 声称这些 PLC 的补丁仅在 PLC 项目上设置了应用程序密码时才有效

  • 2021 年 2 月 25 日 - Armis 发现应用程序密码机制的各种绕过技术(增强预定绕过、ARP 欺骗以获取 MiTM,以及弱令牌的暴力破解)

  • 2021 年 3 月 26 日 - Armis 提供了 PoC 脚本,可在未经身份验证的攻击中演示增强的预定绕过。这种攻击允许攻击者执行降级攻击 —— 取消应用程序密码限制,从而可以访问可能导致本机代码执行的未记录的 UMAS 命令

  • 2021 年 3 月 31 日 - SE 确认在增强的预定绕过中存在一个额外的漏洞 (CVE-2021-22779),并且它也被另外的第三方披露给他们。补丁预计将于 2021 年第四季度发布,SE 将在 2021 年 7 月 13 日的公告中提供解决方法。由于设计限制,其他绕过技术(通过 ARP 欺骗和安全令牌暴力的 MiTM)仍未打补丁

BY:先知论坛

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年12月31日14:49:44
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   CVE-2021-22779:Modicon PLC 中的 RCE 分析 - PureThttp://cn-sec.com/archives/709802.html

发表评论

匿名网友 填写信息