2010年,全扫震网病毒让伊朗核设施里的描及离心机转得发疯,物理损坏了上千台。漏洞利用那时候安全圈才反应过来——原来PLC(可编程逻辑控制器)这种藏在工厂铁皮柜里的框架小盒子,一旦被攻破,全扫后果比服务器被黑严重得多。描及我见过不少工厂,漏洞利用工程师用笔记本电脑直连PLC调试,框架密码就写在设备标签上,全扫甚至默认的描及“1234”都没改过。这不是漏洞利用个别现象,而是框架工业控制的常态。
PLC的全扫脆弱性根子在于协议。Modbus、描及S7comm、漏洞利用EtherNet/IP这些老协议,设计时压根没考虑加密和认证。你发一个写线圈的指令,PLC就照做,不问你身份。扫描这类设备不需要什么高端工具,Nmap加一个Modbus脚本就能扫出整个车间的PLC型号、固件版本、寄存器状态。更狠的是,有些PLC直接开放了web管理界面,用默认口令就能登录,改个输出点就像点鼠标一样简单。
但扫描只是第一步。真正麻烦的是漏洞利用。PLC不像电脑,打补丁要停机,停机意味着产线停摆,老板要骂人。所以很多PLC常年不更新固件,漏洞堆成山。比如西门子S7-300的硬编码密钥,直接可以解密通信流量;罗克韦尔的某些型号存在缓冲区溢出,发送特定长度的报文就能让CPU崩溃——这还算好的,崩溃顶多停机,要是碰上能注入代码的漏洞,攻击者可以直接改写梯形图逻辑,让设备按恶意指令运行。想象一下,一个污水处理厂的曝气池控制逻辑被改成间歇性停止,几天后微生物死光,出水超标,罚款上百万。
我搭建过一个测试框架,专门干这事。流程不复杂:先扫描目标网络,识别PLC品牌和型号,用指纹库匹配已知漏洞,然后调用对应的利用模块。模块分两类,一类是信息收集型,读取寄存器值、上传程序块,搞清工艺逻辑;另一类是破坏型,写强制值、禁用安全联锁、甚至擦除整个用户程序。框架里最让我意外的是,很多“漏洞”根本不算漏洞——是设计缺陷。比如Modbus功能码0x05写单个线圈,没有任何权限校验,你只要知道线圈地址,就能远程启停电机。这就像你家门锁只防君子,不防小人,而且钥匙人人都有。
实际操作中,最大的障碍不是技术,而是网络隔离。现代工厂通常有防火墙隔开IT和OT网络,但总有例外——我去过一家汽车零部件厂,他们的暖通系统PLC竟然直接接在办公网上,因为当初安装时图方便,省了一台工业网关。这种“便利”的代价是,一旦办公网被攻破,PLC就像剥了壳的鸡蛋。另一个问题是无线连接,有些老工厂用无线HMI(人机界面)控制行车,信号没加密,抓包就能拿到控制指令,重放一遍就能让行车乱跑。
说实话,这个框架的杀伤力让我自己都心虚。但我不觉得公布它有什么问题——安全研究的意义在于让防守方知道自己的墙有多矮。我见过太多工厂的安全评估报告,写着“物理隔离,风险可控”,结果现场一看,工程师的笔记本上装了TeamViewer,远程桌面直接对着PLC编程软件。你堵住了外网,堵不住人心。框架的价值不是用来攻击,而是用来检验——对,检验那些“我们认为安全”的环节,到底经不经得起一次真正的攻击。
最后说个细节。我测试过一台国产PLC,它的固件里藏着一条后门指令,文档里没有,但用串口调试工具发特定字节就能解锁全部功能。这种代码级的安全隐患,靠扫描器永远发现不了,只能靠逆向工程或者内部人员泄露。所以别迷信工具,PLC安全的核心是人——是那个设置弱口令的工程师,是那个为了省事跳过安全联锁的调试员,也是那个觉得“没人会黑我们”的车间主任。框架只是放大镜,把这些问题照得清清楚楚罢了。