当前位置:首页 > 机械智慧 > 正文

西门子、施耐德、罗克韦尔PLC程序设计漏洞探秘

写在前面(文中链接仅在同名微信公众号有效)前面我们谈到了不论是西门子、施耐德、罗克韦尔,或者其它工控系统,都不存在绝对的安全,并分享了工业控制相关的安全案例:施耐德PLC漏洞历险记—一次与施耐德PLC的非正常接触罗克韦尔MicroLogixPLC漏洞的复现及解决方案PS:可以看到西门子S7-1500...

写在前面(文中链接仅在同名微信公众号有效)前面我们谈到了不论是西门子、施耐德、罗克韦尔,或者其它工控系统,都不存在绝对的安全,并分享了工业控制相关的安全案例:施耐德PLC漏洞历险记—一次与施耐德PLC......

写在前面(文中链接仅在同名微信公众号有效)

前面我们谈到了不论是西门子、施耐德、罗克韦尔,或者其它工控系统,都不存在绝对的安全,并分享了工业控制相关的安全案例:

施耐德PLC漏洞历险记—一次与施耐德PLC的非正常接触

罗克韦尔MicroLogixPLC漏洞的复现及解决方案

PS:可以看到西门子S7-1500,施耐德Quantumn,罗克韦尔MicroLogix等均不例外,大家也不用就说这几家的工控系统不安全,没有哪家的工控系统是100%安全的~

西门子PLC

西门子S7系列PLC提供了不同方式的PLC组态编程,例如原理图表示(LAD或FBD)、类似于Pascal的编程语言(SCL)以及类似于汇编的编程语言(STL)等。不管输入源的类型如何,PLC程序都将程序编译为MC7字节码(STL甚至是较低级的表示形式)。


当组态软件编译好工程文件(MC7文件格式)后,通过西门子的S7COMM/S7COMM-PLUS协议下装到PLC中,然后由PLC中的MC7虚拟机进行调度并解释执行MC7字节码,由于虚拟机可以对程序所访问的资源进行限制,编译出的字节码无法直接操作硬件,只能访问虚拟机提供的资源,如通过FB块中TCON以及TDISCON去建立TCP连接发送接收数据,也就是说编译出的组态程序有进行恶意网络活动的能力。


西门子并没有对MC7字节码进行文档化,只能通过一些逆向手段去理解字节码中对应的汇编指令,好在有人已经做了这一部分工作(可以使用JEB的插件),只需要使用该工具就可以对MC7文件进行反汇编甚至反编译来理解组态程序中的代码逻辑,通过此方法在分析Stuxnet这类西门子蠕虫病毒尤其有用。


施耐德PLC

在施耐德PLC中,无论是梯形图(LD),结构化文本(ST)还是功能块语言(FBD)都会被统一编译成ARM机器码,由ARM处理器直接执行的,所以可以完全访问PLC上的软硬件资源。


当施耐德的组态软件编译好工程后,可以直接通过施耐德的ModBus90功能码(UMAS协议)下装到PLC中,PLC启动后会执行编译好的ARM机器码。如果ARM字节码中被攻击者注入恶意代码,那么攻击者便可以完全控制PLC,拥有对网络,文件系统,硬件IO等关键资源的访问控制权。


漏洞详情

本次以施耐德某漏洞为例进行讲解(其余如西门子S7-1500,施耐德Quantumn,罗克韦尔MicroLogix等相关实例漏洞操作和复现见以下推荐阅读),该漏洞出现的根本原因,主要是施耐德PLC把组态程序直接编译成ARM机器码,在执行时没有对其访问的资源进行限制,导致了针对施耐德PLC的蠕虫病毒可能具有更强的隐蔽性和更大的破坏力。


施耐德PLC漏洞历险记—一次与施耐德PLC的非正常接触

罗克韦尔MicroLogixPLC漏洞的复现及解决方案

UnityPro逆向工程

UnityPro是施耐德PLC对应的组态编程软件,通过该软件可以对PLC进行编程。为了在编译后的ARM代码中注入代码,应该先找到实现代码编译的地方。如下图所示,导出函数MyAsmArmStream就是负责将ARM汇编代码编译成ARM机器码。


在该函数第一个参数指向ARM汇编字符串,返回的是编译好的ARM的机器码数据:


为了定位用户编写的代码在整个ARM汇编中的位置,可以编写测试代码(如下图):


生成的代码肯定包含立即数1000(0x3e8),通过搜索该立即数,就可以快速定位到用户代码在组态程序中的位置,并获得相应的汇编代码。


只需要hook该函数,并修改传入的汇编代码,即可实现在施耐德PLC中执行任意代码。

代码编写

施耐德PLC使用的是Vxworks操作系统,该系统已经提供了利用所需要的函数,只需要在固件中找到所需要的函数地址(网络访问,账号管理,文件访问等),并在ARM汇编中直接调用即可。


这些函数的原型官网已有相关文档,只需要构造好参数,调用即可。如下图的loginUserAdd函数可以添加一个账号,攻击者可以通过该函数来向PLC添加一个后门账号。


利用思路

1.将原始重命名为asm_,方便调用自定义的dll动态库。

2.将恶意(该dll主要劫持MyAsmArmStream,修改传入的ARM汇编代码,并调用原始的)放入Unity文件夹。

3.运行Unity并加载PLC工程。

4.重新编译项目。

5.停止PLC。

6.将工程上传到PLC

7.启动运行PLC后,恶意的代码将会被执行。

漏洞修复

施耐德已经发布了安全通告,并给出了安全补丁和安全建议。在上位机的修复中,主要检查了组件的完整性,如果某个组件被修改的话,将会导致软件不可启动,必须重新安装。


严格来说,这只是缓解措施,有很多技术可以达到绕过安全性检查(patch安全性检查的地方,远程注入,直接伪造恶意的客户端下装恶意工程等),设计上的漏洞从软件层面并不是那么容易修复。

总结

本文主要探讨了施耐德CVE-2020-7475漏洞产生的根本原因,并且简单介绍了漏洞的原理和一些利用的思路。可以预见的是,该漏洞并不容易从根本上完全修复,只能通过其他技术手段进行规避,这也说明了工业控制系统不仅在实现上要考虑安全,在设计之初也需要考虑安全,安全应该贯穿整个生命周期。

参考连接

硬核专辑

工业技术热点|数据采集

WinCC技术|工业网络|

MES技术相关|工业巨头战略布局|

工业通讯案例|仿真与虚拟调试

职业感悟、认知提升|自动化控制标准合集

应用与库(西门子、罗克韦尔、倍福等)


最全盘点卡中国脖子的35项技术,折射中国工业水平的真实现状

2020-09-05


自动化设备数据采集项目中S7-1500和PC的时间同步

2020-09-02


一文了解西门子、达索、施耐德、罗克韦尔等巨头数字化工厂仿真软件

2020-08-27


134页官方PPT解读西门子数字化工业服务

2020-08-24


美国如何靠软件卡死中国制造?工业软件从业者超硬核科普

2020-08-21


国内第一份公开的工信部含有物流仿真的行业标准(下载)-物流数字化仓储

2020-08-20


解读西门子的工业软件帝国,巨头的数字化工业战略

2020-08-18


【C#上位机必看】从零开始练手IT与OT融合通信项目

2020-08-17


深度解析SCADA、物联网IOT和MES之间的联系与区别

2020-08-14


软件定义PLC与制造的时代,工程师的职业未来在哪里?

2020-08-12


Modbus的RTU、ASCII、TCP傻傻搞不清楚?一文最全解读

2020-08-10


IT大举入侵OT,自动化早已成为一个“软件”行业

2020-08-09

最新文章