PLC会中病毒吗?解析恶意代码入侵路径与现场防御策略
发布时间:2026/9/30 23:46:20 锦皓数字建站

上周接到一个做设备维护的朋友打来的电话产线上一个工位偶尔会自己多动作一次时好时坏。换了传感器、查了接线问题依旧。我让他用编程软件打开在线监视程序翻了一会儿发现梯形图里多了一个谁都没印象的计数器逻辑。他那句“PLC这玩意这么封闭也会中病毒”正好印证了很多人对PLC安全的误解。这篇文章我想结合这些年做非标项目、跑现场调试、替朋友远程排障的真实经验把“PLC和病毒”这件事彻底拆开讲清楚PLC到底会不会被恶意代码影响、恶意代码是怎么进去的、进去之后有什么表现、日常怎么防、真出事了怎么应急。内容不堆术语但该有的原理我会尽量说透适合设备维护、电气工程师、非标项目调试人员和刚入门的PLC学习者收藏参考。1. “PLC是不会中毒的”——这个说法为什么对一半、错一半1.1 传统PC病毒确实没法直接在PLC上跑但这不是安全保证先说结论中合理的部分传统意义上那种以.exe可执行文件、DLL动态库、宏脚本为载体的PC病毒确实几乎无法在PLC里直接复制传播。原因在于PLC的运行架构和PC完全不同。PLC的CPU按固定扫描周期执行逻辑读输入、跑程序、刷输出周而复始。它的固件通常是封闭的实时系统或裸机程序没有通用操作系统那套完整的进程管理、文件系统、注册表和可执行权限模型。没有这些宿主环境x86的二进制病毒自然就没有“落地生根”的土壤。但“病毒文件跑不起来”和“PLC不会被恶意代码影响”是两码事。打个比方PC中毒是你钱包被偷、电脑被勒索症状很直接PLC中招更像是有人神不知鬼不觉改了你仓库的账本或者换了锁芯、留了后门钥匙设备按错误的流程运行而你手里拿的还是旧账本、旧钥匙——表面上看“系统正常”实际上早就不在你的掌控里了。1.2 工控网络早已不是封闭环境历史包袱开始反噬早期PLC确实“封闭”独立的控制柜、专用的编程电缆、点对点连接黑客想碰都碰不到。但现在的产线完全变了样PLC要连触摸屏要接上位机要通过工业以太网和MES、SCADA交换数据要做远程运维要让边缘网关采集数据上传云平台。一台PLC的网口直插交换机甚至被路由器端口映射到公网已经不是罕见事。2010年前后工业安全圈里那件被写进教科书的震网Stuxnet事件大家应该都听说过。它的核心攻击手法不是把PC病毒塞进PLC而是通过U盘和上位机的工程文件把一段经过伪装的逻辑下载进PLC让受控设备在特定条件下按错误参数运行。从那之后针对工控系统的扫描、挖矿木马、勒索软件开始成批出现它们不直接入侵PLC内部但会把PLC所在网络的暴露面当成跳板。所以现在聊“PLC中病毒”真正要防的不是“病毒文件传到PLC里运行”而是“有人把PLC里的程序、固件或参数换成恶意的那一份”。2. 恶意代码进入PLC的三条真实路径2.1 路径一编程电脑和U盘——最常见也最防不胜防这条路径在中小工厂里出现频率极高。工程师用笔记本下载完程序后顺手把工程文件拷进U盘U盘在办公室、家里、车间电脑之间来回插明天别的同事又把同一个U盘插到自己电脑上打开一份从客户那边拷来的“二手工程”。只要任何一台中间电脑中了毒恶意程序就能在打开工程文件时做手脚等到你在线连接PLC、执行“下载”操作时恶意逻辑就跟着工程文件一起被写进了PLC。我在实际排障中见过一个典型例子一套老产线的程序被某位工程师加了配方功能之后半年都好好的。突然某天开始每个班次结束时会有一台电机多转几秒。后来上载程序和原始备份做逐块比对发现程序里多了一个没有人认领的子程序而该子程序正是在那次“配方功能升级”时被一起带进来的。没人故意搞破坏但工程文件本身已经被污染了。所以对这一路径的防御重点不是PLC而是编程电脑和U盘的卫生专机专用、不连办公网、不插私人U盘、定期用杀毒软件全盘扫描工程文件传递时走加密压缩包并核对校验值比任何PLC层面防护都管用。2.2 路径二固件和引导层——最隐蔽、最难发现比程序被改更可怕的是固件被改。很多中高端PLC支持在线固件更新编程软件里就能刷写固件。如果攻击者拿到编程权限他不必费劲改梯形图可以直接刷一个带后门的固件进去。这种攻击的可怕之处在于后门可以在两层做文章。一种做法是你在编程软件里上载出来的梯形图完全正常和备份一模一样但PLC实际执行的是固件里另一套映射后的逻辑另一种做法是把恶意逻辑伪装成固件的一部分每次上电自动加载到你发现时设备已经按别人的“剧本”跑了很久。怎么发现靠直觉不行得靠证据链。日常维护时把CPU的固件版本号、序列号、硬件版本全部记录归档。某次巡检发现版本号与归档不符或者厂家根本没有发布过这个版本就要高度警惕。再配合“从官方渠道重新下载固件、核对官方校验和、重新刷写”来做恢复。对关键设备我建议把CPU的诊断缓冲区、固件升级记录定期导出留档真出问题时有据可查。2.3 路径三暴露的工业网口——攻击者根本不需要靠近设备Modbus TCP的502端口、西门子S7通信的102端口、EtherNet/IP的44818端口很多现场对这些端口没有任何访问控制。攻击者在扫描到设备型号后可以用标准Modbus功能码直接改写线圈和保持寄存器甚至通过厂商私有协议把一段程序下载进去。中低端PLC的默认状态往往是“无认证”的出厂不设口令编程软件连接即访问密码形同虚设。再加上很多采集设备为了省事把PLC、触摸屏、上位机的IP全部扔在同一个网段办公网的病毒一旦横向移动进来PLC基本就是裸奔状态。有些项目还喜欢把PLC端口直接映射到公网方便手机远程看数据这等于把车间大门的钥匙挂在互联网上扫描器几分钟就能发现。因此我反复和做设备的朋友强调对PLC来说网络隔离不是IT部门的额外要求而是保命底线。所谓“封闭”早就不是默认状态必须自己动手把该关的口子关掉。3. 已经有问题的PLC会暴露哪些破绽症状清单3.1 程序层指纹异常在线程序与离线归档的CRC或校验和不一致这是最基础的比对项。梯形图里出现没人认领的程序块、子程序、中断程序或者熟悉的程序块里多了一些比较指令、计数器、加法传送类指令。保持型寄存器、配方数据、断电记忆区被改动比如某组设定值凭空变了。部分恶意块会被设置成“受保护块”无法正常上载在线监视时看到的是灰色或带锁标记。正常的维护流程里每次检修都应该做一次“在线程序上载 与基线比对”。TIA博途、GX Works2、汇川编程软件都有离线在线比对功能只是很多工程师从来没用过。别嫌麻烦这一下能拦掉大部分程序层异常。3.2 行为层异常输出动作时序出现偏移某个阀本该先关再开变成先开再关互锁条件被绕过。故障出现跟着“次数”走设备运行第N次后突然停机或者某个计数器到达特定值后才发作。报警记录与实际情况对不上PLC诊断缓冲区里的时间戳和现场发生时间对不齐。现场设备动作与HMI显示不一致PLC实际输出和上位机指令之间出现“无理由的偏差”。这类异常最容易被误判为干扰、老化、接触不良。尤其是间歇性故障电工查一周查不出来最后上载程序一比才发现是逻辑被替换了。我遇到过的多数“疑难杂症”排到最后都会回到程序层面。3.3 系统层异常CPU固件版本号查询结果与铭牌、归档记录不符。诊断缓冲区里出现不明来源的“非法下载”“时间同步异常”“无权限访问被拒绝”记录。以太网口连接列表中多出未知IP或PLC与上位机间的通信时断时续。掉电后数据保持异常本来是永久保持的寄存器上电后被清零。这些系统层异常可能单独出现也可能和程序层异常叠加。真实现场里被入侵的PLC往往故意表现得很“正常”攻击者只会在关键时刻让某个输出偏一点点、让某组参数慢几秒这种伪装比直接损坏更让人头疼也更危险。4. 藏在程序里的三张暗牌逻辑炸弹、时间炸弹、权限劫持4.1 逻辑炸弹平时安静如鸡条件一满足立刻发作逻辑炸弹是PLC攻击里最经典的形态。它不靠病毒代码运行而是直接用梯形图或ST语言实现一个计数器在后台默默累计当累计次数达到某个预设值后置位某个中间继电器或故障位从而让输出动作偏离正常流程。为什么要重视这个因为PLC是最适合“放炸弹”的执行器常年通电、定时精准、断网后依然按程序运行而且它本身的可编程特性让恶意逻辑可以伪装成普通逻辑。在线监视时所有计数器都在跳你不会特别注意哪个计数器没有注释、没有HMI关联、没有报警文本。排查时要重点盯那些“无依无靠”的中间位没有触摸屏按钮关联、没有报警信息引用、没有注释说明却在持续累计的计数器、定时器和比较指令。把它们逐一找出来追查它们的置位/复位来源和后续动作对象。4.2 时间炸弹到点才发作防不胜防时间炸弹比计数型逻辑炸弹更隐蔽它把PLC内部实时时钟或累计运行时间作为触发条件。比如“在某个特定日期之后切换工艺参数”“设备累计运行超过多少小时后锁定某个输出”。因为普通维护人员很少去查看PLC系统时间相关逻辑等发作时已经晚了。排查方法也很简单在程序搜索功能里检索系统时间读取指令、日期比较指令、时钟同步功能块把凡是引用系统时钟的触点全部看一遍确认它们是不是正常工艺需要。尤其是那些没有HMI显示、没有上位机读取的“日历逻辑”都属于重点怀疑对象。4.3 权限劫持你连进都进不去别人却如入无人之境还有一种更阴的手段攻击者改了PLC的访问保护等级或口令。你在编程软件里输入旧密码发现进不去原本能下载程序的设备突然被锁定为只读或者固件被刷成带后门的版本后门程序通过某个隐藏端口维持着完整控制权限。权限劫持的可怕之处在于“你看到的一切都是别人想让你看到的”。编程软件界面里程序看着正常并不代表CPU里执行的是同一份逻辑。应对它靠的是外部机制物理层贴封条、程序层定期比对、网络层做访问白名单再加上最基础的——关键设备的密码全部由专人管理修改密码有记录防止“口令被换了你却不知道”。5. 主流品牌PLC的安全底子和比“堆硬件”更划算的防御投入5.1 常见PLC系列自带的安全能力速览品牌系列自带防护能力常见默认状态容易被忽视的短板西门子S7-200 SMART读取/写入口令保护默认不设口令以太网口直接访问编程软件连接无阻碍西门子S7-1200/1500访问保护级别、Know-How保护、证书新设备默认未配置保护无人主动设置密码时等于裸奔弱口令是常态三菱FX/Q系列CPU口令、远程口令默认无密码老FX以串口/485为主Q系列以太网模块默认开放汇川/台达等中端国产品牌用户权限、程序加密视型号而定多数出厂未启用以太网口默认开放Modbus端口裸露在外Codesys系平台设备用户管理、库保护、应用签名默认允许远程下载WebVisu/调试端口常见默认开启弱口令问题突出AB/Rockwell CompactLogixFactoryTalk安全、CIP Security老固件不支持加密CIP通信本身无认证太依赖网络隔离补位这张表不是要评价谁好谁坏而是想说明一个事实绝大多数PLC出厂时的设计逻辑是“默认信任内网”安全配置需要用户自己动手。很多项目做完调试就移交工程人员从来没设置过任何密码这才是不安全的最大来源。5.2 与其追求“高端安全型PLC”不如先把纵深防御做扎实有些朋友问是不是买支持TLS证书、安全下载、签名固件的高端PLC就万事大吉我的看法是设备侧安全只是“门票”真正的主体是外围防御。一台再安全的PLC如果网口被直接映射到公网、U盘随便插、工程文件乱拷贝照样完蛋。更现实的思路是“三层防御”边界层用VLAN和ACL把PLC、HMI、上位机放进独立网段办公网不允许直接访问中间层用工业防火墙做白名单只放行固定的IP和端口最后一层才是设备本身的密码、程序加密和固件校验。把安全预算花在“网络隔离”和“流程管理”上比单纯买贵PLC性价比高得多。6. 我在产线上执行的防PLC病毒清单可以直接抄作业6.1 建立基线备份和定期比对机制新设备上线或首次接手时完整上载一次PLC程序连同固件版本号、CPU序列号、硬件版本一起归档至少双份保存。用编程软件的“离线比对”功能在每次停机检修时反读在线程序和基线对比。发现差异第一时间查原因不要“看着没啥影响就忽略”。每次合法修改程序走固定流程修改前完整备份、修改后重新固化基线、更新归档说明。避免“改完不存档下次不知道哪份是对的”。这个习惯前期有点费时间但能救命。我见过太多工厂的PLC程序散落在不同工程师的笔记本里版本混乱连一份可信的基线都没有——这种情况下即使PLC中毒也没法判断因为你根本不知道“干净”长什么样。6.2 把网络和介质管理的“物理规矩”立起来编程电脑专机专用不连办公网不装无关软件U盘只允许使用专用盘并定期杀毒。PLC的IP和上位机、HMI规划在独立VLAN边界ACL只放行必要端口。比如允许上位机IP访问PLC的102端口其余来源一律拒绝。远程运维不要直接把PLC端口映射到外网改走工业防火墙的访问规则和白名单需要时才临时放行用完即关。控制柜里给PLC网口、编程口贴封条写上“严禁私接设备”。不要觉得小题大做现场临时工拿笔记本乱捅网口的案例太多了。6.3 怀疑PLC被搞了按这个顺序应急第一步发现异常后先拍照、拍视频、记录PLC指示灯状态和报警码能截图的截图保留第一现场证据。第二步断开PLC与上位机、交换机之间的网络连接断开可疑路径防止恶意逻辑被远程二次修改。第三步用干净的、刚从杀毒软件全盘扫过的电脑连接PLC完整上载当前运行程序另存为“疑似中毒版本”并做哈希记录千万不要直接覆盖。第四步与基线备份做离线逐块比对定位新增块、修改块同时查看CPU诊断缓冲区找非法下载、时间同步、异常上下电记录。第五步查杀编程电脑和所有用过的U盘排除中间层污染源。重新从官方渠道获取固件核对校验和后刷写恢复出厂级别的干净状态。第六步把基线程序下载回PLC验证所有IO动作、配方、时序符合预期后再重新接入网络接入后持续观察一到两个生产周期。这里特别提醒一句不要一发现异常就立刻断电。某些恶意逻辑正是靠断电触发下一步动作而且断电会丢失掉电保持数据和部分诊断信息。证据优先、分析优先操作顺序要克制。最后说点个人体会。做了这么多年现场真正遇到“蓄意攻击”的次数其实不多但“工程文件带毒”“编程电脑不干净”“U盘乱插导致程序被改、被覆盖、被锁”这类的间接事故我至少见过两位数。PLC不会像电脑那样弹窗、死机、蓝屏更不会在屏幕上告诉你“我中毒了”但它是工业现场的执行大脑一旦被改了控制器里的那份“真相”后果往往比几台电脑蓝屏严重得多。把每台PLC都当成一台需要备份、审计、隔离的“服务器”来管理这个习惯越早养成后面替自己省的事越多。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。