推出 Prempti:AI 编码代理的策略与可见性

来源: Cloud Native Computing Foundation
作者: Leonardo Grasso, Falco Maintainer
发布时间: 2026/5/20 19:00:00
原文链接: https://www.cncf.io/blog/2026/05/20/introducing-prempti-policy-and-visibility-for-ai-coding-agents/


发布于 2026年5月20日,作者:Leonardo Grasso,Falco 维护者

本篇文章重点介绍的 CNCF 项目

AI 编码代理(coding agent)已经成为开发者工作流程中真实存在的组成部分。像 Claude Code 这样的工具会驻扎在你的终端里,代表你读取文件、运行 shell 命令、发出网络请求并编写代码。它们快速、能干,并且在真实机器上的真实任务中越来越被信任。

但伴随着这份信任,一个值得认真对待的问题随之而来:你的编码代理到底在你的机器上做什么?

5 月 12 日,Falco 团队在 Falco 生态系统中引入了一个新的实验性项目 —— Prempti。Falco 是 CNCF 毕业项目,也是云原生运行时安全的事实标准,长期以来为容器、Kubernetes 和主机提供基于策略的检测。Prempti 将同样的模式扩展到了一个新的领域:AI 代理的工具调用生命周期。

代理在运行时是一个黑盒

当编码代理运行 bash 命令、写入文件或读取配置时,这些操作都在你的用户会话中发生,使用你的权限,在你的文件系统内,针对你的凭证执行。大多数使用这些工具的开发者对此类活动没有任何结构化的可见性。你看到的是代理的聊天输出,但看不到引擎盖下发生了什么。

一个简单的场景:你要求编码代理重构一个模块。它读取你的源文件,进行编辑。然后,也许是因为一个恶意依赖项或它刚刚解析的文件中的意外指令,它试图执行 read ~/.ssh/known_hostswrite a file to ~/.aws/。它应该被允许这么做吗?如果它尝试了,你甚至能知道吗?

Falco 博客上的演示捕捉到了这种情况。代理试图读取和写入它不被允许的部分,两次尝试均被阻止。代理本身收到了一条结构化消息,解释了原因。这就是在工具调用层面同时工作的检测和护栏机制。

Prempti 的工作原理

Prempti 以轻量级用户空间服务的形式与你的编码代理并行运行。它不需要 root 权限、内核模块或容器。当你的代理发起一个工具调用——文件写入、shell 命令、文件读取——Prempti 会在它执行之前拦截该调用,根据 Falco 规则进行评估,并给出裁决结果:

裁决结果

发生的情况

Allow(允许)

工具调用正常进行

Deny(拒绝)

工具调用被阻止,并告知代理原因

Ask(询问)

提示你以交互方式批准或拒绝

架构如下:

  1. Prempti 的钩子(hook)在每个工具调用之前触发
  2. 拦截器通过 Unix socket 将事件发送给 Falco
  3. Falco 的规则引擎根据你的策略评估事件
  4. 匹配的规则产生裁决结果(deny / ask / allow)
  5. 拦截器将裁决结果返回给代理

Prempti 使用 Falco 的插件系统定义一个全新的事件源(coding_agent),并为这个场景定制了字段:tool.nametool.input_commandtool.file_pathagent.cwd 等等。如果你之前编写过 Falco 规则,这些策略会让你感到非常熟悉。

两种模式:监控模式与护栏模式

监控模式(Monitor mode) 会针对每条规则评估每一次工具调用并记录结果,但不会强制执行任何操作。这是推荐的起点:运行几个会话,观察你的代理实际触及了什么,然后在启用阻止之前调整你的规则。

护栏模式(Guardrails mode)(默认)会完全执行裁决结果——拒绝则阻止,询问则提示你,允许则放行。

`
premptictl mode monitor # observe only
premptictl mode guardrails # enforce verdicts
premptictl logs -f # watch live events
`

规则:熟悉的 Falco YAML,新上下文

这里有一条规则,可以阻止将内容直接通过管道传输到 shell interpreter(shell 解释器)中,这是 prompt injection attacks(提示注入攻击)的经典攻击向量。

`
– macro: is_bash
condition: tool.name = “Bash”

  • macro: is_pipe_to_shell

    condition: >

    tool.input_command contains “| bash”

    or tool.input_command contains “|bash”

    or tool.input_command contains “| sh”

    or tool.input_command contains “|sh”

    or tool.input_command contains “| zsh”

    or tool.input_command contains “|zsh”

    or tool.input_command contains “bash <(”
    • rule: Deny pipe to shell interpreter

      desc: >

      阻止将网络获取或生成的内容通过管道直接输入到 shell 解释器的 Bash 命令。涵盖 curl|bash、wget|sh、bash <(…) 以及类似的用于远程代码执行和供应链攻击的模式。

      condition: is_bash and is_pipe_to_shell

      output: >

      Falco 已阻止将内容通过管道输入到 shell 解释器(%tool.input_command)

      priority: CRITICAL

      source: coding_agent

      tags: [coding_agent_deny]

      `

输出字段对 LLM 友好,因此 agent 会收到一条结构化消息,并可直接向用户展示。关联 ID 允许您在日志中追踪每个事件。

默认规则集涵盖六个方面:

  • 工作目录边界——监控并询问对会话项目目录之外的文件访问
  • 敏感路径——拒绝读取和写入 /etc/~/.ssh/~/.aws/、云凭据、.env 文件等类似内容
  • 沙箱禁用——检测禁用 agent 自身沙箱配置的尝试
  • 威胁——凭据访问、破坏性命令、管道到 shell、编码载荷、数据外泄、IMDS(实例元数据服务)访问、反向 shell 以及来自已知恶意主机的供应链安装
  • MCP 与技能内容——MCP 服务器配置中毒和斜杠命令文件注入
  • 持久化向量——钩子注入、Git 钩子、包注册表重定向、AI API 基础 URL 覆盖以及 API 密钥泄露到环境文件中

自定义规则放在 ~/.prempti/rules/user/ 目录下,并在升级过程中保持不变。

坦诚面对局限性

Prempti 拦截 agent 所声明的工具调用,而不是这些工具调用产生的系统调用。如果 agent 编写了一个恶意二进制文件并运行它,Falco 会看到 gcc main.c -o main./main,而不会看到 ./main 在操作系统层面的行为。要做到 Linux 上深层次的系统调用级可见性,Falco 的内核探针(eBPF/kmod)仍然是正确的工具。

Prempti 不是一个沙箱。将它视为 agent 级别的一个策略层——是对沙箱和系统加固的补充,而非替代。

快速开始

从 GitHub 下载最新版本:https://github.com/falcosecurity/prempti/releases

完整技术演练和架构细节:https://falco.org/blog/introducing-prempti

参与进来

AI 编码 agent 的运行时安全是一个全新领域。威胁模型仍在定义中,合适的默认策略也还在制定中。如果您试用 Prempti,我们非常希望了解您的发现:

  • 您编写了哪些规则?发现了什么?
  • 您需要支持哪些 agent 或平台?
  • 哪些功能没有按预期工作?

打开一个 issue,发起一个 discussion,或在 CNCF Slack 上的 Falco 频道 找到我们。每一条反馈都会影响这个项目的未来方向。

Prempti 根据 Apache License 2.0 发布。目前支持 Linux(x86_64, aarch64)、macOS(Apple Silicon, Intel)和 Windows(x86_64, ARM64)上的 Claude Code。Codex 集成正在规划中。