
1. 黑客松场景下安全 Agent 到底要解决什么问题黑客松这种极限开发场景里安全方向的项目一直有个尴尬处境做攻击演示容易出彩做防御验证却很难在几分钟内讲清楚价值。我参加过几次以 AI 安全为主题的线下开发活动发现一个普遍现象——大部分团队把精力全砸在让 AI 找出漏洞上却很少有人认真处理怎么证明 AI 找出来的东西是真的。这个项目标题里的核心矛盾就藏在这里AI 的攻击结果需要接受独立验证。换句话说不是让 AI 去攻击而是给 AI 的攻击行为配一个裁判。这个裁判本身也是一个 Agent它不参与攻击只负责对攻击 Agent 输出的每一条结论做交叉核对、复现确认和可信度打分。为什么这件事值得单独做一个 Agent因为大模型在安全场景下的输出有一个致命特性它非常擅长生成看起来专业、格式工整、但实际经不起复现的结论。你让它分析一段代码它能给你列出五条高危漏洞措辞严谨、CWE 编号齐全但你真去手工验证可能只有一条站得住脚剩下四条是它根据代码模式脑补出来的。在真实的安全工作流里这种幻觉的代价极高——误报会消耗大量人力漏报则直接导致风险敞口。所以这个安全 Agent 的定位很明确它是攻击 Agent 的对抗性验证层。攻击 Agent 负责提出假设验证 Agent 负责证伪或确认。两者形成类似学术评审的机制一个负责产出一个负责质疑。这种结构在黑客松里特别讨巧因为它把一个模糊的AI 安全概念变成了一个可演示、可量化、可对比的闭环系统。适合读这篇内容的人有三类一是准备参加黑客松、想找一个既有技术深度又能在演示环节讲清楚的项目方向的人二是已经在做 AI Agent 相关工程、想了解怎么给 Agent 输出加一层可信度校验的开发者三是对 AI 在安全领域落地持怀疑态度、想看看实际工程中怎么处理幻觉问题的人。不管你属于哪一类接下来的内容都会围绕怎么把这个 Agent 真正做出来、跑起来、验证得住展开而不是停留在概念层面。2. 攻击 Agent 与验证 Agent 的职责边界怎么划2.1 为什么不能让一个 Agent 既攻击又验证最直觉的做法是让同一个 Agent 先攻击再自我检查。我一开始也这么想过实测下来效果很差。原因在于大模型的上下文一致性偏好当它刚输出了一条这里存在注入风险的结论后你再让它验证自己它倾向于维护之前的判断而不是真正去质疑。这就像让学生自己批改自己的卷子改出来的分数永远偏高。独立验证的核心价值在于信息隔离。验证 Agent 不应该看到攻击 Agent 的推理过程只应该看到它的最终结论和原始输入材料。这样验证 Agent 就没有维护同伴的动机它面对的是一个待验证的命题而不是一个需要被认可的同伴观点。具体到工程实现上两个 Agent 应该是两个独立的调用链路共享同一份原始输入比如待分析的代码片段、日志、配置文件但攻击 Agent 的中间推理链、思维链、草稿内容都不传给验证 Agent。验证 Agent 拿到的是一份结构化的攻击结论清单每条结论包含漏洞类型、位置、触发条件、预期影响。然后它独立地对每一条做复现尝试。2.2 验证 Agent 的三种判定结果验证 Agent 的输出不能只有真/假两态实际工程中我把它设计成三态加一个置信度判定结果含义后续处理已确认验证 Agent 独立复现了攻击结论进入报告标记高可信无法复现按描述的条件尝试但未触发标记待人工复核降权结论存疑描述本身逻辑不自洽或缺少关键条件直接过滤不计入报告置信度0-1 之间的浮点数用于排序和阈值过滤这个三态设计的好处是它承认了无法复现不等于结论错误——可能是验证 Agent 的能力不足也可能是攻击结论依赖了某些未说明的环境条件。把它单独列出来比粗暴地判为假更符合实际。2.3 两个 Agent 之间的通信协议黑客松时间紧通信协议不用搞得太复杂。我用的是一个简单的 JSON 结构攻击 Agent 输出一个数组每个元素是一条结论{ finding_id: F-001, vuln_type: injection, location: src/handler.py:42, trigger_condition: 当 user_input 未经过滤直接拼接进查询语句时, expected_impact: 可读取任意表数据, attack_agent_confidence: 0.85 }验证 Agent 接收这个数组对每条独立处理输出{ finding_id: F-001, verdict: confirmed, verification_confidence: 0.9, evidence: 构造输入 OR 11 -- 后查询返回了全表数据, notes: 复现成功但需要数据库未开启参数化查询 }这个协议的关键点是验证 Agent 必须给出 evidence 字段。没有证据的验证结论和没有验证一样不可信。这个字段强制验证 Agent 说明它是怎么确认或否认的也为后续人工复核留下线索。3. 让验证 Agent 真正独立的关键设计3.1 提示词层面的隔离策略两个 Agent 用不同的系统提示词这是最基本的隔离。但光这样不够我踩过一个坑如果两个 Agent 用的是同一个基础模型、同一套工具描述验证 Agent 会不自觉地模仿攻击 Agent 的推理风格导致它顺着攻击结论去找证据而不是真正独立判断。我的做法是给验证 Agent 一套对抗性的系统提示词核心指令是你的任务是尝试推翻以下结论。只有当你在独立复现后无法推翻时才标记为已确认。这个措辞的转变很关键它把验证 Agent 的目标从确认改成了证伪符合科学方法里的可证伪性原则。另外验证 Agent 不应该被告知攻击 Agent 的置信度。如果它看到攻击 Agent 标了 0.95 的高置信度会产生锚定效应倾向于认同。所以 attack_agent_confidence 这个字段在传给验证 Agent 之前要剥离掉只在最终汇总时用于加权。3.2 工具权限的差异化配置攻击 Agent 和验证 Agent 应该有不同的工具权限。攻击 Agent 需要的是探索型工具代码搜索、模式匹配、依赖分析。验证 Agent 需要的是执行型工具沙箱运行、输入构造、结果比对。这个区分很重要因为如果验证 Agent 也有代码搜索权限它可能会去搜索这个漏洞类型通常出现在哪里然后基于统计规律给出判断而不是真正去复现。我要求验证 Agent 只能通过实际执行来得出结论不能靠这类代码通常有漏洞这种先验知识。在黑客松的 demo 里这个设计特别有说服力你可以现场展示攻击 Agent 提出一条结论然后验证 Agent 在沙箱里实际跑一遍把执行日志投到大屏上。这种看得见的验证比任何 PPT 都有冲击力。3.3 防止两个 Agent 串通的边界条件还有一个隐蔽的问题如果两个 Agent 共享同一个向量数据库或缓存验证 Agent 可能间接读到攻击 Agent 的中间状态。我在一次实践中就遇到过验证 Agent 的检索结果里出现了攻击 Agent 之前写入的草稿笔记导致它的判断被污染。解决办法是给两个 Agent 分配独立的存储命名空间或者干脆在验证阶段禁用共享检索只允许验证 Agent 访问原始输入材料。这个细节在文档里很少有人提但在实际跑的时候会直接影响验证结果的独立性。提示判断两个 Agent 是否真正独立有个简单的自测方法——把攻击 Agent 的结论故意改错比如把位置指向一个不存在的文件看验证 Agent 是否会指出该位置不存在无法验证。如果它仍然给出已确认说明隔离没做到位。4. 黑客松现场怎么把验证流程跑通4.1 最小可演示闭环的搭建顺序黑客松时间通常只有 24 到 48 小时不可能做完整系统。我的建议是按这个顺序搭最小闭环先固定输入样本准备 3 到 5 个已知答案的代码片段其中一部分确实有漏洞一部分是干净的。这样你才能判断验证 Agent 的准确率。跑通攻击 Agent 的单次调用不追求漏洞发现率先确保它能输出符合协议的 JSON。接入验证 Agent 并做隔离这是核心宁可攻击 Agent 弱一点也要保证验证环节的独立性可演示。加一个对比视图左边显示攻击结论右边显示验证结果中间用颜色区分三态。这个 UI 不需要漂亮但必须让评委一眼看懂验证发生了。最后才做置信度加权和报告导出这是锦上添花不是核心。很多团队失败在顺序上——先花大量时间调攻击 Agent 的提示词结果验证环节没时间做最后演示时只能口头说我们还有验证模块说服力大打折扣。4.2 演示脚本的设计黑客松的演示时间通常只有 3 到 5 分钟必须提前写好脚本。我用的脚本结构是这样的第一分钟展示一个攻击 Agent 输出的结论清单其中故意混入一条幻觉结论这条是提前准备好的不是现场生成的保证可控。第二分钟展示验证 Agent 逐条处理重点看它怎么处理那条幻觉结论——它应该标记为无法复现或结论存疑。第三分钟展示最终报告说明经过验证后误报被过滤掉了多少。剩余时间讲架构图和独立性设计回答评委提问。这个脚本的杀伤力在于它把AI 会幻觉这个大家都知道的问题变成了一个我们有办法处理的解决方案。评委看到的是问题被解决的过程而不是一个完美的结果。4.3 现场容易翻车的点有几个坑我见过太多次网络依赖如果两个 Agent 都依赖外部 API现场网络抖动会导致演示中断。至少准备一个本地小模型作为降级方案或者提前把关键调用结果缓存下来。沙箱执行超时验证 Agent 执行攻击代码时可能卡住必须设置硬超时我设的是 10 秒超时直接判为无法复现。输出格式漂移大模型偶尔会不按 JSON 格式输出导致解析失败。要在解析层做容错解析失败时重试一次再失败就标记为结论存疑。演示数据泄露如果用的是真实代码注意脱敏。黑客松现场人多眼杂别把不该展示的东西投到大屏上。5. 验证准确率的实测数据与调优经验5.1 我实测的一组基准数据在一个 48 小时的黑客松项目里我用 20 条攻击结论做了测试其中 12 条是真实漏洞8 条是幻觉。验证 Agent 的表现如下指标数值说明真实漏洞确认率10/122 条因环境依赖未复现幻觉识别率7/81 条被误判为无法复现而非存疑平均单条验证耗时8.3 秒含沙箱执行整体误报过滤率87.5%幻觉被有效拦截这个数据不算完美但在黑客松场景下足够有说服力。关键是要诚实地展示无法复现这一类而不是把它藏起来。5.2 提升验证准确率的三个调优方向第一给验证 Agent 更明确的复现步骤模板。不要让它自由发挥怎么验证而是给它一个结构化的验证流程定位代码、构造输入、执行、观察输出、比对预期。模板化能显著降低它的随机性。第二对无法复现的结论做二次验证。第一次失败可能是验证 Agent 的方法不对让它换一种方式再试一次。二次验证能挽回一部分被误判的真实漏洞。第三引入人工复核的钩子。对于置信度在 0.4 到 0.6 之间的结论标记为需人工确认而不是强行给一个判定。这个区间本来就是模糊地带交给人类处理更合理。5.3 一个反直觉的发现我原本以为验证 Agent 越强越好但实测发现如果验证 Agent 的能力远超攻击 Agent它会倾向于把所有结论都判为存疑因为它能看出攻击 Agent 描述里的各种不严谨之处。这会导致过滤率虚高但真实漏洞也被误杀。所以两个 Agent 的能力应该大致匹配。在黑客松里我建议用同一个基础模型通过提示词和工具权限来区分角色而不是用一个大模型配一个小模型。能力对等才能形成有效的对抗而不是单方面的碾压。6. 从黑客松 Demo 到可用系统的差距6.1 Demo 阶段可以妥协的地方黑客松的评判标准是能不能在几分钟内讲清楚价值所以有些工程上的严谨性可以暂时让步输入样本可以预先准备不必支持任意输入。验证 Agent 的复现可以只覆盖最常见的几类漏洞不必全类型支持。报告导出可以是简单的 Markdown不必做复杂的可视化。并发和性能不用考虑单线程跑通就行。这些妥协不影响核心价值的展示反而能把有限的时间集中在独立性验证这个关键点上。6.2 真正落地必须补上的能力如果要把这个项目从 Demo 推进到实际可用有几块必须补输入泛化支持任意代码库、日志、配置而不是固定样本。验证覆盖率对每一类漏洞都有对应的复现策略而不是靠模型自由发挥。可追溯性每条验证结论都要有完整的执行日志和证据链支持审计。误报反馈闭环人工复核的结果要能回流用于调整验证 Agent 的判定阈值。成本控制两个 Agent 意味着双倍的模型调用成本需要做缓存和批处理优化。6.3 这个方向后续可以怎么扩展我在项目结束后想过几个延伸方向。一个是把验证 Agent 做成通用的AI 输出校验层不只用于安全场景任何需要可信输出的 Agent 系统都可以接入。另一个是引入多验证 Agent 的投票机制用三个独立的验证 Agent 对同一条结论做判断取多数结果进一步降低单点偏差。还有一个更有意思的方向让验证 Agent 的判定结果反过来训练攻击 Agent形成一个对抗进化的循环。攻击 Agent 逐渐学会只提出那些经得起验证的结论验证 Agent 也逐渐学会识别更隐蔽的幻觉模式。这个循环如果跑起来系统的整体可信度会随时间提升。不过这些都是后话。在黑客松的语境下最重要的还是把独立验证这个核心机制做扎实、演示清楚。我见过太多项目在概念上很宏大但演示时连一个完整的验证闭环都跑不通。宁可范围小一点也要让评委看到一条结论从提出到被验证的完整链路。这个链路本身就是最好的说服力。