资讯详情

资讯详情

PLC也会中病毒?工控系统安全排查与防护实战指南

上个月处理一台产线的“怪病”设备白天运行正常凌晨三点左右主轴突然反转了几秒现场工人根本没碰按钮第二天查监控记录发现定时器 T37 的设定值从 50 变成了 500。大家的第一反应是触摸屏被误触可那块触摸屏根本没有配方写入功能。后来把程序上载回来对比才发现程序块被人动过手脚。于是有人问了一句PLC 也会中病毒吗我的回答是会而且中毒方式和你想的不太一样。PLC 不会像 Windows 那样弹个勒索窗口但它一旦被恶意代码盯上后果往往是设备反转、参数被改、产线停机甚至整条线报废。这篇文我就把 PLC 中毒的底层逻辑、常见传播路径、现场排查思路和防护手段一次性讲清楚。不管你是做非标自动化、设备维护还是正在做 PLC 毕业设计都建议认真看完。1. 先搞清楚PLC 里的“病毒”到底是什么形态1.1 我们平时说的病毒为什么不能直接在 PLC 里跑大多数人对“病毒”的印象是一个 EXE 文件双击运行然后感染系统。PLC 内部运行的是实时操作系统和梯形图解释器没有通用的 Shell 环境也没有内存中的进程概念更不会因为收到一个 exe 字节流就去执行它。所以严格来说普通 PC 病毒无法像感染电脑一样感染 PLC。但 PLC 有自己“脆弱”的地方它接受几种完全合法的上位操作比如下载程序、在线修改、读写数据块、强制点位、固件升级。这些操作本身就是工业自动化的日常需求无法完全禁止。恶意代码干的就是把本来给工程师用的“合法通道”变成自己的攻击入口。真实世界里的 PLC 中毒通常表现为以下三种形态形态现象破坏程度逻辑篡改型梯形图、ST 程序被修改定时器、计数器设定值被替换高可能造成设备动作混乱数据覆盖型数据块、保持寄存器被反复写入异常值PID 输出被干预中高影响控制精度和稳定性固件后门型CPU 固件被替换或降级隐藏恶意通信代码极高难以发现且难以清除这三种形态的共同点是恶意代码不需要在 PLC 内部“运行”它只需要在上位机软件或通信报文层面完成欺骗让 PLC 按照恶意设定的逻辑运行。就好比有人偷改了你的洗衣程序洗衣机本身没中毒但洗出来的衣服还是不对劲。1.2 为什么 PLC 中毒比电脑中毒更可怕办公电脑中毒最坏的结果是数据加密、重装系统。PLC 中毒最坏的结果是设备在错误的时间输出错误的动作机械臂直接把人夹住伺服电机飞车压力容器超限。这不是耸人听闻工业安全领域有大量案例。更麻烦的是PLC 的运行环境往往不具备病毒查杀条件。你不能给 S7-200 SMART 装一个杀毒软件也不能给三菱 FX5U 做在线病毒扫描。程序写进 CPU 之后如果没有定期备份和校验机制连“是否被改过”都很难查清。很多设备维护团队一听到“PLC 有问题”第一反应是重新下载一次程序结果旧程序本身就是带毒的版本从此陷入循环。1.3 先给“PLC 病毒”下一个可操作的定义在我做过的几十个工控现场里真正实用的定义是一切未经授权、非预期地改变 PLC 运行逻辑或通信行为的数据与指令都属于 PLC 层面的攻击。它可能来自被感染的工程电脑可能来自网络中扫描端口的上位机也可能来自一个伪装成调试工具的程序。理解了这一点你才会明白为什么“我厂里装了防火墙为什么还会中招”这种问题毫无意义。因为大量 PLC 中毒事件根本不是从互联网直接进来的而是从你身边的笔记本电脑、U 盘、第三方调试软件进来的。2. 病毒到底是怎么进到 PLC 控制柜里的2.1 路径一最容易被忽视的编程电脑和 U 盘我见过太多现场工程师的操作习惯是这样的电脑平时用来上网、收发邮件、下载图纸到了现场就打开博途或者 GX Works 连接 PLC。如果这台电脑已经被病毒感染病毒不用直接攻击 PLC它只做一件事——监听或篡改组态软件与 PLC 之间的传输数据。举个例子某现场发生过这样的事编程电脑感染了一种下载器木马它不会影响电脑本身的运行但会在后台疯狂扫描内网中的 PLC 端口。一旦发现 102 端口S7 通信或 502 端口Modbus TCP开放就会尝试用弱口令或未授权访问去读取和覆盖 PLC 程序。因为这个木马用的全部是工程师日常操作的手法和协议工业防火墙很难区分它是“人在调试”还是“代码在调试”。而 U 盘更是经典传播介质。很多老款 PLC 没有网口只有编程口工程师只能通过 USB 转串口线连接。如果这个转换驱动或电脑系统里潜伏了键盘记录器每次下载程序的数据流都可能被截获和修改。我就见过有工厂的工艺参数反复漂移查了半个月才发现是电脑里的病毒在下载环节悄悄改动了配方数据。2.2 路径二工控网络里的明文协议和非法访问现代 PLC 几乎都支持以太网通信但大量老协议在设计时根本未考虑安全性。S7comm、Modbus TCP、三菱 MC Protocol这些都是明文协议没有身份认证没有加密。只要攻击者能通过 ARP 欺骗、端口扫描等方式进入你的控制网段就可以直接向 PLC 发送读写指令。这里说一个关键知识点PLC 的端口问题。很多人只关注“IP 地址能不能 Ping 通”却忽略了目标 PLC 的协议端口。调试时经常遇到“建立连接需要目标 PLC 的 AMSNetID6 字节网络标识符和端口号”这种提示——这其实是 TwinCAT 等系统中的 AMS 通信机制。如果你在配置连接时随手填了一个错误的端口号连接固然会失败但这意味着任何知道正确 AMSNetID 和端口号的人都可以在网络中直接发起通信。攻击者扫描工控网络时常用的就是 Python 脚本扫端口。一个很简单的脚本扫到 102 端口开放的 PLC再用默认的空口令或弱口令连接就能读取程序区。这个过程不需要什么高级黑客技术很多搞自动化的人也能做到区别在于是否越过那条线。2.3 路径三第三方工具、触摸屏程序和“好心人”插件工控圈子里有一种不太好的习惯下载一个破解版的编程软件或者从 QQ 群、网盘里拿一个“PLC 监控小工具”“万能解密器”来用。这些工具本身可能是无害的但你在下载和安装的过程中无法保证文件是否被二次打包。另外触摸屏程序也是被攻击的高发点。很多触摸屏支持 U 盘下载工程、SD 卡自动更新还有远程维护模块。一个可以接两个触摸屏的 PLC 系统通常通过交换机连接。如果有人把恶意工程文件下载到其中一台触摸屏HMI 就会在上电时向 PLC 发送预设的写入指令相当于把人家的毒逻辑“上传”到了 PLC 里。历史上影响最大的工业病毒事件是 2010 年被公开的震网病毒。它利用了 Windows 系统的漏洞和西门子 S7 系列 PLC 的逻辑块覆盖机制专门针对特定型号的控制器让设备在特定条件下改变运行频率和速度。震网病毒横空出世之后全世界的工控安全团队才真正意识到PLC 不只是执行指令的傻终端它是一个可以被精确打击的目标。3. 现场实录我排查过的几次“疑似中毒”故障这一部分我选几个代表性案例分别是台达 PLC 下载失败、PID 温度波动、西门子 PLC 与变频器通信中断、博途组态密码报错。这些故障表面上是常见调试问题但排查过程往往能暴露出安全漏洞。3.1 台达 PLC 下载不了程序是中毒还是端口配置问题有次客户打电话说台达 PLC 连不上程序下载不进去。我第一反应是检查通信端口设置。台达的编程软件 ISPSoft 在连接时要确认通信方式是 USB、COM 还是 Ethernet并且要正确填写站号、IP 地址和端口号。很多老工程师习惯了用 COM 口换了以太网机型后还是用默认 COM 设置自然连不上。但那次问题不是端口。我现场用编程软件扫描能正常识别到 PLC 的 MAC 地址和 IP说明物理链路没问题可一旦执行上传程序操作就超时。后来我用串口工具抓了一下报文发现有人在用另一个 IP 地址同时对这台 PLC 发起 Modbus 读请求频率非常高把 PLC 的通信处理时间占满了。这不是病毒本身而是“疑似攻击行为”。排查思路是先把交换机上其他网线逐一断开确认是哪个设备在刷请求然后把那个设备的 IP 和 MAC 记下来检查它的进程。最终发现是一台安装了老旧组态软件的工控机里面有 PLC 地址扫描功能自动启动后疯狂轮询。这个案例给我们的教训是端口号和 IP 配置本身没有错但通信链路上的异常流量会模仿出“中毒”的症状。遇到下载失败先别急着怀疑 PLC 坏了先看通信冲突和异常流量。3.2 温度 PID 波动大我却查到了异常的心跳请求另一个现场是加热炉温控系统PID 温度波动特别大温差在设定值上下不停振荡。按常规思路我首先检查 PID 参数比例带、积分时间、微分时间还有采样周期。一般来说温差波动大可能是采样周期过长或积分时间太小把 P 降到 80、I 提到 20 秒左右波动通常能稳定下来。但那次改完参数后波动暂时减小过了一个小时又恢复了。我后来把编程软件切到在线监视查看 CPU 扫描周期。正常情况下 S7-200 SMART 的扫描周期在几毫秒到几十毫秒之间但当时的扫描时间忽高忽低最高的时候接近 200 毫秒。这很不正常。我用一个第三方的 PLC 监控小工具抓取通信包发现每隔 500 毫秒左右就有一个来自外部节点的小包请求读 PLC 状态。排查后发现那是上一任工程师留下的一套远程 IO 映射软件它虽然没造成硬件损坏但持续占用 PLC 的通信任务导致 PID 的采样周期被拉长温度控制自然不稳。如果你也遇到 PID 温差波动大、怎么调参数都不对的情况一定不要只盯着 PID 参数应该先看 PLC 的扫描周期和通信负载。因为 PID 调节的前提是定时器准确采样如果采样周期被异常通信干扰参数怎么调都会“水土不服”。3.3 西门子 PLC 与森兰变频器通信偶发中断是病毒还是从站掉线客户现场用的是西门子 S7-200 SMART 系列 PLC通过 Modbus RTU 和一台森兰 SB200 系列高性能通用型变频器通信。故障现象是运行十几分钟后PLC 报通信错误变频器停机。每次都这样规律性很强。我先是按常规套路检查通信线、屏蔽层和接地都正常。后来检查 PLC 程序里的 Modbus 主站指令发现它发送请求的间隔设置太短而变频器从站响应时间较长导致主站频繁超时重试通信链路被占用。将发送间隔从 50ms 调到 200ms 后问题基本解决。但让我在意的是在通信中断那一刻我通过 Wi-Fi 连到管理网络检查现场 IPC 时发现有一台电脑正在后台扫描 502 端口。虽然那次故障根源不是这台电脑但这种情况说明工控网络里随时可能有设备在试探别人的通信端口。如果这种扫描行为遇上没有密码保护的 PLC就非常危险。跳过相关性给工控设备之间设置通信超时是很重要的保护而这也是默认配置中容易被忽视的地方。很多通信中断不是被“攻击”而是被“试探”拖垮。3.4 博途“密码出错”报警组态数据真的安全吗调试时经常遇到一种提示“通过 IP 下载程序在线检查保护机密 PLC 组态数据的密码时出错”。第一次看到这条信息很多人会以为自己的密码输错了其实是 TIA Portal 的“组态保护”功能在起作用。当你勾选了“保护机密组态数据”选项后上位机软件在下载时会用加密方式处理某些系统数据块如果工程文件与 CPU 中的密钥不一致就会报错。这个功能本身是为了防止程序被随意读取和复制。但在实际项目中我发现很多工程师从来不用它。原因很简单怕忘了密码自己解不开。可你想过没有PLC 在线状态下别人使用同一个编程软件一样能上载程序而且如果 PLC 没有设置访问级别你的梯形图对别人来说就是一本打开的书。我在做三菱 PLC 项目时GX Works3 里同样有密码和关键字保护功能很多同事觉得“加了密码麻烦”于是干脆不设防。这在工厂里是极其致命的一个习惯。自动化程序的泄露和篡改比设备损坏更难察觉。4. 给 PLC 做一套完整的“免疫系统”从物理到网络4.1 先把物理防护做好再谈网络防护很多人觉得 PLC 柜门上锁是防外人其实更重要的原因是防止未经授权的程序下载。PLC 的 RUN/STOP 拨码开关是可视化状态指示。在正常生产时CPU 应处于 RUN 状态。如果发现 CPU 意外进入 STOP且没有人动过拨码开关这就是一个需要高度重视的报警信号。我建议在项目交付时给每个控制柜做一次物理安全确认编程口保护盖是否完好网口是否有多余的跳线触摸屏是否设置了操作员密码。在非标自动化项目中这一步经常被忽略因为赶工期。但你只要在调试阶段花 20 分钟做好物理清单后面能省下来按天计算的停机排查时间。4.2 设置 PLC 访问密码的正确姿势不同品牌的 PLC 设置方式不同但核心原则一致既要在编程软件侧设置工程保护密码也要在 CPU 侧设置访问保护。西门子 S7-200 SMART在系统块中设置密码保护级别可以限制上载、下载和监控功能。三菱 FX5U / Q 系列在 GX Works3 中设置关键字或远程密码防止未授权访问还可启用 MC 协议连接密码。汇川 PLC在 AutoShop 编程软件中可设置下载保护密码实时监控可能需要联机验证。台达 PLC通过 ISPSoft 或 WPLSoft 的程序保护功能设置上传/下载密码。设置密码时有一个很多工程师没做到的细节密码不要只设一个要把“查看程序密码”和“修改程序密码”分开。如果是设备维护人员只给读权限如果是程序调整才给写权限。这样即使电脑中毒或账号泄露对方修改程序的门槛也更高。4.3 网络隔离让 PLC 不在“裸奔状态”工业以太网环境里最好用的安全手段不是杀毒软件而是隔离和最小化开放端口。PLC 作为从站设备只需要和固定的 HMI、上位机、变频器通信根本没必要暴露在办公网络里。推荐做三层隔离层级操作方式目的物理隔离PLC 网段与办公网物理分开使用独立交换机减少外部攻击入口逻辑隔离VLAN 划分仅允许控制网内部互访防止广播风暴和跨网段扫描协议白名单只放行 PLC 与 HMI/上位机/变频器之间的固定端口通信拦截非预期访问请求以西门子 PLC 为例S7 通信主要使用 TCP 102 端口Modbus TCP 使用 502 端口OPC UA 使用 4840 端口。如果你在交换机或防火墙上发现来自外部设备的请求频繁访问这些端口就要高度重视。这通常是扫描行为或者恶意程序的典型动作。4.4 程序备份不仅防感染也防误操作我给设备做保护时最看重的一件事是留下可靠的程序基线。一个 PLC 项目做完后我会将源程序、编译后的文件、CPU 内程序在线比对哈希值、HMI 工程、配方数据全部备份存放在至少两个不同的地方。这个习惯在排查“中没中毒”时至关重要。有一次客户说三菱 PLC 程序被病毒改了我上载程序后和历史备份对比发现只是注释丢失了逻辑本身没变虚惊一场。但如果没有备份你根本无法判断“当前程序是正常版本还是篡改版本”。有个简单办法在编程软件里把当前程序上传后使用网络查找工具或 PLC 程序对比功能比对差异。很多编程软件都自带“在线/离线比较”比如博途的“比较”功能、台达 ISPSoft 的工程比较、三菱 GX Works 的程序比较用起来非常方便。4.5 小心“AI 生成 PLC 代码”的新风险现在越来越多的人试用 AI PLC 代码生成工具输入工艺要求就能生成一段梯形图或 ST 程序。这确实能提高开发效率但也带来了一个新隐患AI 生成的代码不透明你很难判断其中是否包含可疑指令、隐形定时器或隐蔽通信功能。我并不是反对 AI 生成代码而是建议务必对生成代码做三步审查第一逐条理解指令含义确认没有陌生指令第二检查程序是否调用了通信指令比如发送/接收、MPI 通信、Socket 通信确认通信对象是否合法第三在仿真环境或备用 CPU 上试运行观察 IO 动作是否与工艺逻辑一致。绝不要把 AI 生成的代码直接灌进在线设备。5. PLC 疑似中毒后的应急处置与排查流程5.1 发现异常后的前两分钟不要急着断电这里有个反直觉的重点发现设备异常动作或程序疑似被篡改时第一件事不是断电而是记录现场状态。断电会让 CPU 内的临时数据、报警队列、诊断缓冲区信息全部丢失这些恰恰是分析攻击来源的最重要证据。我的建议是两个人协作一个人立即用手机拍下触摸屏上的报警画面、PLC 的 RUN/STOP 指示灯状态、通信模块的指示灯状态另一个人用网线抓包工具记录网络流量。如果条件允许把 PLC 的诊断缓冲区和事件日志读取保存再做下一步动作。如果设备正在执行危险动作必须以人员安全为先直接按急停。但完成急停后建议先用编程软件读取 CPU 状态记录扫描周期和当前程序块再断电。5.2 判断是逻辑中毒还是程序被误修改在程序上载后和备份程序做比对是最快的方法。如果不具备在线比对条件可以先观察几个关键特征特征可能原因定时器、计数器设定值被批量修改程序被改写或数据块被覆盖程序块数量增加或减少可能存在隐藏逻辑块FOR / 函数调用次数异常代码被插入了新的调用逻辑网络通信指令突然增多可能存在远程控制后门保持型寄存器断电后仍自动变化可能被远程持续写入我在一次排查中发现某个 PLC 的“十字路口红绿灯”程序被人加了一个指针跳转逻辑原本应该按顺序执行的东西在某些外部条件下会跳过黄灯直接切换绿灯。这种修改很隐蔽不看全部梯形图根本不知道。所以做 PLC 编程时不要只看单个网络的逻辑要留意整个程序的控制流。5.3 恢复程序的正确姿态先清除后恢复如果确认程序被篡改恢复步骤不要只是“把备份下载进去”。因为 CPU 原有内存中可能还残留着被篡改的数据块。稳妥做法是清除 PLC 内存中的所有程序和数据通常在编程软件中选择“删除所有程序”或“初始化 PLC 内存”。重新启动 CPU确认处于空白状态。将经过校验的备份程序下载到 CPU。核对程序版本同时检查 PLC 的日期时间。因为很多恶意程序会修改系统时间导致日志记录覆盖混乱。下载完成后把 CPU 的维护密码重新设置一次避免使用工程默认密码。恢复后不要立刻恢复到全自动运行建议先手动单步运行观察关键输出点位的动作序列和工艺要求是否一致再切换自动模式。5.4 如何排查“藏在合法操作里的后门”有时候程序对比结果完全一致但设备依然异常。这时要重点检查 HMI 和通信设置。很多病毒会感染触摸屏工程而不是 PLC 本身。触摸屏和 PLC 之间是通过协议交换数据的HMI 在后台可以定时向 PLC 写入设定值。如果 PLC 程序没问题请把触摸屏工程也重新下载升级一遍。还有一个容易忽视的地方PLC 与变频器、软启动器之间的接线和通信参数。控制软启动器一拖三的接线、西门子 PLC 与变频器的 Modbus 通信都是通过参数区交互的。恶意代码不一定改梯形图它可能只改变频器的运行频率地址让电机在正常程序之外动作。排查这类问题要检查每一个通信从站的参数表而不是只看 PLC 主站的逻辑。6. 从日常运维出发给 PLC 建立长期“免疫力”6.1 现场工控机的使用规范别拿编程电脑乱用场景再复杂原理始终简单PLC 里不会凭空天降病毒绝大多数攻击都要经由一台授权电脑或移动介质。所以给现场编程、调试、运维准备一台专用电脑不要在这台电脑上浏览网页、下载破解软件、接收陌生 U 盘文件。如果不具备专用电脑至少需要在每次连接 PLC 前做一次病毒扫描并关闭不必要的远程桌面服务和文件共享端口。在工厂里经常有一些电工图省事把自己办公电脑直接连到 PLC 上这是最要命的。6.2 用“监控小工具”和测试软件时要留个心眼市面上有大量 PLC 监控小工具、Modbus 调试助手、串口助手它们确实能帮助分析通信问题。但我建议对这些工具的来源保持警惕。尤其是某些带有“破解”“绿色版”“免安装”字样的调试软件可能已经被别有用心的人捆绑了后门程序。你用它连接 PLC 抓数据的同时它也能把你现场的程序上传到别人的服务器。平台化解决方案尽量使用官方或广泛验证的开源工具并校验文件的哈希值。如果软件必须通过某网盘下载先在隔离虚拟机中运行一次确认无异常网络行为后再用于现场。6.3 毕业设计和小型自动化项目别忽略安全意识我经常看到学生做 PLC 毕业设计比如“十字路口红绿灯 PLC 程序”“PLC 电机顺启逆停定时器”在实验室里用一个小型 PLC 和模拟负载运行。这些项目本身能锻炼编程能力但很多人养成了几个坏习惯一是程序没有注释二是从来不用密码保护三是程序文件到处拷贝。小型实验性系统和工业产线故障区别仅仅在于后果的严重程度。如果你能在一台小 PLC 上养成备份、密码、版本管理的习惯到了大型非标项目中就会从容很多。另外有些学校项目使用 stm32 PLC 或低成本 DIY PLC这类产品往往没有成熟的安全机制通信协议是自定义的且多数不具备程序加密功能。用它做学习没问题但千万别把它冒充工业 PLC 部署到真实产线上。6.4 做一份“安全巡检清单”让设备负责人签字确认最后分享一个我觉得最实用的小技巧把 PLC 安全巡检做成固定流程而不是“出了问题再查”。巡检表可以包含以下内容CPU 运行状态是否和当前生产状态一致PLC 程序是否做过在线修改修改时间是否在审批计划内编程电脑是否安装杀毒软件和补丁控制网段内是否有陌生 IP 接入触摸屏、变频器等从站设备的通信负载是否正常备份文件和实际程序哈希值是否一致我见过太多工厂没人知道“上一个改程序的人是谁”出了事故互相扯皮。有了巡检表不仅能发现异常苗头还能建立清晰的责任链。对于 PLC 会不会中病毒这个问题我在实际项目中的体会就是它不需要运行 EXE 才叫中毒只要有人未经授权改了一段定时器参数、向数据块写入了一个异常值就已经是一次安全事件。真正有效的防御不是靠某个神秘工具而是把“程序有备份、端口有管控、电脑有隔离、操作有记录”这几件事做扎实。你能做到这几点哪怕遇到针对工控系统的恶意攻击也大概率能及时发现、快速恢复。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →