6.2 工业协议解析与特征工程(检测算法前置层)
工业协议解析与特征工程:Modbus、IEC 104、S7comm解析要点、四层特征体系、Zeek与Suricata规则及公开数据集。
6.2 工业协议解析与特征工程(检测算法前置层)
信源等级:L1/L2/L3 | 最后核验:2026-09-24 核心来源:IEC 60870-5-104/IEC 60870-5-101 标准、Modbus 协议规范、《信息与控制》期刊论文(DPI 功能码检测)、Zenodo/RICSel21 公开数据集、Zeek/Suricata 开源解析器文档 关联文档:5.3 工业通信协议与安全脆弱性(协议安全档案)、6.1 工控时序异常检测算法(过程侧检测)
一、定位:网络侧检测的前置层
6.1 解决**过程数据(传感器时序)的异常检测;本文解决网络流量(协议报文)**侧的检测前置问题:
原始报文 → 协议解析(DPI) → 特征工程 → 检测算法(规则/ML/DL) → 告警
└── 本篇范围 ────────────────────────┘ └─ 规则见本篇,ML 基线见 6.1 ─┘
两条路线互补:过程侧(6.1,物理量时序建模,可发现未改变流量形态的隐蔽攻击)与网络侧(本篇,功能码/地址/时序的协议语义违规,可发现注入、重放、扫描、DoS)。
二、主流工控协议的解析要点
2.1 Modbus/TCP(端口 502)
报文结构:MBAP 报文头(事务处理标识符 2B + 协议标识符 2B + 长度域 2B + 单元标识符 1B)+ PDU(功能码 1B + 数据)。
协议完整性检测三步(《信息与控制》2016 论文,L2[1]):
- 源或目的端口是否为 502;
- MBAP 协议标识符是否为 0x0000(Modbus/TCP 规定以此识别);
- MBAP 长度域 == TCP 载荷长度 - 6(事务标识符+协议标识符+长度三个域占 6 字节,L_len(MBAP) = L_TCP - 6)——防超长载荷导致从站缓存区溢出。
功能码分类深度解析(同上,L2[1]):
| 类别 | 功能码 | 数据部分解析 |
|---|---|---|
| 读操作类 | 01 读线圈、02 读离散输入、03 读保持寄存器、04 读输入寄存器、20 读文件记录、43 读设备识别码 | 起始地址(2B)+ 数量(2B) |
| 写操作类 | 05 写单个线圈、06 写单个寄存器、15(0x0F) 写多个线圈、16(0x10) 写多个寄存器、21 写文件记录 | 输出地址(2B)+ 输出值(2B)/ 数量 + 字节计数 |
| 其它操作类 | 22 屏蔽写寄存器、23 读/写多个寄存器 | 屏蔽/寄存器域值字段 |
白名单规则粒度可细至:源/目的 IP、协议、端口、功能码、寄存器地址范围、写入域值范围(例:FC06、地址 100
200、写入值 050 → Pass)[1]。 其余功能码(供完整基线参考):07 读异常状态、08 诊断、11/12 事件计数/事件日志、17 报告从站 ID、43 封装接口传输(L1,Modbus 协议规范)。
2.2 IEC 60870-5-104(端口 2404)
结构:TCP 承载;APCI(应用规约控制信息)三类帧——I 格式(信息帧,带发送/接收序号)、S 格式(确认帧)、U 格式(控制帧:启动/停止/测试);ASDU(应用服务数据单元)含 TypeID(类型标识)、COT(传送原因)、公共地址、IOA(信息对象地址)、信息体值、CP56Time 时间标签[2][3]。
Zeek 解析日志字段(icsnpp-iec60870-5-104,L3[2]):asdu_length、apdu_type、send_num/rec_num、ioa_num、cot、asdu_type(TypeID)、origin(发起方地址)、asdu_address、ioa、state_on/off、nva/sva/shortfloat(归一化/标度/短浮点值)、质量位(blocked/substituted/topical/valid/overflow)、初始化原因、总召唤/分组计数召唤限定词、CP56 时间七字段。
支持 ASDU 类型样例:M_SP_NA_1(1)、M_DP_NA_1(3)、M_ME_NA_1(9)、M_ME_NC_1(13)、M_SP_TB_1(30)、M_ME_TF_1(36)、C_SC_NA_1(45)、C_DC_NA_1(46)、C_IC_NA_1(100 总召唤)、C_RP_NC_1(105 复位) 等[2]。
2.3 S7comm(端口 102)
封装栈:IP | TCP | TPKT(ISO-on-TCP, RFC 1006, 4B 版本+长度) | COTP(ISO 8073, TSAP 寻址: rack+slot) | S7 头 + 参数段 + 数据段[4]。
S7 头关键字段:Protocol ID(标准 0x32 / 新型 0x72)、ROSCTR(读写服务类型)、Function Code、Parameter Length、Data Length、Error Code、Item Count[4]。
状态机建模(GW 模型,Goldenberg & Wool,特拉维夫大学网络安全实验室)[4]:
- 学习阶段:对 PLC-HMI 连接以”PDU 字段哈希”为符号构建 DFA(确定有限自动机),状态表示合法查询/响应交替;
- 执行阶段:4 类事件计数——Normal(正常)/ Retransmission(重传)/ Miss(丢失)/ Unknown(异常转换 → 告警);
- 配置:Max pattern length 75 符号、Validation window 300 符号;
- 实测:>98.16% 包判为 Normal;S7 流量呈周期性(固有 1 秒周期,AER ≈ PDU 符号率);良率提升技巧——将 S7 PDU 拆分为逐 item 的人工包再建 DFA(%Normal 升至 99.6%~99.9%)。
2.4 其他协议(解析器现状)
| 协议 | 端口 | 主流开源解析支持 |
|---|---|---|
| Modbus/TCP | 502 | Suricata 内置解析器(默认启用)、Zeek Modbus analyzer、Wireshark、pymodbus[5][6] |
| DNP3 | 20000 | Suricata 内置(默认启用)、Zeek[6] |
| EtherNet/IP + CIP | 44818 | Suricata 内置(默认禁用需开启)[6] |
| IEC 60870-5-104 | 2404 | Zeek Spicy 插件(DINA-community/icsnpp、georgemakrakis/zeek-iec104)、Wireshark packet-iec104.c[2][3] |
| S7comm | 102 | Wireshark;Suricata 不原生解析,需 Rust 插件 suricata-ics-parsers[6] |
| OPC UA | 4840 | ⚠️ 待核实(本次信源未覆盖其开源解析生态) |
三、特征工程:从报文到特征向量
3.1 四层特征体系
| 层次 | 特征示例 | 来源依据 |
|---|---|---|
| L1 包/流级(通用) | Flow Duration、Tot Fwd/Bwd Pkts、SYN/RST/PSH/ACK/URG/CWE/ECE flag 计数、包长分布、双向包间隔 | CICFlowMeter 标准流统计(Zenodo 数据集[7]) |
| L2 协议语义级 | 功能码分布与频率、COT 分布、TypeID 分布、IOA 集合、寄存器访问域、APCI 帧类型比(I/S/U)、写/读比、广播(unit_id=0)写 | IEC104 自定义解析器特征[7];Modbus 功能码 DPI[1] |
| L3 会话/时序级 | flow idle time(max/min/mean/std/variance)、轮询周期 z-score、请求-响应配对完整性(GW 模型 Miss/Unknown)、帧长时序 | IEC104 数据集流统计[7];GW 模型[4] |
| L4 图/行为级 | 进程-网络关联、攻击链图、跨传感器关联(衔接 6.1 GDN 类方法) | 行业通用认知 L4 |
IEC104 专用流统计特征全表(Zenodo 自定义 Python 解析器,基于 Scapy,L3[7]):
- 流级:flow idle time {max, min, mean, std, variance};
- 速率:
flow/fw/bw iec104 packets/s; - 帧型计数:
total IEC104_I_Message_SeqIOA packets(正向/反向)、I/S/U_Message packets; - TCP:SYN/RST/PSH/ACK/URG/CWE/ECE flag 计数。
3.2 检测规则样例(结构/行为型,映射 MITRE ATT&CK for ICS)
基于开源规则集(L3[6])归纳的六类规则,均以 1-2 周正常基线为前提:
| 规则 | 判据 | ATT&CK for ICS 映射 |
|---|---|---|
| 未授权客户端 | src_ip ∉ 授权主站清单 | T0886 ⚠️ 待核实(编号以官方为准) |
| 未授权功能码 | func_code ∉ 该会话白名单(写类 FC05/06/15/16/22/23 升为 critical) | T0855 Unauthorized Command Message |
| 写操作审计 | 写类功能码 + 寄存器地址提取 | T0836 Modify Parameter |
| 时序异常 | 轮询间隔 z-score > 5(vs 基线均值/方差) | T0831 Manipulation of Control |
| 协议违规 | MBAP 协议标识符 ≠ 0x0000 等 | T0830 Man in the Middle |
| 广播写 | unit_id=0 且写功能码 | 结构异常类 |
3.3 规则引擎适配(Suricata/Zeek)
- Suricata(逐包、无状态亦可):公开 ICS/OT 规则库示例——Modbus:oversized MBAP 长度(
byte_test > 254,关联 CVE-2017-16740)、重复发送 DoS、超规格读写数量(关联 CVE-2021-22659);DNP3:len_too_small/flooded/bad_link_crc、Operate/Direct-Operate、Cold/Warm Restart;EtherNet/IP:外源 RegisterSession、CIP Write Tag/Set_Attribute_Single/Forward_Open(映射 CISA AA26-097A 活动)[6]。规则风格偏结构/行为检测(协议异常、越界值、控制面操作)而非固定 exploit 字节签名; - Zeek(有状态解析、携带完整会话上下文):与 Suricata 互补——Suricata 逐包检查独立于解析器状态,Zeek 状态化解析给出行为 notice[6];
- 工控部署要点:设置
$HOME_NET为 OT 网段;阈值(detection_filter 计数)可内联调整[6]。
四、公开数据集与工具(评估必用)
| 资源 | 内容 | 链接/出处 |
|---|---|---|
| IEC 60870-5-104 Intrusion Detection Dataset(2022) | 12 种攻击(未授权命令 + DoS);pcap + CICFlowMeter TCP/IP 流统计 CSV + 自定义 IEC104 解析器流统计 CSV;含平衡训练/测试集;DOI: 10.21227/fj7s-f281 | Zenodo 7108614[7] |
| RICSel21(Linköping 大学,CRITIS 2021) | 仿真 SCADA 电网 12 种攻击:扫描/ARP 欺骗、丢包 DoS、SYN flood、流量洪泛、间歇丢包、序列号篡改(MitM)、传感器值篡改、时间戳篡改、IOA 篡改、重放、设定点注入、伪装第二 HMI;电力值每 5 秒采样 | RICS-el 测试床论文(CRITIS 2021)[8] |
| ICS-pcap | 公开工控协议 pcap 合集(iec104 等) | github.com/automayt/ICS-pcap[3] |
| Suricata ICS 规则库 | Modbus/DNP3/ENIP 结构行为规则 + 测试 pcap 生成脚本 | github.com/LeargasSecurity/leargas-suricata-public-rules[6] |
| Zeek 工控解析插件 | icsnpp-iec60870-5-104(Spicy)等 | github.com/DINA-community/icsnpp-iec60870-5-104[2] |
| SWaT/HAI 网络流量部分 | 网络数据 185Hz(SWaT,衔接 6.1 数据集表) | 6.1 已载[9] |
| Wireshark 协议解析 | packet-iec104.c 等标准 dissector | github.com/wireshark/wireshark[3] |
五、选型决策(工程落地建议)
需求:协议白名单/合规基线(写保护、地址域限定) → 功能码+地址+域值 DPI 白名单(3.1 方法[1])
需求:已知攻击特征(畸形帧/越界值/控制面滥用) → Suricata ICS 结构规则[6]
需求:会话上下文与行为异常(重放/序列错乱/召唤异常)→ Zeek 有状态解析 + GW 式 DFA 状态机[4]
需求:统计/ML 异常检测(未知威胁) → L2/L3 协议语义特征 + 流级特征 → RF/孤立森林/LSTM(基线见 6.1)
需求:评估基准 → Zenodo IEC104 数据集 / RICSel21[7][8]
六、来源引用
- 董海云 等,《基于功能码深度检测的 Modbus/TCP 通信访问控制方法》,《信息与控制》(DOI: 10.13976/j.cnki.xk.2016.0248)— https://xk.sia.cn/cn/article/pdf/preview/10.13976/j.cnki.xk.2016.0248.pdf (L2 学术)
- DINA-community,icsnpp-iec60870-5-104:Zeek Spicy 协议解析插件(字段与 ASDU 类型支持表,2025-05)— https://github.com/DINA-community/icsnpp-iec60870-5-104 (L3 开源)
- georgemakrakis,zeek-iec104:Zeek IEC 104 解析器(基于 Wireshark dissector 与 Brno UT 技术报告 Matoušek 2017;pcap 来源 ICS-pcap/Zenodo)— https://github.com/georgemakrakis/zeek-iec104 (L3 开源)
- Goldenberg & Wool(特拉维夫大学)/ IBM Research 演示材料,Accurate Modeling of the Siemens S7 SCADA Protocol for Intrusion Detection and Digital Forensics(GW 模型/TPKT-COTP-S7 栈/实测数据)— https://slideblast.com/download/presentation-ibm-research_59645ddb1723dd1771ae48ec.html (L2 学术)
- Anthropic-Cybersecurity-Skills(开源),detecting-modbus-protocol-anomalies(功能码表、基线与六类检测规则样例、ATT&CK 映射)— https://github.com/mukul975/Anthropic-Cybersecurity-Skills/blob/main/skills/detecting-modbus-protocol-anomalies/SKILL.md (L3 开源,编号以 MITRE 官方为准)
- LeargasSecurity,leargas-suricata-public-rules(开源 Suricata ICS 规则库:Modbus/DNP3/ENIP 内置解析器适配、CVE/CISA 映射、Suricata vs Zeek 互补说明)— https://github.com/LeargasSecurity/leargas-suricata-public-rules (L3 开源)
- Panagiotis et al.,IEC 60870-5-104 Intrusion Detection Dataset(2022,Zenodo,DOI: 10.21227/fj7s-f281;CICFlowMeter + 自定义 Python/Scapy 解析器特征表)— https://zenodo.org/records/7108614 (L3 数据集)
- Westring et al.,RICSel21: A dataset with network attacks targeting IEC-60870-5-104 in SCADA systems(CRITIS 2021,RICS-el 测试床)— https://www.ida.liu.se/labs/rtslab/publications/2021/CRITIS_2021_Westring.pdf (L2 学术)
- 衔接 6.1 工控时序异常检测算法(SWaT/HAI 数据集与 ML 基线,见本知识库 06 模块)
发布日期:2026-09-17 | 最后核验:2026-09-24 | 信源等级:L1/L2/L3