Modicon PLC 中的 RCE 漏洞分析 (CVE-2021-22779)
漏洞概述
CVE-2021-22779 是 Schneider Electric Modicon PLC 中的一个严重身份验证绕过漏洞,允许攻击者绕过 PLC 的安全机制,导致远程代码执行(RCE)。该漏洞与 Modbus 协议和 UMAS 协议的设计缺陷相关,影响 Modicon M340 和 M580 PLC 的最新固件版本。
受影响组件
- 受影响设备: Modicon M340 和 M580 PLC
- 相关协议: Modbus/TCP 和 UMAS 协议
- 相关CVE:
- CVE-2021-22779 - 通过 UMAS 命令 MemoryBlockRead 的身份验证绕过
- CVE-2018-7852 - 通过 UMAS 命令 PrivateMessage 的 RCE
- CVE-2019-6829 - 通过 UMAS 命令 WritePhysicalAddress 的任意内存写入
- CVE-2020-7537 - 通过 UMAS 命令 ReadPhysicalAddress 的任意内存读取
技术背景
Modbus 协议
Modbus 是 SCADA 系统中控制 PLC 的实际标准协议,最初由 Modicon 于1979年发布。Modbus/TCP 是其IP版本,但设计老旧,缺乏现代安全功能如加密和身份验证。
UMAS 协议
UMAS(Unified Messaging Application Services)是 Modicon 在 Modbus 基础上扩展的专有协议,增加了:
- 身份验证机制
- 二进制数据传输
- 固件更新等功能
UMAS 重新实现了标准 Modbus 命令并添加了专有命令,如 MemoryBlockWrite(功能码 0x21)。
漏洞详细分析
UMAS 预定机制
Modicon PLC 使用预定机制来同步PLC程序的修改:
-
基本预定机制(早期版本):
- 使用功能码 0x10 的 UMAS 命令
- 依赖硬编码共享密钥
- 无身份验证或挑战-响应握手
-
增强预定机制(改进版本):
- 使用功能码 0x6E 的 UMAS 命令
- 基于共享密码(应用程序密码)的挑战-响应握手
- 工作站和PLC交换随机生成的0x20字节缓冲区
- 缓冲区哈希与应用程序密码哈希结合完成预定
身份验证绕过漏洞(CVE-2021-22779)
攻击者发现 EcoStruxure 软件使用 MemoryBlockRead 命令从PLC读取密码哈希进行本地验证,而无需与PLC通信。这导致:
- 密码哈希通过未加密协议传输
- 任何未经身份验证的攻击者都可以读取密码哈希
- 攻击者可以使用读取的哈希完全绕过增强预定机制
从认证绕过到RCE
结合其他未公开的UMAS命令,攻击者可实现RCE:
-
WritePhysicalAddress(CVE-2019-6829):
- 允许任意写入PLC内存中的任何地址
- 可修改函数指针、栈变量或C++虚表指针
- 结合ROP技术可实现代码执行
-
PrivateMessage(CVE-2018-7852):
- 通过访问输入缓冲区中提供的指针触发内部函数
- 攻击者可构造有效C++对象并触发虚函数调用
- 结合ROP gadgets可实现代码执行
降级攻击
攻击步骤:
- 使用CVE-2021-22779绕过认证并预定PLC
- 上传未配置应用程序密码的新项目文件
- 释放预定并断开连接
- 用基本预定方式重新连接(无需密码)
- 利用WritePhysicalAddress或PrivateMessage实现RCE
其他攻击场景
-
旁观者(Man-on-the-side)身份验证绕过:
- 截获预定令牌(1字节)
- 注入TCP RST断开合法连接
- 在令牌有效期内(几秒)重用令牌
-
中间人(MiTM)身份验证绕过:
- 通过ARP欺骗设置中间人位置
- 截获身份验证数据包获取令牌
- 协议缺乏加密和完整性保护
缓解措施
-
施耐德电气建议:
- 在项目文件中使用应用程序密码
- 正确使用网络分段
- 实施访问控制列表保护工业控制器
-
第三方解决方案:
- 监控设备并识别风险
- 检测易受攻击的PLC和ICS协议异常
- 识别中间人攻击和漏洞利用尝试
-
长期解决方案:
- 采用Modbus安全协议提供加密和身份验证
- 对通信进行基本改造,引入证书验证
披露时间表
- 2020-11-13: 初始报告三个未公开UMAS命令
- 2020-11-21: SE确认部分命令已修复
- 2020-11-25: 发现修复不完全,漏洞实际可导致RCE
- 2021-02-09: SE确认补丁仅在设置应用程序密码时有效
- 2021-02-25: 发现多种绕过技术
- 2021-03-26: 提供PoC演示增强预定绕过
- 2021-03-31: SE确认CVE-2021-22779,预计2021 Q4补丁
总结
该漏洞揭示了Modbus/UMAS协议的根本设计缺陷,包括缺乏加密、弱身份验证机制和未公开的危险命令。虽然施耐德电气已发布部分缓解措施,但完全解决这些问题需要对协议进行根本性改造。工业控制系统安全需要结合网络分段、严格访问控制和持续监控来防御此类高级威胁。