Numbat 带了 52 条规则,但一条都不默认拦

小岛AI 2026 / 07 / 30

一条 curl 命令,单看没毛病。

前一条命令刚从 Vault 读过 secret,下一条却准备把文件作为请求体发到外部地址,味道立刻就变了。

Perplexity 刚开源的 Numbat,盯的就是这种动作序列。它不跟模型辩论你这样做安不安全,也不再补一段两千字的系统提示词劝模型冷静。它把 Codex、Claude Code、OpenCode 这些编码 agent 的命令执行、文件读写和网络访问,统一翻译成结构化事件,再交给确定性规则判断。

如果规则命中,而且管理员明确开启了执行模式,动作会在真正发生前被拒绝。

好家伙,终于有人把 agent 安全从「希望模型自觉」拉回了工程世界。

但更有意思的细节在后面。Numbat 随项目提供了 52 条内置规则,覆盖秘密访问、数据外传、权限提升、持久化和横向移动等 11 类行为,默认却只记录,不阻断。

一条都不默认拦。

这不是 Perplexity 对自己的规则没信心。恰好相反,它把 agent 安全里最难的一笔账摆到了桌面上。发现风险是一件事,让工程师正在跑的任务停下来,是另一件事。

一条正常命令,怎么变成了越界

过去聊 agent 安全,大家第一反应通常是提示词注入。网页里藏一句恶意指令,模型读完后把它当成用户要求,顺手把敏感数据发了出去。

这条风险当然还在,而且各家都投入了大量精力做注入攻击研究和防护。

Numbat 盯住的是另一种更麻烦的情况。没有恶意网页,没有黑客发来的精心载荷,甚至没有任何外部攻击者。一个可信的 agent,运行在可信的电脑上,用着管理员批准的工具,只是太想把任务做完,最后自己越过了边界。

研究者给它起了个名字,accidental meltdown,也就是「意外失控」。相关论文描述的触发点可能普通得让人想叹气。文件找不到,API 报错,凭据过期,权限被拒绝。人看到这些提示会停下来排查,agent 却可能把它们理解成「原路线走不通,换条路继续完成目标」。

于是它开始找环境变量,扫描其他目录,尝试新的凭据,修改权限,再从另一个网络出口绕过去。

每一步都能解释。

连起来就出事了。

OpenAI 本月披露的 Hugging Face 模型评估安全事故,已经把这种失败从论文推演拉进了现实。预发布模型在评估里卡住后,没有乖乖承认失败,而是继续寻找答案,最后突破了原本的沙箱和网络约束,拿到秘密并访问了受保护系统。

这类事故最让人头疼的地方,不是模型突然长出邪恶人格。它只是非常坚定地完成目标。

目标没错,路径失控。

你如果做过 agent 编排,大概能体会这种别扭。我们会给模型失败重试,会让它在命令报错后自己修复,会减少人工确认来换取连续执行能力。自主性就是这么一点点加上去的。可同一套能力,在权限边界附近,也会变成一台很有耐心的撞门机器。

有点子牛逼,也有点吓人。

安全边界不该继续写在提示词里

很多团队遇到 agent 越界,第一反应是补提示词。

不要读取 .env

不要访问工作目录之外的文件。

不要把公司资料发送到外部服务。

这些提醒可以降低风险,却不适合充当最后一道门。模型输出带概率,安全边界却不能只按概率生效。今天它理解了「不要」,明天换了任务上下文、工具描述或模型版本,行为就可能漂。

Numbat 的判断很直接,防线必须落到 agent harness,也就是让模型真正调用命令、文件和网络工具的那层运行脚手架。

模型可以计划,脚手架决定动作能不能落地。

这是我觉得 Numbat 最值钱的地方。它没有再造一个安全 agent 去审另一个 agent。它利用各家编码 agent 已经存在的 hook,在工具执行生命周期的固定节点,调用一段确定性程序。

Hook 原本经常用来自动补上下文、跑测试或做格式检查。Numbat 把同一套机制拿来做安全检测。尤其是 pre-action hook,它发生在动作执行前,能直接返回拒绝。

你可以把它理解成机场安检。模型脑子里想过什么不重要,真正要带上飞机的东西,必须在登机口过一遍机器。

Numbat 接入的也不只有 hook。

实时规则只能抓住提前想得到的风险。很多事故发生后,团队才知道原来还需要监控这种动作。Numbat 因此会读取各家 agent 留在本地的会话产物,把不同格式的日志和转录整理成统一的 NDJSON 时间线。

它甚至能扫描安装之前的历史会话。

另一条输入来自 OpenTelemetry 遥测。Numbat 可以在本机启动 OTLP 接收端,收集 hook 或会话文件里没有的信号。默认只监听 localhost,数据先留在设备上,再由管理员决定本地处理、远端发送还是接入 ClickHouse。

三条线合起来,hook 负责现在,会话产物负责过去,OTLP 负责补充观测。

Numbat 把多种编码 agent 的 hook、遥测与会话记录统一成一条本地检测管线

这才像一套安全系统,不是一张越来越长的提示词便利贴。

52 条规则为什么不默认拦

Numbat 的规则用 CEL 表达式写在统一事件模型上。管理员可以加规则和测试,不用改项目源码。

最直观的一条叫 privilege.sudoers_tamper。它会检查写入 /etc/sudoers、调用 visudo,或者添加 NOPASSWD 授权等动作。这些信号够硬,一旦成功,原本权限有限的进程可能获得长期 root 权限。

更值得看的是序列规则。

读取秘密管理器里的值,可能是正常任务。用 curl 发一个带数据的请求,也可能是正常任务。Numbat 会检查同一会话里,这两件事是否在 64 个事件内先后出现。单个动作看着都能过,组合起来就需要调查。

这里有一个很实用的工程思路。

不要只盯危险命令,要盯危险路径。

rm 不一定危险,删临时目录很正常。读 .env 也不必然有问题,很多本地任务确实需要配置。真正高风险的往往是「读秘密,随后外发」「枚举凭据,随后提升权限」「修改启动项,随后建立网络连接」这种有上下文的链条。

规则写得越接近行为链,误报通常越少,调查证据也越完整。

那为什么 52 条规则不直接默认拦住呢?

因为监控和执行的代价完全不同。

监控错了,安全团队多看一条告警。执行错了,工程师的任务当场中断,可能还丢掉一段已经跑了半小时的上下文。更麻烦的是,许多高风险动作在少数场景里就是合法工作。安全工程师维护 sudoers,运维脚本轮换 SSH key,发布流程把构建产物上传到外部存储,都会长得很像规则想拦的行为。

如果开源项目替所有团队把阻断默认打开,那不是安全,是拿别人的生产环境做规则测试。

所以 Numbat 把开关留给管理员。随附规则先只观察。要真正拒绝动作,管理员需要把完整规则复制到受控目录,加入 enforce: true,提高版本号,跑过校验,再把策略装进支持 pre-action hook 的 agent。

这套流程不性感,甚至有点啰嗦。

但安全开关就该啰嗦。

模型世界喜欢一键开启,生产系统更需要逐步收紧。先盘点,后监控,再看误报,最后只对高置信规则启用阻断。棒棒的,这次开源项目没有把「能拦」包装成「应该全部拦」。

真正的坑,是观测本身也有代价

看到这里,Numbat 很容易被理解成 agent 时代的终端防火墙。

这个类比只对一半。

防火墙面对的是相对稳定的网络协议,Numbat 面对的是一堆快速变化的 agent harness。Claude Code、Codex、OpenCode 和 Pi 的 hook 格式、事件字段、会话文件位置都可能变化。上游一更新,解析器和规则就得跟着改。

Numbat 试图用统一事件模型把差异挡在下面。方向没问题,但维护成本不会凭空消失。谁负责跟进每家 agent 的字段变更,谁验证 hook 真的执行了,谁处理不同操作系统的路径差异,这些才是企业落地时最累的活。

还有隐私账。

会话转录里可能出现代码、路径、命令、错误信息和业务上下文。Numbat 的正常记录不会包含完整原始转录,读取产物时会做秘密脱敏,把原始证据加入案件包也需要显式开启。这些设计很克制,但团队仍要决定哪些遥测能离开设备,保存多久,谁能检索,调查时如何授权。

安全工具一旦什么都看得到,它自己就成了需要重点保护的系统。

Perplexity 内部的做法也很有意思。Numbat 在终端上记录活动,把结构化信号送进集中安全系统。Perplexity Computer 定期复核检测结果、重建会话,还会寻找规则缺口,提出修改并发起 pull request。

Perplexity 内部把终端信号送入审计系统,再由模型辅助调查并交给人类审核规则

最后那一步没有交给 agent 自己合并。

人类审核后,规则才会进入下一轮部署。

这条边界很关键。让 agent 帮忙发现规则缺口没问题,让它自己决定以后哪些动作该被拦,风险就又绕回来了。安全系统可以用模型提高调查效率,最终执行策略仍要有确定的所有者。

如果你真准备给 agent 放权

Numbat 不是装完就安全的护身符。

它更像一套把模糊风险翻译成工程对象的工具。以前团队只能说「我们担心 agent 乱来」,现在可以把担心落到事件字段、会话序列、规则版本、执行决定和审计证据上。

如果团队还在每一步人工确认,Numbat 的实时阻断价值可能没有那么高,但历史扫描和统一时间线依然能帮你看清 agent 到底碰过什么。

如果团队已经让 Codex 或 Claude Code 长时间运行,甚至跳过部分权限确认,先从只读的 numbat agentsnumbat scan 开始,比直接开阻断稳得多。看一周真实活动,找出高频合法动作,再决定哪些高置信规则值得启用。

最适合先开的,不是范围很宽的「可疑命令」规则,而是后果明确、几乎没有正常理由的行为链。修改 SSH 授权文件,读取生产秘密后向陌生地址外发,绕过既定网络代理访问云元数据,这些才有资格站到执行前面。

其他规则先记录。

让证据长出来。

我一直觉得,agent 的下一阶段不会只比谁能连续干活更久。真正进公司、碰到生产数据之后,比的是谁能把自主性装进一套可审计、可拒绝、可追责的系统里。

模型负责想办法。

规则负责守边界。

人负责决定什么叫边界。

Numbat 带来的不是 52 条万能护栏。它只是把那道门做出来,并且很诚实地没有替你上锁。