近 10 年前,西门子将非对称加密技术引入其 TIA Portal v12 和 SIMATIC S7-1200/1500 PLC CPU 固件系列的集成安全架构中。这样做是为了确保设备和用户程序的完整性和机密性,以及保护工业环境中的设备通信。
当时,工业控制系统不存在动态密钥管理和分配,主要是因为密钥管理系统会给集成商和用户带来运营负担。西门子当时决定改为依靠固定的加密密钥来保护其 PLC 和 TIA 门户之间的编程和通信。
然而,从那时起,技术、安全研究的进步和迅速变化的威胁形势使得这种硬编码的加密密钥成为不可接受的风险。能够提取全局硬编码密钥的恶意行为者可能会以不可挽回的方式危害整个设备产品线的安全性。
对先前对 Siemens SIMATIC S7-1200 和 S7-1500 PLC以及罗克韦尔自动化的 Logix 控制器和 Studio 5000 Logix Designer进行的研究的扩展——继续沿着这条道路前进。
发现并向西门子披露了一项针对 SIMATIC S7-1200 和 S7-1500 PLC CPU 的创新技术,使我们的研究人员能够恢复受西门子影响的每个产品线所使用的全局硬编码加密密钥 ( CVE-2022-38465 )。如果攻击者提取了密钥,他们将完全控制每个受影响的西门子产品线的每个 PLC。
利用之前在西门子 PLC 上的研究 (CVE-2020-15782) 中发现的一个漏洞,该漏洞使能够绕过 PLC 上的本机内存保护并获得读写权限以远程执行代码,能够大量提取内部西门子产品线中使用的受保护的私钥。这些新知识使我们能够实现完整的协议栈、加密和解密受保护的通信以及配置。
西门子对这一私人披露的回应导致对保护其旗舰 PLC 线路的加密方案以及其 TIA Portal 工程工作站应用程序进行了全面检查。西门子在一份安全公告中承认,围绕其硬编码密钥的现有保护已不再足够,并投入了必要的资源和时间来引入动态公钥基础设施 (PKI),从而消除了硬编码密钥的使用。
西门子建议用户立即将 SIMATIC S7-1200 和 S7-1500 PLC 以及相应版本的 TIA Portal 项目更新到最新版本。西门子在其公告中表示, TIA Portal V17和相关 CPU 固件版本包括新的 PKI 系统,该系统基于每个设备的个人密码保护机密配置数据以及受 TLS 保护的 PG/PC 和 HMI 通信。
技术细节
西门子访问限制机制
西门子 PLC 的一个突出安全特性是通过密码保护强制执行的访问级别限制机制。在下载到 PLC 的项目中配置了密码以及所需的保护级别。这些级别是:
级别 1:对任何配置和逻辑块的完全读写访问
2 级:写保护:
什么都能读
可以改变PLC模式
级别 3:有限的读取访问权限:
可以读取 HMI 数据(值等)
可以读取诊断数据
4级:全面保护
没有密码无法与PLC通讯
Siemens S7 1200/1500 访问级别(来源:西门子)
所有四个级别都使用相同的安全机制来授予用户权限。它们之间的唯一区别是授予或不授予身份验证的权限范围。任何与 PLC 的连接都需要密码。
了解 S7-1200、S7-1500 加密
西门子旗舰 PLC 上的非对称加密程序有两个主要目的:
身份验证:在与 PLC 通信时对用户进行身份验证的共享派生会话密钥。
机密性:在所述通信的部分期间加密数据,即下载的逻辑。
能够理解基于椭圆曲线非对称加密的加密算法。我们发现了曲线参数以及一个额外的复杂性:使用“配置密钥”来进一步混淆和复杂化椭圆乘法过程。
最终,能够发现加密过程中涉及的所有相关密钥:
连接密钥:用于数据包完整性验证和认证。
CPU 密钥:用于加密配置、代码和维护代码完整性的“每个型号/固件”(例如 S7-1518、S7-1517)密钥。
系列密钥:当 CPU 密钥未知时,用于与 CPU 密钥相同目的的“每个系列”(例如 S7-1200、S7-1500)。
西门子 PLC 加密过程中使用的密钥示意图。
在 PLC 上获得代码执行
在对其中一个未加密的 Siemens SIMATIC .upd 固件 S7-1200 进行逆向工程后,了解到私钥不在固件文件中,因此必须以某种方式直接从 PLC 中提取它。
为了从 PLC 检索私钥,需要直接内存访问 (DA) 来搜索它。为了能够执行 DA 操作,在 1200/1500 PLC 系列上搜索并发现了一个远程执行代码漏洞。该漏洞 (CVE-2020-15782) 是通过包含自己制作的 shellcode 字节码的特定 MC7+ 功能代码触发的。
CVE-2020-15782 沙盒逃逸漏洞。
CVE-2020-15782 的漏洞逻辑如下:
使用没有安全内存区域检查的 [REDACTED] 操作码将包含指向有效内存区域的本机指针的内部结构复制到可写内存区域
将此结构内的指针更改为想要的地址
重新计算用于验证此结构的 CRC(使用 CRC32 操作码)
使用 [REDACTED] 操作码将结构复制回其原始位置,现在指向想要的地址
此时,可以在我们精心设计的结构中使用对新地址的间接访问。
MC7+ [REDACTED] 操作码实现函数;由于它错过了安全内存内存区域检查,因此可以利用它并实现 RCE (CVE-2020-15782)。
现在可以从 PLC 中的任何内存地址读取或写入。使用此功能,可以覆盖本机代码并执行任何所需的本机逻辑。
在 S4x22 大会上对这个漏洞进行了详细的技术介绍,如下:
使用 RCE 获取隐藏的私钥
使用获得的 DA 读取权限,能够提取整个加密的 PLC 固件 (SIMATIC S7-1500) 并映射其功能。在映射过程中,发现了一个读取 PLC 上的私钥的函数。
用来从内存中转储 SIMATIC S7-1500 固件的 PoC。
一旦有了函数地址,就用shell 代码重写了特定 MC7+ 操作码的功能,迫使它们调用读取私钥的本机函数。然后将密钥复制到一个已知的内存地址并从那里读取它。执行覆盖函数为提供了 PLC 的完整私钥。
后来发现这些密钥在每个 Siemens SIMATIC S7 产品线中共享,并立即与 Siemens 启动了协调披露流程。
使用相同的方法,能够从 CPU 中提取配置密钥。
将私钥、配置密钥和算法知识相结合,使我们能够实现完整的协议栈、加密/解密受保护的通信和配置。
演示用于提取私有全局密钥的漏洞链。
攻击流程:获得对 PLC 和流程的控制
使用能够提取的私钥,攻击者可以完全控制 PLC。
对密码的攻击
下面描述的攻击允许具有 PLC 私钥和加密算法知识的攻击者检索 PLC 上配置的密码,从而获得完全控制权,而不管设备上配置的保护级别如何。
获取配置并解密密码哈希(从 PLC 读取配置):如果 PLC 的保护级别低于 3,攻击者可以从 PLC 中检索配置(上传程序),无需特殊权限。上传后,攻击者拥有 PLC 配置,并可以使用私钥从上传的配置中解密密码哈希。使用解密的密码哈希,攻击者可以对 PLC 进行身份验证并获得更高的权限。
中间人:了解流量加密机制以及访问私钥的攻击者可以在连接中冒充 PLC。中间人攻击按以下步骤进行:
客户端(受害者)连接到攻击者的虚假 PLC 并发送加密的连接密钥。
攻击者解密连接密钥并使用解密的密钥连接到真实的PLC。连接后,攻击者会收到基于密码的质询。
攻击者将真实 PLC 的质询转发给客户端,并收到有效的质询响应。
然后,攻击者将质询响应转发给真正的 PLC,以建立经过身份验证的连接。此会话将是一个完全特权会话。此时,攻击者可能会更改 PLC 上的任何配置或块,或读取配置。此访问包括从 PLC 读取加密密码哈希并对其进行解密的能力。
被动流量拦截:具有被动访问权限以捕获网络上给定 PLC 的流量的攻击者可以拦截来自 PLC 的配置读取/写入。使用私钥,攻击者可以解密配置并提取密码哈希。使用密码哈希,攻击者可以对控制器进行身份验证并编写新配置。
概括
由于之前的研究CVE-2020-15782能够在 S7 PLC 上执行本机代码,因此这种攻击 ( CVE-2022-38465 ) 成为可能。使用本机代码执行,能够读取保护私钥的原始内存区域并最终完全恢复密钥。
通过提取 PLC 的硬编码私钥,能够演示多种攻击场景,包括解密 S7 PLC 和 EWS 之间的所有通信,解密 PLC 上配置的密码哈希,可以使用它来获得对 PLC 的完全访问权限,进行中间人攻击等等。
用户应按照 Siemens 的建议更新到 S7-1200 和 S7-1500 PLC 系列的最新版本以及 TIA Portal v17。TIA Portal v17 引入了 TLS 管理系统以加密通信。西门子还引入了预激活的 PLC 配置密码要求,确保所有机密的 PLC 配置数据在默认情况下受到保护,以及预定义的安全 PG/HMI 通信,防止与其他合作伙伴的不安全通信,以及预激活的 PLC 访问保护,防止任何类型的除非明确配置,否则访问控制器。
参考链接:https://claroty.com/team82/research/the-race-to-native-code-execution-in-plcs-using-rce-to-uncover-siemens-simatic-s7-1200-1500-hardcoded-cryptographic-keys