原创 | 初探施耐德PLC蠕虫技术
作者:互联网
在前一段时间,国外的研究人员发现了施耐德的代码注入漏洞(CVE-2020-7475),该漏洞可以使得施耐德PLC蠕虫化。如果成功利用该漏洞,可以让PLC充当一个小型PC机执行恶意的网络活动,充当内网跳板或者网络扫描器对工业系统进行隐蔽性更高的***活动。
设计缺陷
该漏洞是很明显的设计缺陷,接下来会从西门子PLC和施耐德PLC对于组态程序的设计来阐述漏洞发生的根本原因。
西门子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上的软硬件资源。
当施耐德的组态软件编译好工程后,可以直接通过施耐德的ModBus 90功能码(UMAS协议)下装到PLC中,PLC启动后会执行编译好的ARM机器码。如果ARM字节码中被***者注入恶意代码,那么***者便可以完全控制PLC,拥有对网络,文件系统,硬件IO等关键资源的访问控制权。
漏洞详情
该漏洞出现的根本原因,主要是施耐德PLC把组态程序直接编译成ARM机器码,在执行时没有对其访问的资源进行限制,导致了针对施耐德PLC的蠕虫病毒可能具有更强的隐蔽性和更大的破坏力。
Unity Pro逆向工程
Unity Pro是施耐德PLC对应的组态编程软件,通过该软件可以对PLC进行编程。为了在编译后的ARM代码中注入代码,应该先找到实现代码编译的地方。如下图所示,asmarm.dll导出函数MyAsmArmStream就是负责将ARM汇编代码编译成ARM机器码。
在该函数第一个参数指向ARM汇编字符串,返回的是编译好的ARM的机器码数据:
为了定位用户编写的代码在整个ARM汇编中的位置,可以编写测试代码(如下图):
生成的代码肯定包含立即数1000(0x3e8),通过搜索该立即数,就可以快速定位到用户代码在组态程序中的位置,并获得相应的汇编代码。
只需要hook该函数,并修改传入的汇编代码,即可实现在施耐德PLC中执行任意代码。
代码编写
施耐德PLC使用的是Vxworks操作系统,该系统已经提供了利用所需要的函数,只需要在固件中找到所需要的函数地址(网络访问,账号管理,文件访问等),并在ARM汇编中直接调用即可。
这些函数的原型官网已有相关文档,只需要构造好参数,调用即可。如下图的loginUserAdd函数可以添加一个账号,***者可以通过该函数来向PLC添加一个后门账号。
利用思路
1. 将原始asmArm.dll重命名为asm_Arm.dll ,方便调用自定义的dll动态库。
2. 将恶意asmArm.dll(该dll主要劫持MyAsmArmStream,修改传入的ARM汇编代码,并调用原始的asmArm.dll)放入Unity文件夹。
3. 运行Unity并加载PLC工程。
4. 重新编译项目。
5. 停止PLC。
6. 将工程上传到PLC
7. 启动运行PLC 后,恶意的代码将会被执行。
漏洞修复
施耐德已经发布了安全通告,并给出了安全补丁和安全建议。在上位机的修复中,主要检查了组件的完整性,如果某个组件被修改的话,将会导致软件不可启动,必须重新安装。
严格来说,这只是缓解措施,有很多技术可以达到绕过安全性检查(patch安全性检查的地方,远程注入,直接伪造恶意的客户端下装恶意工程等),设计上的漏洞从软件层面并不是那么容易修复。
总结
本文主要探讨了施耐德CVE-2020-7475漏洞产生的根本原因,并且简单介绍了漏洞的原理和一些利用的思路。可以预见的是,该漏洞并不容易从根本上完全修复,只能通过其他技术手段进行规避,这也说明了工业控制系统不仅在实现上要考虑安全,在设计之初也需要考虑安全,安全应该贯穿整个生命周期。
参考连接
https://airbus-cyber-security.com/applying-a-stuxnet-type-attack-to-a-modicon-plc/
转载请注明来自:网络安全应急技术国家工程实验室
标签:施耐德,代码,组态,漏洞,PLC,初探,ARM 来源: https://blog.51cto.com/15127558/2662513