协会地址:上海市长宁区古北路620号图书馆楼309-313室
推出 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_hosts 或 write a file to ~/.aws/。它应该被允许这么做吗?如果它尝试了,你甚至能知道吗?
Falco 博客上的演示捕捉到了这种情况。代理试图读取和写入它不被允许的部分,两次尝试均被阻止。代理本身收到了一条结构化消息,解释了原因。这就是在工具调用层面同时工作的检测和护栏机制。
Prempti 的工作原理
Prempti 以轻量级用户空间服务的形式与你的编码代理并行运行。它不需要 root 权限、内核模块或容器。当你的代理发起一个工具调用——文件写入、shell 命令、文件读取——Prempti 会在它执行之前拦截该调用,根据 Falco 规则进行评估,并给出裁决结果:
裁决结果
发生的情况
Allow(允许)
工具调用正常进行
Deny(拒绝)
工具调用被阻止,并告知代理原因
Ask(询问)
提示你以交互方式批准或拒绝
架构如下:
- Prempti 的钩子(hook)在每个工具调用之前触发
- 拦截器通过 Unix socket 将事件发送给 Falco
- Falco 的规则引擎根据你的策略评估事件
- 匹配的规则产生裁决结果(deny / ask / allow)
- 拦截器将裁决结果返回给代理
Prempti 使用 Falco 的插件系统定义一个全新的事件源(coding_agent),并为这个场景定制了字段:tool.name、tool.input_command、tool.file_path、agent.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]`
- rule: Deny pipe to shell interpreter
输出字段对 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 集成正在规划中。







