S7comm协议深度解析:西门子PLC通信机理与攻击识别实战
S7comm/S7comm-Plus 协议结构、功能码分析、典型攻击模式与DPI防御
系统讲解 S7comm 与 S7comm-Plus 协议栈结构、通信机理、功能码语义,结合真实攻击场景剖析重放、注入、停机、固件提取四类典型攻击,给出工业防火墙DPI识别与白名单防御的工程化方案。
引言:为什么 S7comm 是工控安全的”必修课”
西门子是全球 PLC 市场的绝对领导者,其 S7-200/300/400/1200/1500 系列 PLC 在中国工业现场占有率超过 40%,覆盖电力、化工、石油、冶金、市政、智能制造等关键行业。S7comm 与 S7comm-Plus 作为这些 PLC 的”母语”,是任何工控安全研究、协议解析、攻击检测、防御方案无法绕开的核心协议。
从工控安全事件复盘角度看,S7comm 协议相关的事件占比居高不下。Stuxnet(2010)针对 S7-315/417 的攻击是工控安全的”分水岭事件”,2019年ICS-CERT 披露的 Siemens SNAP LAN 远程代码执行漏洞族、2021年的S7-1500 拒绝服务漏洞、2024年披露的TIA Portal 工程文件解析漏洞,均涉及 S7comm 协议层的攻击面。
理解 S7comm 协议机理,是构建工控协议深度解析能力、识别协议层攻击、设计协议白名单防御的前提。
S7comm 协议栈结构
三层嵌套架构
S7comm 协议是一个三层嵌套的协议栈,从下到上分别为:
应用层:S7 Communication (S7comm) — 西门子私有协议
表示层:COTP (Connection Oriented Transport Protocol) — ISO 8073
传输层:TPKT (Transport Service on top of TCP) — RFC 1006
承载层:TCP/IP — TCP 102 端口
每一层都承担明确职责:
TPKT 层(Transport Service on top of TCP):
- 主要作用是在 TCP 流中划分 PDU(Protocol Data Unit)边界
- TPKT 头固定 4 字节:版本号(1 字节,固定 0x03)、保留(1 字节,0x00)、长度(2 字节,含 TPKT 头)
- 长度字段使接收方能从字节流中切分出独立的协议层消息
COTP 层(Connection Oriented Transport Protocol):
- ISO 8073 标准,提供面向连接的传输服务
- COTP 头含 PDU 类型(CR/CC/DT/DR 等)、长度字段、目的/源引用(TPDU Number)
- COTP 数据 PDU(DT)承载 S7comm 数据;连接建立 PDU(CR/CC)用于会话建立
S7comm 层(西门子私有协议):
- 用户数据首部:协议 ID(固定 0x32)、ROSCTR(Job/Ack/Data)、冗余长度、PDU 引用
- 参数区:功能码(Function Code)、子功能码(Subfunction Code)
- 数据区:变长,具体格式依功能码而定
S7comm-Plus 的演进
S7-1200/1500 引入的 S7comm-Plus 在保持 TCP 102 端口的基础上做了重大演进:
演进一:引入 ISO-on-TCP 之上的私有传输层。 TPKT 头格式保留但增加了版本协商与扩展能力。
演进二:默认启用 TLS 加密。 S7-1500 与 TIA Portal 通信默认启用 TLS 1.2+,对没有配置 TLS 的客户端拒绝通信。
演进三:引入”完整连接保护”(Connection Protection)。 通过 CPU 属性的”连接机制”选项,要求客户端提供凭证。
演进四:引入符号寻址(Symbolic Addressing)。 不再仅依赖绝对地址,支持通过符号名访问变量。
演进六:差异化强认证。 引入基于”PG/PC 连接密码”的访问控制,密码错误次数超限锁定。
这些演进显著提升了 S7comm-Plus 的安全性,但也使协议解析与攻击检测的难度大幅上升。
S7comm 关键功能码语义
S7comm 协议的核心操作通过功能码(Function Code)与子功能码(Subfunction Code)组合定义。理解功能码语义是协议分析与攻击识别的关键。
用户数据功能码
| 功能码 | 名称 | 用途 |
|---|---|---|
| 0x04 | Read Var | 读取变量(输入/输出/位/字节/字/双字/计数器/定时器) |
| 0x05 | Write Var | 写入变量 |
| 0x1A | Request Download | 请求下载(上传/下载块、读取块信息等) |
| 0x1B | Download Block | 下载块(将块内容传输到 PLC) |
| 0x1C | Download Ended | 下载结束 |
| 0x1D | Start Upload | 开始上传(读取 CPU 中的块) |
| 0x1E | Upload | 上传块 |
| 0x1F | Upload Ended | 上传结束 |
| 0x28 | PI Service | 程序调用(启动/停止 CPU、内存复位等) |
| 0x29 | PLC Stop | 停止 PLC(CPU 切换到 STOP 模式) |
PI Service 子功能(CPU 控制类,最敏感)
| 子功能码 | 名称 | 风险等级 |
|---|---|---|
| 0x00 | Unknown | - |
| 0x01 | Incomplete | - |
| 0x02 | Hot Restart | 中危(重新启动 CPU) |
| 0x03 | Cold Restart | 高危(冷启动,丢失非保持变量) |
| 0x04 | Stop | 极高危(CPU 立即停止) |
| 0x05 | Copy RAM to ROM | 中危(写入 ROM) |
| 0x06 | Compress | 低危(内存压缩) |
| 0x09 | Memory Reset | 极高危(清空内存) |
| 0x0B | Set Password | 中危(设置 CPU 访问密码) |
PI Service 子功能是 S7comm 攻击的核心战场。Stuxnet 利用 0x28 0x04 序列注入代码修改离心机频率;2018 年披露的 TRISIS/TRITON 攻击通过 S7 通信向 SIS 控制器注入恶意代码。
上传/下载子功能(块操作类)
| 子功能码 | 名称 | 用途 | 风险等级 |
|---|---|---|---|
| 0x00 | Request | 请求下载指定块 | 低 |
| 0x01 | Read Active Block Info | 读取活动块信息 | 中 |
| 0x02 | Insert | 插入块 | 极高危 |
| 0x03 | Insert End | 插入结束 | 极高危 |
| 0x04 | Delete | 删除块 | 极高危 |
| 0x05-0x07 | Module Identification | 模块识别 | 低 |
| 0x08 | Read Block Info | 读取块信息(上传前) | 中 |
| 0x09-0x0B | Read Block | 读取块(上传块内容) | 高(知识产权窃取) |
| 0x0C-0x0E | Read Block End | 上传结束 | 高 |
实战功能码风险评估
从协议层安全分析角度,不同功能码的风险等级差异显著:
极高危功能码:CPU 停止、内存复位、块删除/插入、PG 密码修改——这些操作一旦被滥用直接威胁生产安全。
高危功能码:块上传、组态写入——这些操作一旦被滥用直接导致信息泄露或工艺篡改。
中危功能码:变量读写、块信息读取——这些是正常运维操作,但需基于最小权限原则授权。
低危功能码:心跳、连接保活——这些是正常通信操作,一般无需特殊授权。
工业防火墙应能识别功能码级别,并在 DI 配置(Detection & Inspection)层实施白名单控制。
S7comm 典型攻击模式
攻击模式一:协议重放攻击
机理:攻击者截获合法的 S7comm 通信报文,重新发送给 PLC,达到欺骗 PLC 执行特定操作的目的。
典型场景:
- 截获工程师站的写值操作报文,重放到 PLC,使 PLC 执行非预期的工艺操作
- 截获 PLC 的心跳报文,模拟 PLC 响应进行欺骗
真实案例:Stuxnet 的攻击链中包含协议重放环节。攻击者通过修改离心机频率的写值操作报文,使离心机长时间偏离正常频率运行,最终导致物理损毁。
防御:实施连接认证(PG/PC 连接密码)、消息序列号、反重放机制。
攻击模式二:协议注入攻击
机理:攻击者构造恶意的 S7comm 报文,直接发送给 PLC,覆盖 PLC 的正常运行逻辑。
典型场景:
- 注入 PI Service 0x28 0x04(CPU Stop)使 PLC 立即停止
- 注入变量写值操作修改关键工艺参数(温度、压力、流量)
- 注入块下载操作替换 PLC 程序
真实案例:2018年 TRITON 攻击针对施耐德 Tricon 安全仪表系统,攻击者通过 S7 兼容协议注入恶意程序,使 SIS 控制器失效。
防御:工业防火墙基于白名单严格控制写操作、敏感功能码、组态下载。
攻击模式三:协议枚举与信息收集
机理:攻击者利用 S7comm 协议枚举 PLC 的型号、固件版本、模块配置、程序块,为后续攻击做准备。
典型场景:
- 读取 PLC 系统状态列表(System State Lists)获取 CPU 型号、固件版本、模块信息
- 枚举 PLC 中的块(OB/FB/FC/DB)获取程序结构信息
- 读取 PLC 诊断缓冲区获取运行历史与告警
真实案例:2019 年披露的”Siemens S7-1500 CPU 信息泄露”漏洞(CVE-2019-13945),攻击者无需认证即可读取 PLC 信息。
防御:禁用未授权的枚举操作,启用 S7 通信密码,启用”访问保护”功能。
攻击模式四:协议级拒绝服务
机理:攻击者通过构造异常的 S7 消息使 PLC 进入异常状态。
典型场景:
- 发送畸形 TPKT/COTP 报文导致 PLC 通信栈异常
- 高频率连接请求耗尽 PLC 通信资源
- 触发 PLC 看门狗机制导致 PLC 重启
真实案例:2018年披露的”Siemens S7-300/400 拒绝服务”漏洞(CVE-2018-4844),攻击者通过 S7comm 异常报文导致 PLC 进入 STOP 模式。
防御:工业防火墙的协议合规性检查、连接数限制、异常行为阻断。
工业防火墙的 S7comm DPI 防御
三层 DPI 识别架构
完整的 S7comm DPI 防御应包含三层识别:
协议层 DPI(Structural Validation):
- TPKT 头合法性(版本号、长度字段)
- COTP PDU 类型合法性(CR/CC/DT/DR 等)
- S7comm 头合法性(协议 ID、ROSCTR、长度)
- 嵌套关系合法性(TPKT 长度 ≥ COTP 长度 + 4;S7comm 长度 ≥ 用户数据)
功能码层 DPI(Function Code Filtering):
- 基于白名单的允许功能码列表(如允许 0x04/0x05,禁止 0x28 0x04/0x09 等)
- 子功能码级白名单(如允许 0x1A 0x00,禁止 0x1A 0x02/0x04)
- 操作方向(上传 vs 下载)的精细控制
行为层 DPI(Behavioral Analysis):
- 通信对象白名单(限定源 IP、目的 IP)
- 通信时段控制(限定允许通信的时间窗口)
- 通信量基线(正常通信量的统计基线,异常偏离告警)
- 操作模式识别(识别批量下载、连续停机请求等异常模式)
白名单配置工程实践
基于风险评估与最小权限原则,S7comm 白名单配置建议:
层级一:协议白名单(最严格场景) 仅允许 0x04 读、0x05 写(写仅允许特定变量)、禁止所有 PI Service、禁止所有块上传/下载。
层级二:操作白名单(典型工程师站) 允许 0x04 读、0x05 写、0x1A 0x08-0x0E(块上传,用于备份)、0x28 0x02(热重启,用于维护);禁止 0x28 0x04/0x09(停机/复位)、禁止 0x1A 0x02-0x04(块删除/插入)。
层级三:审计白名单(仅记录,不阻断) 记录所有功能码与子功能码,用于安全审计与异常分析。
S7comm-Plus 的特殊处理
S7comm-Plus 由于默认启用 TLS 加密,工业防火墙的 DPI 处理有三种策略:
策略一:基于元数据识别(不解密)。 通过 S7comm-Plus 握手过程的元数据(连接来源、客户端标识、TLS 版本)识别异常。适合加密流量比例高、解密成本大的场景。
策略二:协商解密。 在客户端与 PLC 之间部署解密代理,使用防火墙自身证书从 TLS 终结,加密流量解密后进行 DPI,再加密转发给 PLC。适合加密流量比例中等、有解密需求的场景。
策略三:证书前置。 在 PLC 端预置防火墙证书,由防火墙作为 MitM 中间件解密后检查。适合对加密流量有强制要求的合规场景。
策略选择需权衡安全需求、合规要求、性能成本三方面因素。
实战检查清单
OT 环境 S7comm 安全防御建议检查以下要点:
协议层:
- 工业防火墙是否支持 S7comm/S7comm-Plus 协议深度解析?
- 是否启用协议合规性检查(畸形报文阻断)?
- 是否配置功能码白名单?
认证层:
- PLC 是否启用 S7 通信密码?
- 是否启用 CPU 访问保护(Protection)?
- 工程师站是否启用 PG/PC 连接密码?
- S7-1500 是否启用 Connection Protection?
访问控制层:
- 工程师站访问 PLC 是否限定特定 IP?
- 远程运维是否通过堡垒机+协议代理?
- 第三方维护是否时限授权?
审计层:
- 是否记录所有 S7comm 通信日志?
- 是否对敏感操作(停机、复位、块操作)实时告警?
- 审计日志是否保存不少于6个月?
应急层:
- 是否制定 S7comm 异常事件应急预案?
- 是否具备 PLC 固件/程序备份与快速恢复能力?
- 是否定期演练应急流程?
结语:协议理解是工控安全防护的根基
S7comm 协议作为西门子 PLC 的”母语”,其深度解析能力是工业防火墙、IDS、审计平台、安全测试工具的共同基础。理解协议结构、功能码语义、典型攻击模式,是识别异常行为、设计白名单策略、构建纵深防御的前提。
奇固科威工业防火墙基于完整 S7comm/S7comm-Plus 协议解析,提供功能码级、对象级、操作级三层白名单控制,结合行为基线与异常检测,为西门子 PLC 部署环境提供工程化的协议层安全防护。
OT 安全是开放的行业。下一阶段,全球威胁情报与协议攻击模式应联动,工业防火墙、IDS、SOC 平台应将协议层信号纳入统一安全运营,构建”协议可解析、行为可识别、异常可响应”的工控安全运营能力。
发布:2026-09-22 | 作者:奇固科威