执行 Agent 需要对手,而不是观众
CyberStrikeAI Agent 审批能力设计札记
一、危险从不发生在聊天框里
大模型最擅长的是说服——用流畅的语言让你相信计划合理、范围可控、风险可接受。
但渗透测试真正出事的时刻,从来不是某段漂亮推理落地的那一刻,而是 exec 被调用、nmap 扫出去、c2_task 入队 的那一秒。语言可以撤回,命令不能。
CyberStrikeAI 的人机协同(HITL)早已在工具执行前设下一道闸。这次新增的 Agent 审批,动的是闸后面那个关键问题:
每一记即将落下的手,由谁做最后一瞥?
答案新增了一种:审计 Agent——与执行 Agent 异构、同权、专司质疑的第二个模型。侧栏里把审批方从「人工」切到「审计 Agent」,白名单和协同模式不变;变的是,裁决不再等人,而由一次独立的 LLM 调用当场完成。
这不是 HITL 换皮。这是在硅基劳动力内部,复刻了一种人类组织用了几百年的结构:做的人,和审的人,不能是同一个人。
二、吞吐与问责之间,有一条裂缝
人工审批的珍贵,在于问责。日志里写着谁点的通过,复盘时有名有姓,客户问起来站得住。
人工审批的困境,同样实在。一次深度测试,执行 Agent 可以在数小时内抛出上百次工具调用。若每一次非白名单操作都等人,只有两种稳态:
人变成瓶颈,自主性名存实亡; 人变成橡皮图章,治理名存实亡。
第二种更隐蔽,也更致命——审批栏还在,信任已经死了。 形式上有人把关,实质上关口已空。这比没有审批更糟:它制造了一种虚假的安全感。
所以问题从来不是「要不要审批」,而是:
审批所需的注意力,能否从人身上剥离,同时又不回流到同一个执行模型?
Agent 审批挤进的,正是这条裂缝。
三、自我声明不是审计
行业里常见的「安全增强」,是让模型在工具调用前多输出一句:「我认为此操作安全。」
那是自我声明。执行模型同一套权重、同一个目标函数、同一段上下文,让自己相信自己——冲突被内化进网络,外面看不见,改不了,查不到。
CyberStrikeAI 的做法粗暴而有效:两次请求,两个人格。
approve / reject | ||
执行侧可以写「切勿等待批准」——那是战略层的进取。审计侧写「越权、破坏性、与任务无关 → reject」——那是战术层的克制。两种立场刻意不调和。
制衡从 prompt 里的自我说服,迁移为运行时的异构对手。这才是 Agent 审批的核心:不是多一次模型调用,而是多一个被规定成专门找茬的角色。
四、审参数不够,要审意图是否还在
若审计 Agent 只看到 nmap -sS 10.0.0.0/8,它和关键词过滤器没本质区别。
难判的越权从来不是语法层面的「危险」,而是意图漂移——工单授权 app.example.com,参数形式合法,但执行 Agent 的推理链早已滑向内网;用户说的是「验证 SQL 注入」,模型却准备对生产库做破坏性写入。
CyberStrikeAI 在审计前对审批包做认知增强。审计 Agent 读到的 JSON 里,不只有 argumentsObj,还有:
userMessage—— 用户本轮到底要什么thinking/reasoningChain/planning—— 执行侧为何走到这一步
审的是动机与行动的一致性,而不只是行动的表层。
这背后有一个对长程 Agent 的冷判断:上下文压缩之后,目标会变形;变形发生在执行之前,最先体现在推理里。 把 cognition 喂给审计方,等于在后果落地前,给意图漂移一次被拦截的机会。
人读这些材料,认知负荷极高;机器读机器的长推理,反而可持续。Agent 审批在这里不是偷懒,而是把人类从逐行 JSON 的疲劳里解放出来,让人去做策略和例外。
五、拒绝不是断头台,是修正案
很多人把「审批拒绝」理解成流程终止。CyberStrikeAI 不是这么设计的。
审计 Agent 拒绝一次调用,裁决意见会以结构化错误回灌执行侧——会话不断,任务不废,模型换参数、换路径、换策略,或者向用户澄清。拒绝是一次可恢复的否决,不是惩罚。
这在制度上很重要。若拒绝等于任务死亡,执行 Agent 会学会讨好审批方——包括审计 Agent——形式上过关,实质空转。可恢复的拒绝,才让双方保持诚实:执行侧可以大胆提案,审计侧可以严格否决,循环继续,直到行动落在可接受的空间里。
审查编辑模式(review_edit)则更进一步:审计 Agent 不只说「不行」,还可以说「行,但参数要这样」——完整替换工具参数,且被提示词约束为最小必要收窄:限 path、去危险 flag、禁止扩大攻击面;改不干净就 reject,不勉强放行。
这是红队老师傅带徒弟的数字化:方向认可,手法收一收。 治理的最高境界往往不是禁止行动,而是压缩行动的流形(manifold)——让探索仍在,伤害空间变小。
六、保守拒绝:把怀疑写成默认配置
审计 Agent 的实现里,几处「失败即 reject」值得当作宣言来读:
LLM 未配置 → reject 调用失败或 90 秒超时 → reject 响应无法解析为 JSON → reject 审批模式下若偷偷返回改参 → 忽略,严守模式边界
这不是工程偷懒。是明确站队:在授权渗透里,漏放一次的代价,通常远大于多拦一次。
执行 Agent 被鼓励多疑(找洞);审计 Agent 被规定多疑(找茬)。两个多疑方向相反——一个向外扩,一个向内收。矛盾被保留,而非调和。
顺便说一句边界:审计 Agent 也是 LLM,会犯错,会被奇怪参数误导,会对提示词过度敏感或过度麻木。它不能替代签字式的授权书,也不能替代人的最终问责。 它的价值,是把「每一票都要人点」变成「每一票都有人定的规则在把关」,让人从重复劳动里退到规则设计者和异常处理者——侧栏随时可以切回人工,就是这个意思。
七、白名单:信任是一种预算
无论审批方是人还是 Agent,白名单内工具不触发裁决。会话配置与 config.yaml 全局列表取并集。
白名单不是「放松警惕」,而是把信任当预算来花:read_file、grep 等低危侦察,不值得每次都烧一轮审计算力;真正危险的动作,才把关口收紧。
空白名单 = 全部要审。这是默认严苛——适合还不了解自己的 Agent 会干什么的阶段。团队越成熟,越能精确描述「哪些动作可以默许」,Agent 审批就越接近精准的第二道门,而不是普遍意义上的税。
八、日志里的 decided_by:硅基治理也要留痕
每一次 Agent 裁决写入 hitl_interrupts,decided_by 标为 audit_agent,与人工记录并列。
这很无聊,但极其重要。未来某天客户问:「这条命令谁批准的?」——你能回答「审计 Agent,依据当时策略 X,附裁决理由 Y」,而不是「模型自己觉得没问题」。
可审计性和可问责性不必永远指向自然人,但必须指向可追溯的决策节点。Agent 审批若做不到留痕,就只是把橡皮图章从人换成了机器。
九、产能时代,真正缺的是异质
业界谈 Agent,几乎只谈产能:更多工具、更长上下文、更深的多 Agent 编排。仿佛把马力堆上去,安全问题会自然消失。
历史不这么运作。任何高后果行业——航空、核电、手术、证券交易——产能提升之后,增加的不是「更信任单一个体」,而是更密的制衡结构:飞行员与副驾驶、交易员与风控、手术主刀与核对护士。
自主渗透正在进入高后果区间。一个人带一队硅基队员,吞吐已超人类操作员几个数量级。此时若仍幻想单体模型既探索又自律,不是乐观,是裸奔。
Agent 审批,是把「执行 / 质控」这组古老分工,写进 Agent 运行时。它承认一件事:
自主性不该来自「我发誓我很小心」,而该来自「总有一个角色,被规定成与执行者利益不一致」。
利益不一致——执行 Agent 的 KPI 是找到问题;审计 Agent 的 KPI 是别闯祸。同一个模型里这两种 KPI 会打架;拆成两个角色,打架变成制度。
十、怎么用,以及什么才值得投入
已在用人机协同:侧栏「审批方」→ 审计 Agent → 应用。一行切换。
尚未开启 HITL:Agent 审批不会凭空生效。先有「执行前可拦截」,才有「拦截后谁裁决」。
真正值得花时间写的,是 config.yaml 里两套审计提示词,或 Web「人机协同」页的在线编辑——你的授权边界怎么表述、什么情况必须 reject、审查编辑时收窄的尺度在哪。 默认提示词是宪法草案,不是成文法。团队自己的靶场规则、客户合同里的测试范围,才该成为审计 Agent 真正服从的上位法。
结语
我们正把渗透测试的手交给机器。手比嘴危险得多。
Agent 审批回答的不是「要不要人」,而是更尖锐的一层:
当执行者已经是硅基、且永远不会累的时候,谁有资格、以何种方式、对每一个即将发生的物理后果说「慢着」?
CyberStrikeAI 的答案是:再养一个 Agent,专门说这句话。让人来写它信什么、何时必须拒绝、何时可以收窄——让人在关键处接管;让机器在重复处互相牵制。
执行 Agent 负责把测试推到极致。
审计 Agent 负责在每一次出手前问:以你刚才那套推理,这一下——还是你该做的吗?
两个问题,两种角色,一次都不能少。
CyberStrikeAI — AI 驱动的自动化安全测试平台。Agent 审批位于人机协同流程内;审计策略见 config.yaml → hitl.audit_agent_prompt / audit_agent_prompt_review_edit。
仅限授权测试环境使用。