WRK_001 · OH-MY-VUL
Problem
漏洞研究在 Agent 时代的真实断裂点:自然语言交接、硬字段丢失、幻觉报告与不可回放的记忆。
核心矛盾
Coding Agent 找危险函数、读调用链、起草 PoC 已经很强。
真正麻烦的是:
研究状态散落在对话、终端和半成品报告里,无法可靠交接,也无法诚实地说「我还不知道」。
模型越能把话说圆,这个问题越危险——因为读报告的人分不清哪一句来自 file:line,哪一句来自补全。
典型痛点
1. 发现与报告之间只有自然语言
早期我自己也走过类似路径:
vuln-finder →(一段很完整的分析)→ vuldb-report
Finder 写得很像正式结论。Reporter(人或下一个 Agent)却分不清:
- 哪些字段来自源码
- 哪些只是推测
- 复现到底有没有跑过
unknown是被诚实留下,还是被润色掉了
交接物如果只是散文,下一棒只能选择相信或重做。
2. 一条 finding 有很多硬字段
聊天最容易丢的,往往是后面写 advisory 时绕不过去的东西:
| 字段 | 要回答的问题 |
|---|---|
versions.tested | 实际看的是哪个版本? |
evidence.source | 攻击者控制的输入从哪进? |
evidence.sink | 数据最后碰到什么危险操作? |
evidence.guard | 校验 / 编码 / 鉴权是否存在、能否绕过? |
evidence.reproducer | 本地怎么重新触发? |
evidence.observed_result | 真实运行后看到了什么? |
| dedup / CVSS / blockers | 是否已有编号?向量?卡在哪? |
sink 长得危险,只说明值得继续查。
没有 source→sink→guard 与本地观察,它还不是你能负责的漏洞结论。
3. 模型会把 unknown 升级成自信句
默认生成习惯是「补全」。
在漏洞研究里,这等于静默造假:
- 没跑 PoC → 写成「成功 RCE」
- 没查 NVD → 写成「暂无公开 CVE」
- 没看 guard → 写成「完全没有校验」
人读着顺,审查时翻车。
需要一种结构,让 unknown 合法存在,并阻止它未经验证就晋级。
4. 上下文窗口不是研究记忆
换会话、换模型、隔两天回来——
版本约束、已否定的路径、半截 repro 命令,常常只活在旧 transcript 里。
没有落盘的研究记忆,就没有「可回放」。
可回放不是为了好看,是为了你能回答:当时到底验证了什么。
5. 假设变便宜,证明仍很贵
Agent 可以在一小时内提出大量 candidate。
每一条要变成可披露结论,仍要付:读版本、追数据流、本地复现、查重、写清楚影响面。
缺少漏斗时,工作区会被「看起来很真」的假说灌满。
流程必须允许 block / archive / stop,而不只是 promote。
目标状态
我希望研究结束时,至少能指着磁盘说:
- 范围是怎么收的(Campaign / 攻击面)
- 每条 finding 的证据字段在哪
- 哪些结论被程序门禁拦住了
- 报告草稿绑定的是哪一版证据(而不是某一晚的聊天)
下一页 Approach 写我怎么拆这些问题。