为什么它天生不安全
Modbus 诞生于串行总线时代,协议本身只做寻址和错误检测:功能码说明要干什么,CRC 负责报文有没有被干扰坏掉。它没有身份认证、没有访问控制、没有加密,也无法区分请求来自组态软件还是攻击工具。任何能连到 502 端口或串行总线上的进程,都可以读走全部寄存器,也可以直接改写线圈输出。CRC 只防传输误码,不防人为篡改,改完报文重算 CRC 即可通过校验。
基本信息
| 协议基础 | 主从问答,功能码 + 数据,无会话概念 |
|---|---|
| 认证 | 无,从站不校验主站身份 |
| 加密 | 无,明文传输 |
| 完整性 | 仅 CRC / 校验和,可被重算 |
| 权限模型 | 无用户与角色,能连上即可读写 |
| 广播写 | 地址 0 广播的写请求无需应答,无法追溯 |
典型攻击面
- 未授权改写线圈与保持寄存器:直接改变阀门、启停、设定值
- 伪造测量值:中间人改写读请求响应,让上位机看到虚假液位或温度
- 重放合法写请求:不需要懂协议语义,抓到报文即可反复下发
- 扫全网 502 端口做资产普查:从设备指纹与寄存器内容反推工艺
- 把 PLC 当跳板:攻破一台后经内网横向移动到其他 Modbus 设备
- 拒绝服务:高频请求占满从站处理能力,使正常轮询超时
弱点与补偿措施
| 弱点 | 后果 | 补偿手段 |
|---|---|---|
| 无认证 | 任意主机可读写 | 网络分区 + 防火墙只放行主站地址 |
| 无加密 | 报文可被窃听篡改 | IPsec / VPN / Modbus-TLS 隧道 |
| 无权限粒度 | 调试工具也能写生产数据 | 只读代理、写操作白名单、变更审计 |
| 广播写无应答 | 误下发无法追责 | 广播仅限时间同步等低风险用途 |
| 错误处理简陋 | 异常码不提示安全事件 | 深度包检测 + 写操作日志与告警 |
用防火墙收敛暴露面
用防火墙收敛暴露面
# nftables:只允许指定主站访问 502,其余丢弃
nft add rule inet filter input tcp dport 502 ip saddr 10.20.1.10 accept
nft add rule inet filter input tcp dport 502 drop
# iptables 等价写法
iptables -A INPUT -p tcp --dport 502 -s 10.20.1.10 -j ACCEPT
iptables -A INPUT -p tcp --dport 502 -j DROP把 502 端口映射到公网、或用端口转发直接暴露设备,是最危险的部署方式;远程维护必须经 VPN 或跳板机,并对来源做双重限制。
把从站地址当成口令来保密没有意义:地址只是寻址字段,扫描成本极低。Modbus/TLS 与深度包检测属于补偿性措施,具体支持范围与部署方式以官方规范与设备文档为准。