西门子柳州授权代理商
西门子柳州授权代理商
一个基于PLC的新型病毒:背景与病毒结构
PLC是工业领域中很常用的一种控制器。现在常用的PLC都配备有以太网接口,并采用了IP协议。我们基于西门子S7-1200设计了一个蠕虫病毒,这种蠕虫病毒不需要借助PC机,仅仅基于PLC设备就能实现扩散,攻击目标并将自身进行复制。该蠕虫病毒代码在目标机复制后不会发生变化,从而可以重复进行目标扫描,进一步扩散。我们分析了该蠕虫病毒的影响和预防措施。
1.概述
IT是现代工业控制系统的重要组成部分,因为如果没有IT系统,生产过程将无法进行。不幸的事,由于引入了IT系统,工控系统的使用者也面临着传统IT系统的信息安全威胁。IT系统的黑客可以从几个不同的角度威胁工控系统。他们可以引起生产中断,造成巨额经济损失,以及损坏周围人员的健康安全。震网病毒的案例充分说明了这一点。伊朗铀浓缩工作受西门子PLC被篡改的影响,被迫暂停。蠕虫病毒利用bbbbbbs的漏洞,在铀浓缩工厂的PC之间传播。PLC的软件被篡改,使得离心机被毁。该蠕虫病毒需要借助PC机进行传播,并基于PC机攻击PLC设备。本文演示了一种基于PLC设备进行传播的蠕虫病毒,而不需要PC机。这种病毒可能被在役的PLC传播到工控系统中,并在PLC之间传播和复制。该蠕虫病毒进入目标后,复制自身代码并修改目标PLC中已经下载完毕的用户代码,使病毒激活。本文基于西门子S7-1200 v3进行实验,用结构文本编辑病毒代码。
2.相关工作
2015年,Klick等人利用PLC的通信机制实现了一个代理,进而展示了一种病毒。本文利用这一通信机制,基于新型号的S7-1200 V3实现了蠕虫病毒在PLC之间的传播。
3.PLC结构
图1 Zyklus eines PLCs
PLC的过程映像区保存有所有输入和输出的状态,用户程序在过程映像区中运行,不直接操作PLC的物理输入和输出接口。用户程序按照循环周期运行,在每个循环周期的开始和结束时间CPU会刷新过程映像区,循环的长时间限制被称作循环周期。如果超出了循环周期,PLC会停止运行并报异常。
程序组织单元(Program Organization Units,POU),西门子S7-1200支持如下POU:
组织块(Organization block,OB),进入用户程序的主要入口
数据块(Data block,DB),全局存储
函数(Function),函数
函数块(Function Block,FB),具有持续本地存储的函数
除了用户定义POU函数,西门子还提供了几种函数。包括TCON、TDISCON,利用这些函数PLC可以初始化和终止与任意系统之间的TCP连接。基于TRCV和TSEND函数缓冲区可以发送和接收函数。
4.计算机蠕虫病毒
蠕虫病毒攻击包括以下三个阶段:可能目标检测,向目标扩散,在目标上激活并执行恶意代码。
5.S7 1200的蠕虫病毒实现
5.1结构
在S7 1200PLC上实现蠕虫病毒首先要满足PLC关于大执行的循环时间限制,所以蠕虫病毒必须每隔几毫秒就暂停一次,然后在下一次循环周期开始时重新启动。为了满足这一要求,本文使用状态机设计蠕虫病毒,将病毒的当前状态保存在一个全局变量中,每隔循环周期的开始阶段会调用病毒的特定代码,确保病毒的运行不会超出PLC的循环时间限制。
图2显示了病毒的执行流程。蠕虫病毒首先与潜在目标建立一个连接,建立连接后蠕虫病毒先检测目标是否已被感染,如果没有被感染则停止目标上的用户程序,并复制自己并向目标传送自己的代码,然后重新启动PLC。然后继续检测潜在目标PLC,循环执行上述周期。
图2 蠕虫病毒的传播过程
5.2目标检测
蠕虫通过TCP的102端口检测潜在目标,该端口只能被外部的防火墙关闭,而且没有其他服务会使用该端口。
S7-1200使用POU的TCON函数管理TCP连接。源代码如列表3所示,其中第3行显示了POU的使用,第9行传递了一个任意的IP地址和端口。只要POU被调用,PLC就会尝试建立连接。这一过程是异步执行的。在稍后的循环周期中会验证连接状态。返回值DONE表返回连接是否建立。如果返回值为true,则继续传播。如果IP地址和端口的连接无法建立,则不会引起错误。通过在循环周期内增加一个不断增加的计数器,以实现定时功能。
图3 利用SCL检测目标
如果经过200个周期没有建立连接,则蠕虫会执行图4中的程序。如果没有建立连接,则必须调用POU的TDISCON释放资源以便建立下一个连接,如在第13行中所示,IP地址增加。从而实现对所有的子网进行扫描以寻找开放的204端口。
将USB-PPI 电缆连接到CPU的 RS485 端口,会强制CPU退出自由端口模式并启用 PPI 模式,CPU并不停机。这是CPU固件2.3版新增功能,会使 STEP 7-Micro/WIN SMART V2.3 恢复CPU 控制,实现上载或下载功能。 如果USB-PPI 电缆一直连接到CPU的 RS485 端口,则CPU无法启用自由端口。
2.未连接 USB-PPI 电缆,通过程序手动给SMB30赋值切换到PPI模式。
STEP 7 中组态 NTP 服务器
要为 S7-1500 CPU 组态一个或多个 NTP 服务器,请按以下步骤操作:
1. 在窗口中,打开 CPU 的属性并浏览到“常规 > PROFINET 接口 > 时间同
步”(General > PROFINET interface > Time synchronization)。
2. 在参数“服务器 1”(Server 1) 到“服务器 4”(Server 4) 中输入多 4 个 NTP 服务器的 IP
地址。
3. 在参数“更新间隔”(Update interval) 中设置时间查询的时间间隔。将更新间隔设置为
10 s 和 86400 s 之间。
调试
11.8 时间同步
自动化系统
284 系统手册, 11/2019, A5E03461186-AF
通过 “T_CONFIG” 指令更改 NTP 服务器的 IP 地址
对于 CPU,运行期间多可通过指令 T_CONFIG 更改 4 个 NTP 服务器的地址。
要求:至少已在 STEP 7 中组态一个 NTP 服务器。即使只组态了一个 NTP 服务器,仍可
通过 T_CONFIG 指令多组态四个 NTP 服务器。
要通过“T_CONFIG”指令更改 NTP 服务器的 IP 地址,请按以下步骤操作:
1. 在数据类型为 IF_CONF_NTP 的变量中存储 NTP 服务器的 IP 地址。
2. 将数据类型为 IF_CONF_NTP 的变量连接到指令 T_CONFIG 的块参数
CONF_DATA。
3. 在用户程序中调用 T_CONFIG 指令。
结果:CPU 通过 T_CONFIG 指令采用 NTP 服务器的地址。随后会覆盖在 STEP 7 中组
态的 NTP 服务器的地址。
必要时,也可使用 T_CONFIG 多次更改 NTP 服务器的地址。组态和更改 改 NTP 服务器
使用您自己的 NTP 服务器组态时间同步
自动化任务
在网络中使用自己的服务器。自己的服务器具有以下优势:
● 防止未经授权的外部访问
● 用您自己的 NTP 服务器同步的每一个设备都使用相同的时间。
您想使用该 NTP 服务器同步 S7-1500 CPU。
条件和参数PLC工作状态一目了然安装便捷,支持导轨式和螺钉式安装所有模块的输入输出端子可拆卸集成以太网口,程插针式连接,模块序下载、设备组网连接更加紧密通用 Micro sD卡支持程序下载和信号板扩展实现*化PLC固件更新配置,同时不占用电控西门子高速芯片配备超级电容,掉电基本指令执行时间可情况下,依然能保证时钟正常工作
您在 IP 地址为 192.168.1.15 的网路中有自己的服务器。
您位于 STEP 7 窗口的 PROFINET 接口 X1 属性中。
解决方案
1. 浏览到“属性 > 常规 > PROFINET 接口 > 时间同步 > NTP 程序”(Properties >
General > PROFINET interface > Time synchronization > NTP procedure)。
2. 在“服务器 1:”(Server 1:) 中输入 NTP 服务器的 IP 地址:192.168.1.15。
图 11-4 示例:组态 NTP 服务器
3. 将硬件配置下载到 CPU。
结果
S7-1500 使用 NTP 服务器 192.168.1.15 同步时间。
调试
11.8 时间同步
自动化系统
286 系统手册, 11/2019, A5E03461186-AF
在用户程序中更改 NTP 服务器的 IP 地址
自动化任务
在网络中更改 NTP 服务器。新的 NTP 服务器地址为“192.168.1.10”。
通过用户程序更改 NTP 服务器的 IP 地址,使其与您的 CPU 同步所使用的地址一致。
示例说明了如何通过用户程序使用指令“T_CONFIG”将 NTP 服务器的 IP 地址更改为
“192.168.1.10”。
条件和参数
要求:
● 在 STEP 7 中为 CPU 激活“通过 NTP 服务器启用时间同步”(Enable time
synchronization via NTP server) 选项。
● 已在 STEP 7 中组态如下 NTP 服务器:服务器 1“192.168.1.15”
要更改 NTP 服务器的 IP 地址,请使用“T_CONFIG”指令的以下块参数:
● Req:在块参数“Req”的上升沿启动“T_CONFIG”指令的作业。
● Interface:在块参数“Interface”中输入 CPU PROFINET 接口 1 的 HW ID。在本例
中,HW ID 为“64”。
● Conf_Data:保存 NTP 服务器 IP 地址的区域。为此使用数据类型“IF_CONF_NTP”。
调试
11.8 时间同步
自动化系统
系统手册, 11/2019, A5E03461186-AF 287
解决方案
要在用户程序中将 NTP 服务器的 IP 地址更改为“192.168.1.10”,请按以下步骤操作:
1. 在项目树的“程序块 > 添加新块”(Program blocks > Add new block) 下,创建一个全局
数据块。将全局数据块命名为“NTP”。
2. 在全局数据块“NTP”中,创建一个“IF_CONF_NTP”数据类型的变量。
图 11-5 使用 IF_CONF_NTP 的示例数据块
3. 在用户程序中创建“T_CONFIG”指令。
4. 按以下步骤,连接“T_CONFIG”指令。
图 11-6 T_CONFIG 示例:更改 NTP 服务器
调试
11.9 标识和维护数据