VibeFuzzing · 协议模糊测试实战

7884 结构归纳推理引擎 · V17 DeepSeek Fuzz 报告

目标:FINS 工控协议服务端(欧姆龙工厂接口网络服务) · 在线协议 Fuzz
日期 2026-08-15 引擎 7884_brain.exe V17 变异引擎 Pro (55 策略) Fuzz 会话 29 崩溃样本 30 发现漏洞 7

0. 项目概述

本项目采用「VibeFuzzing」模式:由 DeepSeek 构造一个采用冷门且结构复杂工控协议的服务端靶子, 阅读 7884 引擎《使用说明.TXT》掌握方法论后,调用 7884_brain.exe NetGen 模式对该服务端执行在线协议模糊测试, 并对发现的崩溃进行归纳分析。测试遵循铁律:网络协议 Fuzz 一律使用 --engine pro(55 种变异策略 + 结构保护 + 字段感知)。

① 构造靶子 ② 阅读使用说明 ③ 编写 7884-net XML ④ NetGen 在线 Fuzz ⑤ 崩溃复现与分类 ⑥ 报告输出
7
发现漏洞
30
崩溃样本
29
Fuzz 会话(全命中)
1443
变异报文发送
0.912
结构归纳质量 CONVERGED

1. 目标服务端:FINS 工控协议靶子

协议背景

FINS(Factory Interface Network Service)为欧姆龙(OMRON)工厂自动化网络协议, 广泛用于 PLC 与上位机通信,属冷门、字段结构复杂的工控协议。标准承载于 UDP/TCP 9600 端口。

帧格式(应用层负载)

+------+------+------+------+------+------+------+------+------+------+--------+----------------+
| ICF  | RSV  | GCT  | DNA  | DA1  | DA2  | SNA  | SA1  | SA2  | SID  |  CMD   |   DATA(变长)   |
| 1B   | 1B   | 1B   | 1B   | 1B   | 1B   | 1B   | 1B   | 1B   | 1B   |  2B    |                |
+------+------+------+------+------+------+------+------+------+------+--------+----------------+
  帧头 10 字节    命令码(大端)     命令参数/数据

示例:80 00 02 00 01 00 00 01 00 01 | 0101 | 82 0000 0002(读 CIO 区 2 字)

靶子实现(Python → PyInstaller 打包 fins_server.exe)

模拟 PLC 内存区(DM/CIO 等 8 类区),实现内存区读/写、运行、节点数据读等命令分发, 异常处理路径视为进程级崩溃(命中后记录原始报文并立即退出,可被 process-alive 监视器捕获)。

内置 7 个漏洞埋点

ID触发命令漏洞类型异常
BUG-010x5B00除零 DoSZeroDivisionError
BUG-020x0101输入校验缺失KeyError
BUG-030x0101越界读IndexError
BUG-040x0102长度校验缺失struct.error
BUG-050x0102越界写IndexError
BUG-060x0401递归耗尽RecursionError
BUG-070x2301转换异常UnicodeDecodeError

2. 7884 引擎工作流(方法)

依据《使用说明.TXT》第四、五部分,本测试执行了两条能力链路

链路 A:手写 7884-net 协议脚本 → NetGen 在线 Fuzz(主链路)

> 7884_brain.exe --NetGen out\xml\fins_net.xml --engine pro -i 30000 --host 127.0.0.1 --port 9600
  [*] DataModel count: 2
  [*] StateModel: Main (initial=S1)   [*] Publisher: tcp-client 127.0.0.1:9600
  [*] Iterations: 30000, timeout: 2000 ms   [*] Engine: pro
  [!] MONITOR: target process died at iteration N
  iterations run / total sends / total recvs / timeouts / MONITOR: target process crashed

命令分发 XML:out\xml\fins_net.xml(通用)+ 4 个命令定向变体 fins_net_0102/0401/2301/5B00.xml。崩溃判定以 stdout 汇总行 MONITOR: target process crashed 为准; stderr 的 [NetState] 行仅作过程噪音,不参与统计。

链路 B:协议样本 → 结构归纳 → 自动生成协议 XML → Fuzz(闭环)

样本 8 个 req_*.bin Normal 归纳 model + format_schema.xml --script net net_schema.xml NetGen 命中崩溃
> 7884_brain.exe -i out\samples\req_only -o out\samples\output --cpu-threads 8
   Analysis completed successfully! [Threads: 20, Time: 0m 4s]
   quality_overall = 0.9124  (CONVERGED)    coverage = 1.0

> 7884_brain.exe --fast -m trained_model.model -s req_01.bin --script net
   [ResultGen] Generated <7884-net> XML: net_schema.xml

> 7884_brain.exe --NetGen net_schema.xml --engine pro -i 10000 --host 127.0.0.1 --port 9600
   [!] MONITOR: target process died at iteration 342   → BUG-02

引擎仅凭 8 个未知样本自动归纳出 FINS 结构(104 字段、580 关系、overall 0.912 收敛), 并自动生成协议 Fuzz 脚本,闭环命中真实崩溃——验证了"抓包样本 → 自动归纳 → 在线 fuzz"全自动能力。

3. Fuzz 执行明细

会话组XML轮次命中命令崩溃类型
通用 0101 定向(12 轮)fins_net.xmlround1-120x0101BUG-02 KeyError ×5 / BUG-03 IndexError ×7
0102 写命令(4 轮)fins_net_0102.xmlcmd0102_1-40x0102BUG-05 IndexError ×2 / BUG-04 struct.error ×2
0401 嵌套命令(4 轮)fins_net_0401.xmlcmd0401_1-40x0401BUG-06 RecursionError ×4
2301 节点读(4 轮)fins_net_2301.xmlcmd2301_1-40x2301BUG-07 UnicodeDecode ×4
5B00 畸形命令(4 轮)fins_net_5B00.xmlcmd5B00_1-4跨命令BUG-01 / BUG-02 / BUG-04 / BUG-07 各 1
归纳闭环(1 轮)net_schema.xml(自动生成)autogen0x0101BUG-02 KeyError ×1

29 个 Fuzz 会话全部命中崩溃(每次崩溃后重启靶子继续下一轮)。总发包 1443,平均每会话约 50 次迭代即触发崩溃,验证了 pro 引擎的字段感知变异效率。

4. 发现的漏洞清单(7 个)

ID命令漏洞类别异常类型触发条件命中CVSS 语义
BUG-010x5B00除零拒绝服务ZeroDivisionErrordata 前 2 字节为 0x0000,做除数1DoS(未授权崩溃)
BUG-020x0101枚举校验缺失KeyError内存区码不在合法集合(0x82/0x89…)7DoS / 逻辑缺陷
BUG-030x0101越界读IndexError起始地址 + 数量 超出内存区容量(如 addr=0xD400, CIO 仅 6144 字)8信息泄漏 / 崩溃
BUG-040x0102长度校验缺失struct.error声明 count 对应数据长度 > 实际接收数据(如 count=65304, 仅 679 字节可用)3DoS / 堆破坏前置
BUG-050x0102越界写IndexErroraddr+count 超出内存区容量,写入越界2内存破坏(高危)
BUG-060x0401递归耗尽RecursionError声明嵌套深度字段过大(如 0x0FFF),递归超出栈上限4栈溢出 / DoS
BUG-070x2301数据转换异常UnicodeDecodeError / ValueErrordata 区含非 ASCII 字节或非纯数字,直接 decode/int 转换5DoS / 输入校验缺陷
30
崩溃样本总数
7/7
埋点覆盖率 100%
29/29
会话崩溃率 100%

5. 崩溃样本统计

按漏洞分布(30 个样本)

BUG-03 越界读 · 8
BUG-02 区码越界 · 7
BUG-07 转换异常 · 5
BUG-06 递归过深 · 4
BUG-04 解包失败 · 3
BUG-05 越界写 · 2
BUG-01 除零 · 1

典型崩溃报文(复现用)

# BUG-03 越界读(0x0101, addr=0xD400 超出 CIO 区)
80 00 02 00 01 00 00 01 00 01 01 01 82 d4 00 00 02 ...
# BUG-04 解包失败(0x0102, count=0xFF18 数据不足)
80 00 02 00 01 00 00 01 00 01 01 02 89 ff ff 18 ff 1e 56 ...
# BUG-01 除零(0x5B00, divisor=0x0000)
80 00 02 00 01 00 00 01 00 01 5b 00 00 00 ...

全部原始崩溃样本已归档:out\crashes\*.bin(30 个,含触发帧);靶子崩溃目录亦保留现场。

6. 结论与修复建议

结论

  • 7884 NetGen pro 引擎对 FINS 这类字段级工控协议具备高效的结构感知变异能力:29 个会话全部在 2~343 次迭代内命中崩溃,平均约 50 次/会话。
  • 命令定向变异(种子命令)可快速覆盖各命令处理分支;通用 XML 则验证了跨命令随机变异(如 5B00 会话中变异出 0101/0102/2301 交叉命中)。
  • 结构归纳闭环(8 样本 → overall 0.912 CONVERGED → 自动生成 7884-net → 342 次迭代命中)证实引擎零先验知识即可完成未知协议的结构建模与 fuzz 投递。
  • 靶子 7/7 埋点全部被发现,说明"异常处理路径视为崩溃"的建模方式与 process-alive 监控在 Python 靶子上完全可行。

修复建议(按真实工程实践)

  • BUG-02/03/05:对内存区码建立白名单校验;读/写前校验 addr+count ≤ capacity
  • BUG-04:0102 命令严格校验 len(data) == count*2,不足即回长度错误码。
  • BUG-01:任何源自报文数据的除数先判零。
  • BUG-06:嵌套深度限制(如 ≤64)或改为迭代解析。
  • BUG-07:decode/int 转换包裹异常并回协议错误码,禁止异常冒泡。
7884 结构归纳推理引擎 V17 · www.asm64.com  |  VibeFuzzing Session by DeepSeek  |  本报告及全部产物归档于 out/ 目录(靶子 / XML / 日志 / 崩溃样本 / 归纳结果)