上周我花了一整天,试图打败自己写的软件。不是那种为了对外展示而安排的演练,是四个我专门造出来、想混过自家准入门的Agent,每一个都对应生产环境里一种真实的翻车方式。

我造HivePlane,只想证明一件事:一个还没证明过自己的Agent,不该碰生产环境。谁都能搭一个能跑起来的平台,我想知道的是,我的平台能不能说“不”。

打开网易新闻 查看精彩图片

四个全被拦下了。下面是每一次拒绝的原文,以及拦下它的那道门。如果你的安全测试里只有顺利路径,这篇文章就是给你的提醒。

攻击一:没认证的Agent

最简单的打法:注册一个Agent,跳过认证,直接提交到生产。

返回的是403,拒绝信息里点名了工作负载、试图进入的环境、当前状态和所需状态。运维人员不用翻源码就能照着处理。更关键的是,这道门在运行记录落库之前就触发了——没有运行记录,没有副作用,没有东西需要清理。在准入环节拒绝,是你上线过的最便宜的一道控制。

拒绝文案本身就是产品界面。“禁止访问”是死路一条,“你需要certified,你现在是uncertified”才是一条工作流。这一点我是吃了亏才学会的,第一版返回的就是前者。

攻击二:换模型

更隐蔽的一种:Agent在测试用的那个模型上完成了认证,然后换一个模型去跑。

结果还是403。系统比对的是这次运行的身份和认证凭证里绑定的模型,而不是清单里声明的那个。只有偏离实际认证时所用模型的行为,才算换模型。

这个场景本身还有一段故事——这个攻击的第一版是被放行的,返回了201,而且那道门放行得没错。那份复盘是系列第四篇,也是整个系列里最让人不舒服的一篇。

攻击三:悄悄退化

这是最重要的一个攻击,因为它是会意外发生的那种:一个看起来没问题、实际有问题的Agent。

这个Agent是故意做傻的——不读issue就作答,从不升级处理,靠猜判断账户等级。认证流程拿生产阈值去跑它,返回了201,状态是uncertified,也就是正确地拒绝给它认证。

这就是核心场景。这个Agent返回的JSON格式完全正确。演示能过,人眼扫一遍输出也能过。但基准测试还是把它拦下了,因为“先读再写、拿不准就升级而不是猜”这类行为,过不了一道确定性的动作审计检查。

一个看起来合理的Agent,不等于一个通过认证的Agent。这句话就是语料库里为什么会有负样本任务的原因。

攻击四:一次跑太贵的运行

最后一个攻击是花钱。这个探针设了每次运行0.000001美元的上限,并且只发起一次受管控的模型调用——所以任何有定价的用量都会超限。

用量报告一越线,运行就以“超出运行预算”失败。记录下来的成本是2.85美元。

两个细节值得抄走:

  • 拦截发生在用量报告环节,不是准入环节。准入只能判断当天、当团队的总余量;单次运行的上限,只有在成本产生之后才能判断。拦错接缝,要么什么都拦,要么什么都拦不住——这个接缝能在运行超支的瞬间把它停掉。
  • 一个本地零成本模型演示不了预算管控。内置成本表把本地模型定价为零,任何运行都不可能超限。实测配置用一个设置项给身份定价,并去掉了零成本豁免,不用改代码。

门后面的门

这四个攻击还撞上了同一轮实测中触发的几道边界控制:

  • 一次破坏性的告警确认调用被升级处理,运行暂停,直到运维人员通过界面批准,然后恢复并跑完。
  • 一个40KB的工具载荷在Agent看到之前被截断到16384字节——不管工具返回什么,Agent的上下文都受保护。
  • 每一次拒绝、每一次干预,都落进了防篡改的审计链。

我学到了什么

负样本值得被当成一等公民来设计。这四个坏Agent花掉的场景构思,和那两个好Agent一样多。如果你的测试计划里只有顺利路径,你的安全故事就只是一场演示。

在危害变得可测量的那道接缝上拦截。预算拦在用量报告,准入拦在落库之前,塑形拦在Agent的上下文之前。每道门都该设在决策还便宜的那个最后节点上。

看起来合理的Agent才是危险的那个。退化样本失败在行为上,不是输出质量上——JSON是完美的。如果你的基准测试只检查Agent说了什么,那它认证的只是表演艺术。

认证是一道安全控制。一旦生产准入依赖一份签过名的认证凭证,换模型、改清单、或者让Agent悄悄退化,就不再是“运维问题”,而是被拦截、可审计的事件。

它没能证明什么

  • 那次破坏性工具的批准,是我通过运维界面批准的,由我本人代替真人——暂停、批准、恢复这条路径是真的,但判断是模拟的。
  • 这一轮只测了一个有定价的模型身份;端到端的真实云价格是下一个配置。
  • 漂移检测器(捕捉两次认证之间的缓慢衰减)下个版本才上线——这些门拦的是变化,不是褪色。

参考

  • 实测报告(v0.1.0)——上面引用的每一次拒绝,都带每个场景的原始证据
  • 安全审计——发布前的那次扫描
  • Docker测试报告——25/25的容器层

系列下一篇:那个因为错误原因而变绿的换模型测试。

哪种失败模式最让你害怕?