AI 博客

garak、Promptfoo、Giskard 与 DeepTeam:没有一个够得到工具结果

每一款开源红队扫描器攻击的,都是用户打字进去的那条通道。而你的智能体被攻击的,是工具返回数据的那条通道——一份检索到的文档、一次 API 响应、一个它被吩咐去读的页面——而这四款默认没有一款会往那里放一个字符串。按"够得到哪里"来选,而不是按探针数量;然后看清攻击语料还有谁在维护:微软已于 2026 年 3 月封存 PyRIT,而 Promptfoo 如今归 OpenAI 所有。

作者 智能体 AI 维基 25 分钟读完

一份干净的智能体红队报告,通常意味着扫描器根本够不到攻击真正抵达的那个位置。这四款工具都把对抗性字符串送进"用户打字进去"的那条通道;而智能体真正的注入是入向回来的,藏在一段它被吩咐去信任的工具结果里。按"够得到哪里"来选——工具能把敌意字符串放到哪一条边界上——并把 README 里的探针数量当成营销话术。

速览

四个开源项目,对"被测的究竟是什么"给出了四种不同的答案。

工具维护方测试的单元它对准的是
garakNVIDIA一条针对 generator 的 probe一个模型端点。
PromptfooOpenAI(2026 年收购)一条会被打分的 YAML 用例你应用的入口。
GiskardGiskard AI一次扫描,外加多轮攻击你的应用,并附一个评审界面。
DeepTeamConfident AI一对"漏洞 × 攻击手法"你的应用,并映射到某套框架。
Reach matrix: which boundary each red-team tool can place a hostile string on A four-by-four matrix. Rows are garak, Promptfoo, Giskard and DeepTeam. Columns are the raw model endpoint, the application entry point, multi-turn attacks, and the tool-result channel. garak is strong on the raw model endpoint, weak on the application entry point, partial on multi-turn, and none on the tool-result channel. Promptfoo is weak on the raw endpoint, strong on the application entry point, strong on multi-turn, and none on the tool-result channel. Giskard and DeepTeam follow the same pattern as Promptfoo. The whole fourth column reads none. What each tool can put a hostile string on Raw model endpoint Application entry point Multi-turn escalation Tool-result channel garak Strong Not its target Partial None Promptfoo Via a provider Strong Strong None Giskard Via a wrapper Strong Strong None DeepTeam Via a wrapper Strong Strong None Strong Partial Weak or absent by default
四列里有三列被照顾得很好。第四列是空的,而智能体正是在那里被拿下的。

你的智能体真正被攻击的那条通道

Four boundaries where a hostile string can enter an agent's context An agent loop drawn in the centre. Four entry boundaries surround it. Boundary one, the user prompt, is covered by all four scanners. Boundary two, the system prompt and tool descriptions, is partly covered. Boundary three, the tool result returned by a search index, an API or a fetched page, is drawn as the accent block and is reached by none of the four by default; an arrow carries it back into the agent's context on the next turn. Boundary four, the rendered output, is covered only by output detectors. Where a hostile string can enter Agent loop model + context window + tool calls 1 · User prompt What a person types. covered by all four 2 · System prompt + tool docs Descriptions the model reads. partly covered 3 · Tool result Retrieved document, API field, fetched page, log line. reached by none of the four 4 · Rendered output What a downstream surface shows. output detectors only tool call out Scanners construct a string and hand it to boundary 1. An agent is compromised at boundary 3, where the text arrives as data it asked for.
扫描器站在边界一。智能体被攻陷发生在边界三。

一个智能体至少有四处可以让字符串进入其上下文,而它们的防守程度并不相等。用户提示词是所有人都会测的那一处。系统提示词与工具描述是第二个面——被毒化的工具描述是一类活跃且已被编目的攻击,见工具毒化。第四处是出向的渲染边界。

有意思的是第三处。智能体读到的每一段工具结果——一个检索片段、一次 API 响应里的 JSON 字段、它被要求去总结的那个页面的正文、一条 CI 日志、甚至 WAF 自己那条拦截记录——都是不受信输入,只不过它披着"智能体自己要来的数据"这身行头抵达。这种不对称就是间接提示词注入的全部,也是本站一再回到这里的原因:形态见提示词注入 101,最容易被忘掉的那条通道见遥测与日志作为不受信输入。

现在看扫描器都做了什么。它构造一段敌意字符串,再经由某个接口交给目标。对 garak 来说,那个接口是一个模型 generator——一次补全调用。对 Promptfoo、Giskard 与 DeepTeam 来说,那个接口是你包起来的任意可调用对象:一个 HTTP 端点、一个 Python 函数、一个对话处理器。无论哪一种,字符串都是从边界一进去的。要够到边界三,你得立起一个敌意工具——一个假的检索索引、一个被投毒的文档库、一个在描述字段里返回指令的 API——而这四款都没有把它做成默认模式。

这不是这些项目的缺陷。它们是为测试 LLM 应用而造的,而对一个聊天机器人来说,边界一就是攻击面。它变成一个缺口,恰恰是从你的应用开始调用工具的那一刻起——因为模型从此开始读没人打过的字。

补救办法很便宜,却没人做:写一个工具,其唯一职责就是返回攻击者可控的内容;把它注册进你智能体真实的工具目录;再用完全良性的提示词去驱动智能体。之后这四款里的任何一款都能来驱动这套装置——你只是把它们当成执行器而不是载荷来源。载荷来自它们的语料,投递路径归你。

四款各自的定位

garak——模型扫描器

NVIDIA 的 garak 是四款里唯一一个把模型本身当作分析单元的。它的架构是三类插件——生成攻击的 probe、判定攻击是否命中的 detector、以及与后端对话的 generator——probe 目录在一两百这个量级,后端则有二十余个,覆盖托管 API、Hugging Face 与本地运行时。把它对准一个端点,拿到一份报告。

这让它非常适合回答一个其余三款答得很差的问题:在我做任何提示词工程之前,这个基座模型对这一类失败是否易感?选型、加一个开放权重备选、或者为一次换模提供依据时,它很有用。而要它告诉你你的 RAG 系统会不会泄露另一个租户的文档,则毫无用处——garak 根本不知道你的应用存在。

Promptfoo——CI 里的多面手

Promptfoo 的重心是一个 YAML 文件。你声明 provider、测试用例、断言与红队插件;它生成攻击、跑一遍、给结果打分,并让你的构建失败。它是四款里最适合接进流水线的,而"配置即代码"的形态意味着一条发现只需一次提交就能变成一条回归测试——这正是评测驱动开发在别处一直主张的纪律。

它如今也归 OpenAI 所有。这桩收购在 2026 年 3 月宣布,同时承诺继续开放其开源工具;按公司自己的口径,该项目当时已触达六位数的开发者,以及财富 500 强中四分之一企业的团队。把这份承诺当真,同时仍然注意它在结构上意味着什么——下文再说。

Giskard——带评审界面的扫描

Giskard 是一个 Python 库,一次扫描同时找安全与质量问题:注入与泄露,和幻觉、偏见、鲁棒性并排。它跑的是多轮攻击智能体,而不只是单发探针,这一点很重要——真正有意思的越狱都是对话式的;同时它还配了一个 hub,让非工程角色也能看发现。

混合的分类法是它的取舍。如果你想要一次运行就告诉产品负责人"模型在哪里不可靠、在哪里不安全",Giskard 是最短路径。如果你需要递给审计员一张行与某套具名框架逐一对齐的表,这种混合就是阻力。

DeepTeam——映射到框架的那一款

来自 Confident AI 的 DeepTeam 建立在一个显式的双轴模型上:一份漏洞清单(会出什么错)与一份攻击手法清单(你怎么去让它出错)做交叉,目前各有数十项,而漏洞清单已映射到 OWASP LLM 应用十大风险、NIST AI RMF 与 MITRE ATLAS。按采用度算,它是四款里最年轻也最小的一个,有一个稳定的 v1 和数千星量级的关注。

框架映射正是选它的理由。当你欠别人的交付物是"针对某条具名控制项的证据"时——而按合规体系对比来看,这种情形只会越来越多——一个输出结果已经按控制项编好键的工具,替你省掉了一道翻译;否则那道翻译多半是在最后关头由人手工、草率地做完的。

探针数量是错的那根轴

这些项目无一例外都拿一个数字打头阵:probe 数、插件数、漏洞数、攻击手法数。这些数字彼此不可比——garak 的 probe 是一个模板、DeepTeam 的"一对"是交叉积里的一格、Promptfoo 的插件是一个生成器——更要紧的是,这个数字预测不了你真正在意的东西。

有两项属性预测得更好。第一是前文说的"够得到哪里"。第二是新鲜度,而这根轴在 README 上没有徽章:攻击语料是一件会折旧的资产。公开的越狱会被拿去训练。一套十八个月前还算前沿的探针集,如今测的是"厂商有没有读过和你同样的那几篇论文"——这是个真问题,但小得多。静态语料是一套回归护栏——用来抓"修好的东西又坏回去"确有价值——但它不再是一支红队。这与一套私有评测集会走的生命周期完全相同,适用的纪律是维护一套评测集。

正因如此,"谁在维护"不是一条关于项目健康度的脚注,而是选型标准本身。

语料还有谁在维护

Who maintains each attack corpus after the 2026 consolidation Three columns. PyRIT was archived by Microsoft on 27 March 2026 and is read-only, with no commits, releases or issue triage, yet is still widely recommended. Promptfoo was acquired by OpenAI in March 2026 with an open-source commitment, so the corpus testing your agent is curated by a model vendor. garak, Giskard and DeepTeam are maintained by an infrastructure vendor and two independent companies, and corpus freshness tracks each project's own release cadence. Corpus ownership after 2026 PyRIT — archived Read-only since 27 March 2026. No commits, releases or triage. Promptfoo — acquired OpenAI, March 2026, with an open-source commitment. garak · Giskard · DeepTeam One infrastructure vendor, two independents, each on its own release cadence. What it means for you What it means for you What it means for you A frozen reference, not a maintained tool — and still in most 2026 guides. A model vendor curates the threat model used against its competitors. Freshness is a project health question — check the last probe commit.
这套栈在 2026 年完成了整合。四份主要语料里,有两份易了主或停止了移动。

2026 年有两件事改变了这片版图,而绝大多数已发表的对比都还没跟上。

微软在 2026 年 3 月 27 日封存了 PyRIT。仓库变为只读:无提交、无发版、无议题处理。PyRIT 曾是多轮自动化红队的参考实现——Crescendo、TAP、skeleton-key 式的逐级升级——而你这周能搜到的"2026 年 LLM 红队指南"里,仍有很大一部分在推荐它。你当初 pip 装下的那一版,就是最后一版了。它编码的那些技法依然成立;围绕这些技法的语料,则已经不再追一个按月变化的领域。

而 Promptfoo 如今属于 OpenAI,收购于 2026 年 3 月宣布,同时承诺继续开放其开源工具。就假定这份承诺成立——结构上的那一点仍然站得住。决定你的智能体是否安全的那份语料,由一家模型厂商策展,而这家厂商自己的智能体产品同样在这些攻击的射程之内。这件事要紧,并不需要任何阴谋:注意力会跟着收购方的路线图走,而能拿到探针的失败类别,往往正是会让收购方那套栈难堪的那些。如果你的部署跑在另一家厂商的模型上,那你如今读的,是一份由你供应商的竞争对手撰写的威胁模型。

实务上的结论是:没有任何单一工具构成一支红队。跑一份不是因为立场而选的语料——garak 打模型,一款应用扫描器进 CI——再自己攒一小份本地语料,取材于你自己的事故与你自己的领域。只有第三份,是被保证与"你"有关的;而它通常是二十条,不是两千条。

什么时候选哪个

处境用因为
选型或更换基座模型garak只有它测的是模型本身,而不是你包在外面的提示词。
用安全回归卡住构建Promptfoo仓库里的 YAML 让一条发现一次提交就变成永久测试。
安全与质量出一份报告Giskard它的扫描本就把注入、泄露与幻觉、偏见混在一起。
需要对齐 OWASP、NIST 或 ATLAS 的证据DeepTeam它的漏洞清单已经映射好了,省掉一道人工翻译。
一个会调用工具的智能体任意一款,外加你自己写的敌意工具四款里没有一款靠自己够得到工具结果通道。
多轮升级类研究Giskard 或 DeepTeam这一格原本的答案是 PyRIT,而它自 2026 年 3 月起只读。

有一件事值得直说,因为这些工具鼓励的恰恰是反面:扫描器产出的是发现,不是保证。它没法告诉你,在你智能体对外可见的效果里,它究竟攻击到了多大一部分——而正是这个比例,而非通过率,才是评审者该索要的数字。如果你的智能体能发邮件、能写数据库、能开 PR,而你的红队运行自始至终只跟聊天端点说过话,那这份报告讲的就是另一套系统,不是线上那套。真正的演练在此之上还要加什么,见对智能体做红队;另一半——你部署的那道防御到底会不会触发——见评估护栏与检测器。

常见问题

PyRIT 现在真的不能用了吗?

它仍然跑得起来,它的攻击策略也依然成立。但仓库自 2026 年 3 月 27 日起封存且只读,因此不会再有新探针、修复或议题处理。把它当作一份冻结的参考实现,而不是一款在维护的工具。

OpenAI 拥有 Promptfoo,会让它不可信吗?

不会。开源工具仍然开放,工具本身也好用。需要提防的是更窄的一点:攻击语料反映的是维护方的优先级,所以别让一份厂商策展的语料成为你唯一跑的那一份,尤其当你部署在另一家厂商的模型上时。

我能不能四个全跑?

能,但重叠大到边际新发现掉得很快。同样的预算,更好的用法是:一次模型层扫描、一次进 CI 的应用层扫描,外加一套它们都没给你的敌意工具装置。

为什么工具结果通道比用户提示词更要紧?

因为用户提示词是你本来就不信任的那条通道。工具结果是以"智能体自己要来的数据"的身份抵达的,很少被复核,而且经常带着完全另一个人写的文字——一个网页、一张工单、一行日志、共享盘里的一份文档。

这周最便宜的一件事是什么?

把那个敌意工具写出来。二十行,返回一份看着合理、内含一条指令的文档,注册进你真实的工具目录,再用良性提示词驱动。多数团队一个下午就能弄清:自家智能体到底会不会去执行它"读到的"而非"被交代的"指令。

延伸阅读

本站相关:

项目来源: