随着“互联网+”、“中国智能制造2025“、“工业4.0”等概念的提出,为了提高生产率,独立、隔离的传统工控领域将迎来了新的互联网时代,越来越多的工控设备(如控制器、机器人、数控机床)将被暴露在互联网上或者与企业内网相连。随着互联网时代的来临,安全问题会越来越突出。然而,工业控制系统的安全不同于传统信息网络的安全,一旦出现网络攻击,后果不堪设想。关于工控病毒相关关键事件如下:
近日,工匠实验室工控安全专家针对PLC进行深入研究,通过梯形图和SCL相结合的方式,利用PLC自身通信功能, 复现了这个病毒,实现了病毒在PLC与PLC之间进行传播。同时,针对这一病毒,我们已经开发了相应的检测工具,这标志着华创网安在工控安全领域掌握了这方面的核心技术,也体现了工控领域的研发实力。
PLC 实质是一种专用于工业控制的计算机,其硬件结构基本上与微型计算机相同,如图所示:
蠕虫病毒是一种常见的计算机病毒。它是利用网络进行复制和传播,传染途径是通过网络和电子邮件。最初的蠕虫病毒定义是因为在DOS环境下,病毒发作时会在屏幕上出现一条类似虫子的东西,胡乱吞吃屏幕上的字母并将其改形。蠕虫病毒是自包含的程序(或是一套程序),它能传播自身功能的拷贝或自身的某些部分到其他的计算机系统中(通常是经过网络连接)。
工控蠕虫主要的针对的对象是工业控制设备,通过控制器之间进行病毒传播,这与传统计算机蠕虫是存在很大差别,传统蠕虫寄生对象都是计算机(Window或者Linux),工控蠕虫寄生对象是控制器逻辑代码中。由于病毒可以混淆于正常的控制逻辑代码中,传统防御方式都不适合于工控蠕虫的防护,检测与查杀的方式更强困难。虽然工控蠕虫与计算机蠕虫存在很多的不同点,但所有的蠕虫的基本架构都是相同的。所有的蠕虫攻击都可以归为一下几个阶段:搜索目标,感染目标,在目标上执行,添加恶意功能。由于PLC控制器提供网络通信能力,在PLC上蠕虫也同样支持这些功能。这篇文章将展示每个必须组件的实现方法。
蠕虫实现的主要的编程软件为西门子的TIA Portal(博途),在TIA Portal(博途)编程软件中,用户通过编写程序来完成工业现场的控制以及工艺流程的实现。博途中分为以下几类块:
S7-1200只支持LAD、FBD和SCL三种编程语言,并且在下载过程中会先停止运行,然后下载程序,下载完成后重新启动。
病毒首先选择IP通过西门子通信端口102尝试建立连接,如果连接建立成功,则检查目标PLC是否已被感染。如连接未建立成功,或目标PLC已被感染,则选择新IP重新尝试建立连接。如目标PLC未被感染,则停止目标PLC,下装病毒程序,最后重新启动目标PLC。流程如下图所示。
西门子PLC通过102端口进行TCP通信,因此可以尝试通过102端口与设备建立TCP通信来寻找目标。博途开发平台提供了两个FB块——通讯连接块TCON和断开通讯连接块TDISCON,如下图所示。
程序块TCON和TDISCON的参数说明
如果TCON建立了连接则判断设备型号或者下载程序。由于TCON只需触发一次连接命令,就会一直尝试与目标建立连接,直到连接成功。因此,如果1s内没有建立连接则改变IP地址,尝试连接下一台PLC;如果建立了连接,则通过发送指令判断设备信号或者下载病毒程序,完成后改变IP地址,并尝试连接下一台设备。
断开连接后则更改IP地址,准备连接下一台设备
连接建立后,病毒调用数据传送命令TSEND和数据接收命令TRCV进行传播。见下图
程序块TSEND和TRCV的参数说明
病毒在传播感染之前需要判断当前对象是否已经被感染,避免重复感染。判断是否被感染,如果感染,则跳过感染,如果未感染,则执行程序传送,感染对象。具体实现如下图:
在程序的发送过程中,需要满足S7协议的相关通信时序以及报文格式。下图为S7建立连接的过程。首先是TCP的三次握手,接下来建立COTP连接,建立完成后进行S7协议的连接建立。
具体逻辑实现代码如下:
PLC执行顺序是从OB1开始,按顺序执行到OB9999的。
建立调用病毒程序的OB块OB9999,并将其存植入到目标PLC中,用以激病毒,并进行新的病毒传播感染。西门子PLC在运行时,会按照从OB1到OB9999的顺序进行调用。如下图所示。
在其他病毒块下载完成后,用OB9999(也可以用其他非系统自带的OB块,未了避免病毒的OB块与PLC中正常的OB块重复,建议块的序号尽量大些)启动病毒程序。
一旦PLC被感染病毒,会基于TCP主动去连接C&C服务器。通过C&C服务器,可以远程控制PLC,包括PLC的启停,输出值的改变等。当C&C服务器向连接了C&C服务器的PLC发送指令后,PLC会解析命令并执行。以点灯程序为例说明其危害性。下图为C&C服务器点灯的解析部分:
博途软件提供了PLC程序在线与离线差异的检测功能,如下图所示。程序块后面的绿色圆圈表示在线程序与离线程序一致,蓝色与橘黄色组成的圆形表示在线程序与离线程序不一致。块为虚样式,表示博途的程序中没有此块,而PLC有。
红灯表示PLC感染状态,绿灯表示PLC正常控制的终端运行状态,PLC使用的是西门子1200 V3版本,从左到右分别为PLC0,PLC1,PLC2。默认情况下,PLC1和PLC2离线的,当PLC0被感染后,PLC1和PLC2接入网络,随后PLC0就会感染PLC1和PLC2。
图1:PLC处于正常运行状态
图2:PLC0被感染病毒,反向联接C&C服务器
图3:PLC1与PLC2联网,PLC0正在感染PLC1
图4:PLC1被感染病毒,反向联接C&C服务器
图5:PLC2被感染病毒,反向联接C&C服务器