Garak 是 NVIDIA 维护的开源 LLM(大型语言模型)漏洞扫描器,采用 Apache 2.0 协议,用于自动化探测大语言模型的安全漏洞:提示注入、越狱、训练数据泄露、幻觉、恶意代码生成等。它把“构造攻击载荷→调用目标模型→判定是否成功→记录结果”固化为可重复执行的流水线,让模型安全测试从“人工逐条试提示词”升级为可回归、可审计的自动化扫描。Garak 采用四类插件体系(Probes 探测、Detectors 判定、Generators 模型接入、Buffers 载荷变换),既支持 OpenAI、Anthropic 等 API 模型,也支持 Hugging Face、Ollama 本地模型。本文按“安装配置→快速上手→核心能力→生产部署”的顺序讲解,并在对比、误区、面试题中补充选型与避坑建议。
掌握 Garak 意味着你能把 LLM 安全评估从“凭经验猜测提示词”升级为标准化、可复现、可审计的漏洞扫描流程,这是 AI 安全工程师、红队与模型评测岗位的核心技能之一。
目录
速览卡是工具类内容的固定首屏模块:30 秒判断「这工具是什么、能不能商用、适不适合我」。
为什么需要 Garak:模型攻击面无法用人工测试覆盖
LLM 应用的攻击面与传统软件不同——没有“安全补丁”,系统提示词、输入过滤器、RAG(检索增强生成)上下文都是可攻击入口。人工红队测试依赖经验逐条构造提示词,用例不系统、结果不可复现;模型每更新一次,手工经验就要重来一遍。安全团队缺少能把攻击案例沉淀为自动化回归测试的工具,这正是 Garak 要解决的问题。
Garak 提供“探测集”机制:每个探测(probe)是一类攻击的自动化生成器,内置提示注入、越狱、数据泄露、幻觉、恶意代码生成等常见威胁面;探测器(detector)自动判定攻击是否得手;扫描结果以 JSONL(按行存储的 JSON 格式)全量记录,并生成 HTML 报告。同样的探测集在每次模型发布时重跑,就形成了安全回归门禁。
与同类工具相比,Garak 是“扫描器”思维:CLI 即用、开箱可跑,默认配置就能产出可读报告;PyRIT 更像可编程红队 SDK,ART 与 TextAttack 偏学术研究。对“上线前要一份可审计安全测试结果”的工程团队,Garak 的应用路径最短。
安装与环境配置:3 步就绪
步骤一:安装。 需要 Python 3.10 及以上版本。直接用 pip 安装主包;如需扫描 Hugging Face 本地模型,再安装对应可选依赖(extra),全部依赖可用 garak[all] 一次装齐。
步骤二:配置凭证与环境。 扫描 API 模型前,把对应厂商的 API Key 写入环境变量(OpenAI 用 OPENAI_API_KEY,Anthropic 用 ANTHROPIC_API_KEY)。Garak 的默认配置文件位于 ~/.config/garak/garak.yaml,可预设默认模型类型、探测集与并发参数;不放置该文件时使用内置默认值。
步骤三:验证安装。 用 --version 查看版本,用 --list_probes 与 --list_detectors 确认探测与判定插件可正常加载;能列出插件即说明安装成功。
pip install garakpip install "garak[all]" # 可选:安装 Hugging Face 等本地模型支持export OPENAI_API_KEY=sk-xxxx # 替换为真实 Keygarak --versiongarak --list_probes | head -20garak --list_detectors
快速上手:5 分钟跑通第一次扫描
快速上手的目标是跑通“指定模型→执行探测→查看报告”的最小闭环。先在官方支持的 API 模型上做默认扫描,确认结果落盘与报告生成正常,再扩展到组合探测与本地模型;这样能最快区分“工具没配好”与“模型真有漏洞”两类问题。
1. 安装并验证(见上一节)。
2. 确认 OPENAI_API_KEY 已写入环境变量。
3. 执行扫描命令,指定模型类型 openai 与模型名 gpt-4o-mini。
4. 观察终端输出:Garak 会先加载插件,再逐个执行探测器,实时打印每个探测的命中数与总数,最后打印结果保存路径。
5. 查看结果:扫描输出默认保存在当前目录的 garak_runs/ 下,按日期与扫描 ID 组织;扫描结束自动生成 HTML 报告,打开即可看到按探测器分类的成功率与命中样本。
6. 进阶操作:组合多个探测并叠加缓冲区,评估输入过滤器是否可被编码绕过。
结果解读:报告按探测器给出成功率,成功率越高说明该攻击面越容易被利用。注意同一模型在不同采样参数(如温度)下结果会有波动,正式评估应固定参数并重跑多轮取稳定值。
# 第一次扫描:默认执行 dan 越狱探测集garak --model_type openai --model_name gpt-4o-mini --probes dan # 查看结果目录结构ls -R garak_runs/ | head -40 # 进阶:组合探测 + base64 编码变换garak --model_type openai --model_name gpt-4o-mini --probes promptinject,jailbreak --buffers base64 # 本地模型(Ollama 服务)garak --model_type ollama --model_name llama3.1
核心能力详解:4 大支柱
支柱一:Probes——攻击探测集。 Probe 是 Garak 的一等插件类型,负责自动生成攻击载荷。内置探测覆盖 promptinject(提示注入)、jailbreak 与 dan(越狱)、leakreplay(上下文数据泄露)、hallucination(幻觉触发)、malwaregen(恶意代码生成)等,多数场景对应 OWASP LLM Top 10 中的风险类别。探测集可用逗号组合(--probes promptinject,jailbreak),也支持通配符(如 "jailbreak*")批量选择。选哪些探测应由威胁建模决定,而不是全量盲跑。
支柱二:Detectors——成败判定器。 探测发出攻击后,需要判定攻击是否成功。Detector 支持精确文本/正则匹配、外部服务(如毒性检测 API)以及基于 LLM 的判定等模式。Garak 会先对模型跑一条基线(正常生成样本),再跑攻击样本,自动剔除模型本来就有的行为,聚焦“由攻击引发的差异”,结果以成功率呈现。判定器选择直接影响结论可信度:exact 类判定可复现性高,LLM 判定覆盖更广但需抽检复核。
支柱三:Generators——模型接入层。 同一套探测代码要能测不同模型,靠的是 Generator 抽象。OpenAI、Anthropic、Cohere 等 API 模型,Hugging Face 开源模型、Ollama 本地服务、Replicate 托管模型,都通过 --model_type 指定接入,无需修改探测代码。这意味着同一攻击套件可以横向跑在不同模型上,直接对比候选模型的抗攻击能力。
支柱四:Buffers——载荷变换层。 很多模型网关带输入过滤,明文攻击载荷会被直接拦截。Buffer 对载荷做编码或变形(如 base64、rot13)后再发给模型,用于检验过滤器是否可被绕过。是否加 Buffer 显著影响结论:不加可能漏报(假阴性),全加可能放大无效攻击(假阳性),建议按“防御验证”目的单独跑一轮。
生产部署与监控:从上线到运维
部署方式一:CI/CD 安全门禁。 在发布流水线(GitHub Actions、GitLab CI 等)中安装 Garak,对候选模型执行固定的探测组合,把探测器成功率作为质量阈值,超过即阻断发布。扫描产物(garak_runs/ 下 JSONL 与 HTML 报告)作为发布审计附件归档。
部署方式二:定时回归扫描。 用 cron 每周跑一次固定探测集,跟踪模型迭代后的行为漂移——例如 RAG 应用底层模型升级后,leakreplay(数据泄露)成功率是否上升。
可观测性与审计。 每次扫描的 JSONL 保留模型输入输出与判定结果的原始记录,可重放、可复核;garak --report 可从已保存的 JSONL 重新生成 HTML 报告,适合留档审计。Garak 本身不提供指标导出,如需接入监控大盘,可解析 JSONL 提取各探测器成功率写入 Prometheus 或 SIEM(实践建议,非内置功能)。多环境建议采用不同探测集:dev 环境跑全量,production 跑低成本高价值子集。
<p class="para-label">避坑清单:</p>
<ul class="dash-list"><li>默认只跑 dan 探测:不指定 --probes 时 Garak 仅执行 dan 越狱探测,不代表完整安全评估,应根据威胁面显式组合 promptinject、jailbreak、leakreplay、hallucination 等探测集。</li><li>不加 Buffer 会低估防御绕过风险:base64、rot13 等编码变换可绕过输入过滤,只测明文载荷容易漏报(假阴性),评估过滤器时必须叠加 buffers。</li><li>API 扫描成本不可控:对付费 API 模型跑大规模探测集会消耗大量 token,建议先查看探测规模、分批执行并限制并发,避免单次扫描成本失控。</li><li>detector 输出不等于漏洞实锤:exact 匹配可能漏报、基于 LLM 的判定存在误判,对高失败率样本必须人工重放复核后再定性。</li></ul>
pip install garakgarak --model_type openai --model_name gpt-4o-mini \ --probes promptinject,jailbreak,dan --buffers base64
0 3 * * 1 cd /srv/garak && export OPENAI_API_KEY=sk-xxxx && garak --model_type openai --model_name gpt-4o-mini --probes leakreplay,hallucination| 维度 | Garak | PyRIT(微软) | ART(IBM) | TextAttack |
|---|---|---|---|---|
| 定位 | LLM 漏洞扫描器 | 生成式 AI 红队工具箱 | 对抗鲁棒性评测库 | 文本对抗攻击/数据增强库 |
| 编排范式 | CLI + 插件系统 | Python SDK + CLI | Python 库 | Python 库 |
| 类型约束 | 聚焦生成式 LLM | 生成式 AI(含多模态) | 图像/表格/文本 | 文本分类/序列到序列 |
| 学习曲线 | 低(开箱即用) | 中(以 SDK 编程为主) | 中高(需编程基础) | 中(需编程基础) |
| 生态集成 | OpenAI/HF/Ollama 等 | Azure/OpenAI 等微软生态 | HF/sklearn 等 | HF datasets |
| 生产部署 | CI 友好·本地报告 | DevSecOps 集成 | 研究为主 | 研究为主 |
| License | Apache 2.0 | MIT | MIT | MIT |
| 适合谁 | AI 安全工程师·红队·MLOps | 微软生态安全团队 | 对抗 ML 研究者 | NLP 研究者 |
选型建议:若目标是“开箱即用地评估生产 LLM 的提示注入/越狱/泄露风险并生成可审计报告”,Garak 最直接;若团队重度使用 Azure 且需要可编程的红队自动化流程,选 PyRIT;ART 与 TextAttack 更适合学术研究对抗样本生成算法,不宜直接作为线上模型安全门禁。
版本迭代
garak 于 2024 年上半年以 0.9、0.10、0.11 系列快速迭代并配套学术论文,2024 年 8 月 NVIDIA 宣布收购前后发布 1.0 里程碑,此后以约每月一个次版本的速度持续扩充探测类型、模型接入方式与报告能力(截至训练数据,可能已有更新版本)。
| 版本 | 时间 | 变化 | 提升 |
|---|---|---|---|
| v0.9.0 | 2024-03 | 框架成型 | 四类插件体系定型,作为论文(arXiv:2406.09136)所述框架的实现基线 |
| v1.0.0 | 2024-08 | 1.0 里程碑 | NVIDIA 收购前后发布,CLI、配置与插件 API 进入稳定状态 |
| v1.1.0 | 2024-09 | 增量迭代 | 补充探测类型与生成器接入,修复稳定性问题 |
| v1.2.0 | 2024-11 | 探测增强 | 扩展缓冲区能力与探测覆盖,完善报告输出 |
| v1.3.0 | 2024-12 | 维护迭代 | 继续扩充探测与模型接入,保持向后兼容 |
garak 的演进主线是“探测覆盖面扩大 + 模型接入面扩大”,1.0 之后 API 稳定,适合作为 CI 中的长期安全门禁来依赖。garak 是扫描工具而非模型,不参与 MMLU 等模型榜单评测,无公开评测分数;横向对比时应关注最新版对目标模型接入的支持情况与探测数量。
AI 应用场景
场景一:模型上线前的自动化安全门禁
阶段:LLM 安全测试 / 发布前风险评估
解决的问题:人工红队测试覆盖不全、结果不可复现。Garak 把越狱、提示注入等攻击固化为可重复执行的探测集,接入发布流水线后,模型每换一个版本就跑一次相同攻击面。
具体案例:以一个 RAG 服务发布流程为例,对候选模型执行 promptinject、jailbreak 组合探测,并用 base64 buffer 验证输入过滤器是否可绕过;扫描全程自动化,单探测集耗时取决于模型吞吐(分钟级到小时级),结果以 JSONL 与 HTML 报告入库供审计复核。
场景二:多模型选型的安全维度对比
阶段:模型评测 / 供应商选型
解决的问题:选型只看准确率、忽略安全维度。同一套探测集跑在不同模型上,输出可比的抗攻击成功率,把安全性纳入选型指标。
具体案例:对 OpenAI、Anthropic 及开源模型各跑同一探测组合(promptinject、leakreplay),生成横向对比报告,作为模型供应商准入的安全附件;扫描命令只改 --model_type 与 --model_name,无需改动探测配置。
场景三:生产模型行为漂移的持续监控
阶段:安全运维 / 模型监控
解决的问题:模型迭代后攻击面可能悄然变化。定时重跑固定探测集,把成功率变化作为行为漂移信号。
具体案例:以 cron 每周对生产模型执行固定探测集,发现某次模型更新后 leakreplay 探测成功率上升,遂收紧系统提示词并回退验证;历史 JSONL 留档支撑了后续的合规审计。
常见误区
误区“我把默认的 garak 命令跑了一遍,全部通过,说明我们的 LLM 应用没有安全问题了”
正解Garak 只报告“测过且判定器能识别”的问题。默认仅跑 dan 探测,提示注入、数据泄露、幻觉等攻击面需要显式选择探测集;判定器本身存在漏报与误报;最终安全结论还要结合部署形态(RAG 检索注入、工具调用、权限边界)做人工复核,扫描报告只是证据,不是结论。
为何常见:自动化扫描报告长得像“安全检查表”,“全绿”很容易被误读为“绝对安全”。
误区“Garak 是 NVIDIA 的商业漏洞扫描产品,应该很贵吧?”
正解Garak 是 Apache 2.0 开源项目,免费可商用、代码可审计、插件可定制。它由原 garak 团队开发,2024 年 8 月并入 NVIDIA 后仍以开源方式维护,任何人都可以 fork、扩展或本地部署。
为何常见:NVIDIA 品牌与“漏洞扫描器”的商业化联想,让人误以为它是闭源企业软件。
误区“这次扫描某个探测器成功率 80%,说明这个漏洞特别严重,必须立刻修复”
正解成功率受探测难度、判定器阈值、模型采样参数等多因素影响,它描述的是“该探测器在本次配置下命中的比例”,不等于业务风险等级。判断严重度还需结合攻击可行性、被攻击面的暴露程度与业务影响,并复核命中样本。
为何常见:数值化输出天然容易被当作客观风险评分,忽略了判定器本身的误差。
误区“我本地起了 Ollama,文档里还有 huggingface 选项,应该都能连本地模型吧?”
正解不同接入方式对应不同 Generator 插件:Ollama 服务用 --model_type ollama,Hugging Face 本地推理用 --model_type huggingface,API 厂商用各自类型(openai、anthropic 等)。选错会导致连接失败或参数不生效;Hugging Face 类型还涉及显存与 device 配置。
为何常见:Generator 抽象对新手不直观,容易按“本地模型 = Hugging Face”的惯性理解。
面试题
Q1. Garak 的核心定位是什么?
- A.LLM 漏洞扫描器← 正确答案
- B.LLM 微调训练框架
- C.向量检索数据库服务
- D.大模型部署推理引擎
答案:A。Garak 是 NVIDIA 开源的 LLM 漏洞扫描器,用于自动化探测提示注入、越狱、数据泄露等漏洞;微调、检索、推理分别是训练框架、向量数据库和推理引擎的职责,均与它无关。
Q2. 安装 Garak 的正确命令是?
- A.pip install garak← 正确答案
- B.npm install garak
- C.apt install garak
- D.docker pull garak
答案:A。Garak 是 Python CLI 工具,官方安装方式是 pip install garak。npm 面向 JavaScript,apt 管理系统软件包,docker pull 需要镜像仓库存在对应镜像,均非官方途径。
Q3. 不指定 --probes 时,Garak 默认执行的是哪种探测?
- A.默认执行越狱探测← 正确答案
- B.提示注入攻击探测
- C.上下文数据泄露探测
- D.模型幻觉检测探测
答案:A。不指定探测集时 Garak 只运行 dan 越狱探测集;promptinject(提示注入)、leakreplay(数据泄露)、hallucination(幻觉)均需显式指定,因此“跑过默认命令”不等于完成完整安全评估。
Q4. 在 Garak 的插件体系中,负责判定攻击是否成功的模块是?
- A.探测器:负责判定攻击命中的模块← 正确答案
- B.生成器:负责接入不同模型的模块
- C.缓冲区:负责变换攻击载荷的模块
- D.数据集:负责准备训练样本的模块
答案:A。Detectors(探测器)负责判定攻击是否命中;Probes 构造攻击载荷,Generators 接入目标模型,Buffers 对载荷做变换。四者分别是“判定、攻击、接入、变换”四个环节。
Q5. 使用 Garak 扫描 OpenAI 模型前,通常需要预先完成什么?
- A.配置模型厂商的调用凭证← 正确答案
- B.启动本地向量数据库服务
- C.预先分配 GPU 显存资源
- D.安装 Docker 容器环境
答案:A。扫描 API 模型必须有厂商凭证,OpenAI 对应 OPENAI_API_KEY 环境变量。向量数据库、GPU 显存和 Docker 都不是扫描 API 模型的前置条件,仅本地模型推理才涉及 GPU 配置。
Q6. Garak 中 Buffers 模块的核心作用是?
- A.对攻击载荷编码变换以绕过过滤← 正确答案
- B.缓存探测结果加快重复扫描
- C.将模型输出写入本地日志
- D.缓冲 API 限流降低失败率
答案:A。Buffers 对攻击载荷做 base64、rot13 等编码或变换,用于检验输入过滤器是否可被绕过。它不缓存结果、不负责日志、也不处理限流,是“载荷变换层”。
Q7. Garak 一次扫描完成后,默认在什么位置保存结果?
- A.当前工作目录的运行文件夹← 正确答案
- B.系统日志目录中的日志
- C.用户缓存目录下的缓存
- D.系统临时目录中的临时
答案:A。Garak 默认在当前工作目录下创建 garak_runs/ 文件夹,按日期与扫描 ID 组织 JSONL 结果与 HTML 报告;系统日志、用户缓存和临时目录都不是默认输出位置。
Q8. 下列属于 Garak 核心插件类型的有哪些?(多选)
- A.Probes 探测模块← 正确答案
- B.Detectors 判定模块← 正确答案
- C.Buffers 载荷模块← 正确答案
- D.Datasets 数据模块
答案:ABC。Garak 的四类一等插件为 Probes(探测)、Detectors(判定)、Generators(模型接入)、Buffers(载荷变换),对应“攻击、判定、接入、变换”四个环节;Datasets 不属于插件体系。
Q9. 下列可以作为 Garak 目标模型接入方式的有哪些?(多选)
- A.OpenAI API 模型← 正确答案
- B.HuggingFace 模型← 正确答案
- C.Ollama 服务模型← 正确答案
- D.MySQL 数据库连接
答案:ABC。Generators 插件支持 OpenAI、Anthropic、Cohere 等 API 模型,以及 Hugging Face、Ollama、Replicate 等本地或托管模型,通过 --model_type 指定;MySQL 是数据库,不是模型接入接口。
Q10. 关于从已有扫描结果重新生成 Garak 报告,正确的做法是?
- A.基于留存的 JSONL 重生成报告← 正确答案
- B.必须重新调用模型接口获取数据
- C.只能生成 PDF 一种格式的文件
- D.需要连接云端管理平台才能使用
答案:A。Garak 每次扫描会把原始输入输出与判定结果写入 JSONL,之后运行 garak --report 即可基于这些存档重新生成报告,无需重新调用模型。B 错在把“再生成”当作“重扫”,C 错在报告格式并非只有 PDF,D 错在 Garak 是本地 CLI 工具,不依赖云端平台。