Numbat 带了 52 条规则,但一条都不默认拦
一条 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 负责补充观测。

这才像一套安全系统,不是一张越来越长的提示词便利贴。
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。

最后那一步没有交给 agent 自己合并。
人类审核后,规则才会进入下一轮部署。
这条边界很关键。让 agent 帮忙发现规则缺口没问题,让它自己决定以后哪些动作该被拦,风险就又绕回来了。安全系统可以用模型提高调查效率,最终执行策略仍要有确定的所有者。
如果你真准备给 agent 放权
Numbat 不是装完就安全的护身符。
它更像一套把模糊风险翻译成工程对象的工具。以前团队只能说「我们担心 agent 乱来」,现在可以把担心落到事件字段、会话序列、规则版本、执行决定和审计证据上。
如果团队还在每一步人工确认,Numbat 的实时阻断价值可能没有那么高,但历史扫描和统一时间线依然能帮你看清 agent 到底碰过什么。
如果团队已经让 Codex 或 Claude Code 长时间运行,甚至跳过部分权限确认,先从只读的 numbat agents 和 numbat scan 开始,比直接开阻断稳得多。看一周真实活动,找出高频合法动作,再决定哪些高置信规则值得启用。
最适合先开的,不是范围很宽的「可疑命令」规则,而是后果明确、几乎没有正常理由的行为链。修改 SSH 授权文件,读取生产秘密后向陌生地址外发,绕过既定网络代理访问云元数据,这些才有资格站到执行前面。
其他规则先记录。
让证据长出来。
我一直觉得,agent 的下一阶段不会只比谁能连续干活更久。真正进公司、碰到生产数据之后,比的是谁能把自主性装进一套可审计、可拒绝、可追责的系统里。
模型负责想办法。
规则负责守边界。
人负责决定什么叫边界。
Numbat 带来的不是 52 条万能护栏。它只是把那道门做出来,并且很诚实地没有替你上锁。