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。

目标状态

我希望研究结束时,至少能指着磁盘说:

  1. 范围是怎么收的(Campaign / 攻击面)
  2. 每条 finding 的证据字段在哪
  3. 哪些结论被程序门禁拦住了
  4. 报告草稿绑定的是哪一版证据(而不是某一晚的聊天)

下一页 Approach 写我怎么拆这些问题。