1.背景概述
笔者在Black Hat EU 2022会议上发表了题为《Fuzzing and Breaking Security Functions of SIMATIC PLCs》的演讲,该议题主要对西门子增强设计的安全协议、访问保护功能做了详细分析,并针对安全协议做了进一步分析和模糊测试技术讲解,提出了SIMATIC PLC自动化模糊测试平台方案用以批量化发现设备的漏洞。最后给出了相应的防护措施和该议题后续的研究方向。
为了让广大感兴趣的人员进一步了解到有关西门子PLC的研究方法,笔者决定再次撰写该议题的解读文章,以飨读者。本文章只做交流学习使用,禁止应用于非法用途。
2.研究背景
数字化浪潮的席卷必然带来工业领域的变革,越来越多的厂矿企业都在推行数字化改革和工业互联网方案的落地,虽然这些可以带来诸多便利和效益,但是不可避免的引入了风险,让原本就很脆弱的工控系统面临着更大的威胁。比如边缘网关的加入,该设备的安全基线脆弱让很多OT类设备直接暴露在公网中,即便PLC/DCS/RTU设备安全性较高,但增加了被攻击的风险。
SIMATIC PLC是由西门子公司研发生产的高性能、高可靠性的可编程逻辑控制器产品,可以满足各种不同的控制应用需求,目前在全球范围内广泛使用,市场占比份额最高,涵盖了离散控制、混合控制、过程控制等各个领域。广泛应于电力、汽车制造、食品加工、饮料生产、化工生产、制药生产等行业。在国内的钢铁行业、烟草行业占比份额最高,因此我们选取SIMATIC PLC作为研究对象。
关注SIMATIC PLC的研究机构众多,近些年也涌现出诸多研究成果。如下图所示
- Rogue7: Rogue Engineering-Station attacks on S7 Simatic PLCs
2019年Black Hat USA会议中来自以色列的研究人员讲述了西门子S7CommPlus-V3协议中的完整性校验部分算法,制作出了流氓客户端来控制S7-1500,并且可以替换原有工程文件达到 “震网”攻击中的效果。
- Doors of Durin: The Veiled Gate to Siemens S7 Silicon
2019年Black Hat EU会议中来自德国波鸿鲁尔大学的研究员披露了S7-1200设备中存在的隐藏功能——UART特殊访问。在S7-1200 CPU的制造过程中加入一种访问模式,方便研发人员进行功能诊断。虽然这种访问模式是为了方便诊断调试,但攻击者可以借此控制设备(在物理接触的情况下)。攻击者可以在加载PLC固件之前,通过UART接口在启动过程中发送一个特殊的命令来访问设备,并最终在启动过程中实现任意命令执行。
- The Race to Native Code Execution in PLCs
2021年5月份,工业网络安全公司Claroty研究人员发现了一个严重的漏洞,未经认证的远程攻击者可以利用这个漏洞攻击西门子PLC。该漏洞被编号为CVE-2020-15782,是一个高危的内存保护绕过漏洞,允许攻击者通过网络访问TCP 102端口在受保护的内存区域中写、读数据。该漏洞可绕过代码运行的沙箱,直接访问设备内存,从而在西门子S7 PLC上获得本机代码执行。
- sOfT7: Revealing the Secrets of the Siemens S7 PLCs
2022年Black Hat USA会议中来自以色列的研究人员披露了西门子ET200SP开放式控制器最新的安全研究成果,ET200SP的启动过程并不安全,攻击者可以启动他所选择的操作系统并读取整个文件系统,包括实时虚拟机管理器的二进制文件、加密的SWCPU和GRUB配置文件。研究人员利用动态二进制插桩技术获取了解密后的PLC固件。
- Using RCE to Uncover Siemens SIMATIC S7-1200/1500 Hardcoded Cryptographic Keys
2022年10月,工业网络安全公司Claroty研究人员发现一种方法可以成功提取被硬编码在多款西门子可编程逻辑控制器CPU中的全局加密密钥,从而使他们能够破坏其安全通信和身份验证。如果攻击者获得配置密钥,有可能从PLC的配置中解密用户密码,并发动中间人攻击,即使他们无权读取加密的配置。配置密钥并不存储在固件中,而是存储在CPU本体中,只需在一台设备上执行一次就可以获得同一个系列的密钥。
之前的研究都是基于西门子没有使用增强安全设计的PLC产品的,即S7-1500固件版本小于V2.9,S7-1200固件版本小于V4.5。为了解决以上研究所发现的产品问题,西门子发布了带有增强安全设计的固件版本和对应的组态软件TIA V17及后续版本。如下图所示
我们的研究对象就是针对此系列产品及其固件版本,详细来说即为西门子SIMATIC系列的S7-1200(≥V4.5.X)/S7-1500(≥2.9.X)可编程逻辑控制器,配合的组态软件为TIA V17。本次研究中我们有四个目标:
解密TIA V17与目标PLC之前增强安全设计的通信流量;
制作伪造客户端来控制最新固件版本的目标PLC;
如何快速披露的在目标PLC中发现漏洞;
如何攻击启用增强安全设计的目标PLC;
3.增强安全设计
2021年5月,西门子发布了TIA V17配合PLC中对应的固件可以实现增强安全功能,如下所示[1]。
总结起来新增加了3方面的增强设计:
- 新增PLC配置数据保护功能;
- 新增了TLS安全通信协议;
- 新增了安全向导功能来配置安全通信、配置保护、访问保护功能;
在我们的研究中重点关注TLS安全通信协议、访问保护功能。其中的详细描述见链接[2]所示。
由于下述部分重点描述TLS安全通信协议部分内容,因此此处对于访问保护相关知识做一详细介绍。西门子为了防止未经授权的操作设计了访问保护等级机制,当开启了相应的保护等级后只允许相应情况下的操作,以此来避免诸多攻击比如重放攻击、PLC-Blaster、数值读写等。如下所示为各种访问防护等级的详细描述。
在TIA V16和S7-1200(firmware≤V4.5.0)配合的场景下,可以采用哈希传递攻击来绕过访问等级保护,我们在2021年HITB SIN会议中对于该种方法做了展示[3],下边再次阐述如何绕过访问保护等级,如下所示。
首先需要澄清访问保护密码以什么形式存放?经过分析后发现客户启用访问保护等级后密码会以SHA-1形式存放,而且在PLC中没有进一步的加密处理。因此我们可以从PLC的flash或者内存中获取到密码的hash值,这里有两种方法从PLC中获取密码hash值:
- 通过漏洞dump内存,从内存中寻找密码hash,内存dump的方法可以参考Doors Of Durin :The Veiled Gate To Siemens S7 Silicon议题中的相关方法。
- 通过拆焊flash芯片获取其中的密码hash,S7-1200设备的flash为BGA封装,因此需要利用对应的拆焊方法、编程器读取操作获得其中内容。
接下来根据特征值寻找密码hash值,找到密码hash之后可以在调试过程中利用替换hash的方法进行访问保护绕过,利用这种方法可以获取控制器中带有密码的工程文件内容。
那么为什么不直接从dump的内存或者flash文件中获取工程文件内容呢?这种思路是可行的,但是由于这种方法需要依赖工程文件反汇编等诸多知识及转化操作,实操过程过于复杂,因此采用了从内存或者flash中寻找密码hash然后利用哈希传递攻击直接绕过密码访问保护来快速达到目的。
那么哈希传递攻击在TIA V17和S7-1200(firmware>V4.5.0)的场景下是否还适用于呢?我们对于该问题做了研究发现经过西门子的修改,密码不再以SHA-1形式存放了,而是在PLC中进行了进一步的处理—利用PBKDF2派生秘钥算法保护了密码的hash值,其中使用到的salt为创建工程是随机生成的。即使得到了这个值也无法反推出密码hash值,因此哈希传递攻击在此种场景下已经失效了。
虽然在密码存储方面进行了修改但是该种场景下的授权过程中,密码hash以简单的异或算法进行了加密,如果攻击者能够获取到授权过程中的流量并对其进行解密也可获得密码hash值,以此来进行下一步的攻击。
4. S7CommPlus_TLS协议及重放攻击
在TIA V17之前西门子的私有协议为S7CommPlus,关于该协议有诸多的研究文章。该协议也存在一些问题,虽然可以利用32字节的完整性校验一定程度上来抗重放攻击但是其余字段的传输还是明文形式,因此为了能更进一步保护传输数据西门子启用了带有TLS套接层的安全通信功能。创建新工程时选择开启安全通信选项,在连接到目标PLC时选择信任该设备,然后下装工程至PLC中即可在Wireshark中捕获到带有TLS套接层的流量,如下图所示
可以明显看到报文结构组成由三部分构成,第一部分为TPKT的header,第二部分为COPT部分即02 f0 80,第三部分为加密的TLS部分。如下所示
虽然可以捕获到流量但是TLS加密部分无法获知其内部信息,现在的问题转换为如何获取到传输过程中的明文报文?
获取明文有很多方法,比如hook、中间人解密TLS流量等,在本次研究中我们采用了hook的方法,首先需要OMSp_core_managed.dll文件在该文件中找到加密之前解密之后的函数,将该函数地址内容进行dump来获取通信中的明文报文。如下图所示
通过以上的方法在S7-1200目标PLC上获取到了STOP操作的明文流量,将该操作报文与未启用增强安全设计的S7CommPlus-V3对应报文做对比,如下图所示。可以发现在TLS套接层中包裹的明文有如下不同点:
- 使用的S7commPlus的版本不一致,TLS内部的明文报文为V2版本;
- TLS内部的明文报文去除了完整性校验部分(33字节);
总之,TLS内部采用了S7CommPlus-V2协议[4],整体协议的安全性由TLS来保障,我们将最新的安全协议称之为S7CommPlus_TLS。
已经弄清楚了TLS内部的报文结构,那么能不能做一个伪造客户端来控制目标PLC呢?答案是肯定的。以下做一详细介绍:
- 获取到明文报文结构;
- 将其送入SSL中进行加密处理;
- 处理后的报文添加TPKT和COTP部分后借助socks代理发送至目标PLC;
- 以上是处理请求报文的方法,处理响应报文刚好相反,首先去除掉响应报文中的TPKT和COTP部分,让其变成标准的SSL报文
- 送入SSL处理部分解密为明文报文即为响应报文
分析清楚后结合通信建立的过程,可以使用python编写重放攻击脚本,如下图所示
此处链接是在最新版本的S7-1200(V4.6.0)/S7-1500(V2.9.4)设备上执行RUN和STOP操作的demo展示视频。
5. S7CommPlus_TLS协议模糊测试平台
模糊测试是流行的漏洞挖掘技术,通常用于通信协议、文件解析等领域,那么是否可以利用该技术来在西门子最新的安全协议中发现漏洞呢?经过我们的研究和实践,发现该思路是可行的,而且非常有效在短时间内可发现数十个漏洞。按照如下图所示顺序进行详细讲解
由于S7CommPlus_TLS内部结构复杂,因此采用基于变异的模糊测试效率会更高。
- 修改重放脚本使其变为最简单的模糊测试工具
前一章节中我们讲述了如何制作重放攻击脚本,那么将重放攻击RUN PLC明文报文中的任意字节或者多个字节替换为特殊值发送至目标PLC,再次观察PLC的反应就成了一个最简单的模糊测试模型了,如下所示。当然也可以利用其他操作的明文报文作为基础样本,然后修改报文中的任意字节形成新的报文。
- 如何制作样本
基于变异的模糊测试最终发现的漏洞数量往往取决于是否有丰富的样本,能够覆盖众多的路径分支。那么制作样本就变得尤其重要了,这里提供两种制作样本的方法:
- 在TIA V17组态软件中执行各类操作,比如RUN、STOP、在线、下载工程、跟踪、格式化等,然后捕获其明文报文制作成fuzzer文件;
- 为了使样本更丰富,有些分支无法被上位机上的简单操作所覆盖,因此需要逆向分析,对于S7CommPlus协议做逆向分析厘清每个功能码下的报文结构,制作更加丰富的fuzzer文件;
如下图所示
- 如何选择变异策略
首先需要确认变异部分,针对此协议变异部分为S7CommPlus的data部分,变异完成后还需要对length字段做修复。变异策略我们结合了AFL变异策略、radamsa变异策略和自定义的变异策略制作成了变异引擎,先从上一步制作的fuzzer语料库中随机选取若干个样本文件送入至变异引擎,然后任意选择一种变异方式进行变异,完成后输出进行相应修复处理。如下图所示
- 异常检测
对于文件或者软件类的异常检测往往比较成熟,但是针对设备类的异常检测目前还没有成熟的理论,即便有也不能通用。因此需要根据目标PLC的特点有针对性的设计异常检测系统,一般对于PLC的异常包含如下几类
- PLC内部通信协议栈异常,出现无法建链、不响应请求报文、错误响应请求报文;
- PLC内部程序执行异常,出现通道输出异常、采集异常等;
- PLC进入到了defective模式,设备的红灯常亮或者闪烁;
针对如上异常,我们设计了对应的检测方法,比如每个fuzz周期结束时发送特定请求报文来检测协议栈是否出现异常,利用第三方DI模块采集目标PLC设备DO通道500ms周期输出是否出现异常,利用第三方模拟量采集模块ERR灯电压检测是否已经点亮。当然方法有很多种,使用的采集设备也不尽相同,只要能达到目标都是好方法。
- 搭建自动化的PLC模糊测试平台
关键的几个问题已经厘清,那么现在就开始编写对应的脚本,首先制作好样本语料库接下来需要将各个环节串接起来,随机选取样本文件送入至变异引擎,经过变异后的输出报文经过SSL、拼接TPKT和COPT部分、代理发送至目标PLC,同时做好异常检测,如下图所示。利用python编写该脚本,主要部分有S7TLS_opencon、FUZZ engine、SSL、socks proxy、异常检测等等。编写完成后就可以进行针对目标PLC做fuzz测试了。
但是在测试过程中会遇到新问题,当目标PLC崩溃后整个模糊测试过程就停滞了,那么如何让整个模糊测试过程无停滞,即便有异常也记录异常后继续开始下一轮的模糊测试呢?
这里我们提出了一种方案,将目标PLC的电源系统也在fuzz程序中控制起来,当检测到目标PLC异常,做好相关记录后重启PLC待其状态正常后开始下一轮的模糊测试,就可以解决以上问题,如下图所示为该种方案的示意图。
我们基于以上的方案自己搭建了真实的测试系统,测试目标为S7-1215C,固件版本为2022年11月份发布的最新版本V4.6.0。如下所示,包含了电源控制部分硬件、异常检测部分硬件、目标PLC等等。这种自动化的模糊测试平台不仅适用于S7CommPlus_TLS协议,经过修改后还可以测试很多设备相关协议比如UMAS、codesysV2/V3。
此处链接是漏洞挖掘过程的demo视频。
6.研究成果
2021年8月份,我们给西门子提交了若干个S7CommPlus_TLS协议漏洞,经过多轮的沟通和解释,西门子也复现了相关漏洞,并在2022年2月份发布了一份安全通告SSA-838121[5],该份通告中修复了其中的3个漏洞,其中的2个漏洞较为严重,即便用户设置了最高访问保护等级level4也会受到影响,这些漏洞均可造成严重后果导致PLC崩溃无法正常工作,受控设备或者工艺过程将严重受损。
西门子在2022年12月份再次发布安全通告SSA-382653[6]修复其中的4个漏洞,其余的漏洞依然在调查和修改中。这4个漏洞影响S7-1200/S7-1500等系列产品的所有历史固件版本,影响广泛需要用户格外注意。可以看到工控类设备的漏洞修复周期长,即便西门子这样的国际顶级厂商也需要考虑方方面面的影响才能最终修复完成。
我们将这一系列影响S7CommPlus_TLS协议的漏洞统称为S7+:Crash[7],更多的资料参见链接。
7.防护措施及未来研究方向
全球工业现场的SIMATIC PLC使用广泛,应用于各行各业,如何加强防护避免PLC受这些漏洞的影响呢?在此做几点建议:
- 遵守厂商的安全建议,在检修期及时更新受影响产品的固件;
- 采用纵深防护策略,将受影响的产品置于更安全的位置,前端防止策略齐全的防火墙类安全产品等;
- 加强安全管理,所有维修或者外协人员均需要采用严格审计制度等。在安全管理中还需遵从企业内部的安全防护守则或者行业内的安全建设守则;
目前全球范围内暂时没有任何安全产品可以支持S7CommPlus_TLS协议的相关策略或者审计,因此对于不能及时升级产品固件的场景中企业需要加强安全管理来防止恶意攻击者。
关于该议题的研究还有很多工作可以开展,此处列举相关的几个研究方向:
- 目前生成样本的方法较为单一而且效率不高,因此如何生成更为丰富多样的样本值得深入研究;
- 目前的变异策略虽然很齐全,但是效率低下很多都是无效的变异,如何去除重复让变异更加精准也是一个研究方向;
- 现有的模糊测试平台仅采取了较为单一的反馈机制来添加样本语料库,没有进行更为丰富的反馈和路径覆盖的方法研究,后续可以在该方向继续深入;
- 针对SIMATIC PLC的调试方式单一,需要探索更为方便的调试方案来辅助快速分析漏洞和结合AFL等思路执行更为深入的安全测试方法。
8.总结
本文主要针对笔者的Black Hat EU的议题[8]进行了解读,首先分析了西门子增强设计的几个功能点——新增的安全通信协议和安全向导中的访问控制保护最新实现,然后重点分析了TLS安全协议的组成、明文获取方法、制作了伪造客户端控制最新版本的S7-1200/S7-1500控制器,接下来针对S7CommPlus_TLS协议提出了自动化模糊测试方案,其中详细介绍了样本制作、变异策略、异常检测、电源管理及其自动化模糊测试的实现等,最后展示了研究成果、提出了防护措施和未来的研究方向。
本文中提及的模糊测试方法具备通用性,稍作更改就可以应用到其他基于服务器角色设备的模糊测试过程中,希望文中提及到的研究方法可以帮助到更多的业内人员。
相关链接:
【4】: https://www.freebuf.com/articles/ics-articles/220239.html
【5】:https://cert-portal.siemens.com/productcert/pdf/ssa-838121.pdf
【6】:https://cert-portal.siemens.com/productcert/html/ssa-382653.html
【7】:https://github.com/ic3sw0rd/S7_plus_Crash