Garak:LLM 漏洞扫描开源工具
专门扫描大模型应用安全漏洞的工具,帮助开发者加固 AI 系统防线。
专门扫描大模型应用安全漏洞的工具,帮助开发者加固 AI 系统防线。
生成式 AI 红队测试与评估工具包。
garak 用于检查能否让 LLM 以我们不希望看到的方式失效。garak 会探测幻觉、数据泄露、prompt injection、错误信息、毒性内容生成、jailbreak 以及许多其他弱点。如果你了解 nmap 或 msf / Metasploit Framework,那么 garak 所做的事情与它们有些相似,只不过目标是 LLM。
garak 专注于设法让 LLM 或对话系统失效。它结合静态、动态和自适应探针来探索这些问题。
garak 是一款免费工具。我们热爱开发它,也始终愿意添加新功能,为各种应用提供支持。
请参阅我们的用户指南!docs.garak.ai
项目链接与主页:garak.ai
Twitter:@garak_llm
Hugging Face Hub 生成式模型
Replicate 文本模型
OpenAI API chat 与 continuation 模型
AWS Bedrock foundation models
几乎所有可通过 REST 访问的模型
llama.cpp version >= 1046 等 GGUF 模型
……以及更多 LLM!
garak 是一款命令行工具,主要在 Linux 和 OSX 上开发。
直接从 PyPI 获取即可:
python -m pip install -U garak
garak 的标准 pip 版本会定期更新。如果想从 GitHub 获取更新的版本,可以尝试:
python -m pip install -U git+https://github.com/NVIDIA/garak.git@main
garak 有自己的依赖项。你可以把 garak 安装在独立的 Conda 环境中:
conda create --name garak "python>=3.10,<=3.12"
conda activate garak
gh repo clone NVIDIA/garak
cd garak
python -m pip install -e .
好了,如果这些步骤都顺利完成,你应该已经可以开始使用了!
注意:如果你在项目迁移至 NVIDIA GitHub 组织之前就克隆了仓库,但现在是在 github.com/NVIDIA URI 下阅读本文,请按如下方式更新 remote:
git remote set-url origin https://github.com/NVIDIA/garak.git
一般语法如下:
garak 需要知道要扫描哪个模型。默认情况下,它会在该模型上尝试自己掌握的所有 probe,并使用每个 probe 推荐的 vulnerability detector。你可以通过以下方式查看 probe 列表:
要指定 generator,请使用 --target_type,还可以选择使用 --target_name。模型类型用于指定模型家族或接口,模型名称则用于指定要使用的确切模型。下文的“Generator 入门”部分介绍了部分受支持的 generator。Hugging Face 模型是一个比较直观的 generator 家族:要加载其中一个模型,请将 --target_type 设为 huggingface,并将 --target_name 设为该模型在 Hub 上的名称,例如 "RWKV/rwkv-4-169m-pile"。某些 generator 可能要求通过环境变量设置 API key;如果需要,它们会给出提示。
garak 默认会运行所有 probe,但你也可以精确指定。例如,--probes promptinject 只会使用 PromptInject 框架的方法。你还可以指定 plugin 家族中的某个具体 plugin,只需在 . 后添加 plugin 名称。例如,--probes lmrc.SlurUsage 会使用一种基于 Language Model Risk Cards 框架的实现,检查模型是否生成侮辱性用语。
如需帮助或灵感,欢迎通过 Twitter 或 Discord 联系我们!
探测商业模型是否容易受到基于编码的 prompt injection 攻击(OSX/*nix;请将示例值替换为真实的 OpenAI API key):
export OPENAI_API_KEY="sk-123XXXXXXXXXXXX"
python3 -m garak --target_type openai --target_name gpt-5-nano --probes encoding
检查 Hugging Face 版本的 GPT2 是否容易受到 DAN 11.0 攻击:
python3 -m garak --target_type huggingface --target_name gpt2 --probes dan.Dan_11_0
对于加载的每个 probe,garak 都会在生成过程中显示进度条。生成完成后,它会输出一行结果,展示各个 detector 对该 probe 结果的评估。如果任何一次 prompt 尝试引发了不期望的行为,对应响应就会被标记为 FAIL,同时给出失败率。
以下是在 GPT-3 某个变体上使用 encoding 模块得到的结果:
以下是在 ChatGPT 上得到的相同测试结果:
可以看到,较新的模型更容易受到基于编码的 injection 攻击,而 text-babbage-001 仅被发现容易受到 quoted-printable 和 MIME 编码 injection 的影响。每行末尾的数字(例如 840/840)先表示文本生成总数,再表示其中看起来表现正常的数量。这个数字可能相当大,因为每个 prompt 会执行不止一次生成——默认是 10 次。
错误会写入 garak.log;每次运行的详细记录则会写入一个 .jsonl 文件,其路径会在分析开始和结束时显示。analyse/analyse_log.py 中提供了一个基础分析脚本,可以输出命中次数最多的 probe 和 prompt。
欢迎提交 PR 和创建 issue。祝狩猎愉快!
--target_type huggingface(在本地运行 transformers 模型)
--target_name——使用 Hub 上的模型名称。只有生成式模型可以工作。如果运行失败但按理说不应该失败,请创建 issue,并粘贴你尝试的命令和 exception!
--target_type huggingface.InferenceAPI(通过 API 访问模型)
--target_name——Hub 上的模型名称,例如 "mosaicml/mpt-7b-instruct"
--target_type huggingface.InferenceEndpoint(用于私有 endpoint)
--target_type huggingface.InferenceEndpoint(用于私有 endpoint)
--target_name——endpoint URL,例如 https://xxx.us-east-1.aws.endpoints.huggingface.cloud
--target_name——endpoint URL,例如 https://xxx.us-east-1.aws.endpoints.huggingface.cloud
(可选)将 HF_INFERENCE_TOKEN 环境变量设为拥有 "read" 角色的 Hugging Face API token;登录后参阅 https://huggingface.co/settings/tokens
(可选)将 HF_INFERENCE_TOKEN 环境变量设为拥有 "read" 角色的 Hugging Face API token;登录后参阅 https://huggingface.co/settings/tokens
--target_name——你希望使用的 OpenAI 模型。gpt-5-nano 速度快,很适合测试。
将 OPENAI_API_KEY 环境变量设为你的 OpenAI API key,例如 "sk-19763ASDF87q6657";登录后参阅 https://platform.openai.com/account/api-keys
可识别的模型类型采用白名单机制,因为 plugin 需要知道应使用哪个子 API。Completion 或 ChatCompletion 模型都可以使用。如果你想使用尚未支持的模型,应该会收到一条信息明确的错误消息;也欢迎提交 PR 或创建 issue。
将 REPLICATE_API_TOKEN 环境变量设为你的 Replicate API token,例如 "r8-123XXXXXXXXXXXX";登录后参阅 https://replicate.com/account/api-tokens
--target_type replicate
--target_name——Replicate 模型名称和 hash,例如 "stability-ai/stablelm-tuned-alpha-7b:c49dae36"
--target_type replicate.InferenceEndpoint(用于私有 endpoint)
--target_name——已部署 endpoint 的 username/model-name slug,例如 elim/elims-llama2-7b
--target_name(可选,默认使用 command)——你希望测试的具体 Cohere 模型
将 COHERE_API_KEY 环境变量设为你的 Cohere API key,例如 "aBcDeFgHiJ123456789";登录后参阅 https://dashboard.cohere.ai/api-keys
--target_name——要通过 Groq API 访问的模型名称
将 GROQ_API_KEY 环境变量设为你的 Groq API key;有关创建 API key 的详细信息,请参阅 https://console.groq.com/docs/quickstart
--target_name——你希望加载的 ggml 模型路径,例如 /home/leon/llama.cpp/models/7B/ggml-model-q4_0.bin
将 GGML_MAIN_PATH 环境变量设为 ggml main 可执行文件的路径。
rest.RestGenerator 非常灵活,可以连接到任何返回纯文本或 JSON 的 REST endpoint。它需要一些简短配置,通常会形成一个描述 endpoint 的简短 YAML 文件。示例请参阅 https://reference.garak.ai/en/latest/garak.generators.rest.html。
使用来自 https://build.nvidia.com/ 或其他 NIM endpoint 的模型。
将 NIM_API_KEY 环境变量设为你的身份验证 API token,或者在配置 YAML 中指定。
--target_name——NIM 模型名称,例如 meta/llama-3.1-8b-instruct
对于 completion 模型:
--target_type nim.NVOpenAICompletion
--target_name——NIM 模型名称,例如 bigcode/starcoder2-15b
--target_type bedrock
--target_name——Bedrock 模型 ID 或 alias,例如 anthropic.claude-3-sonnet-20240229-v1:0 或 claude-3-sonnet
将 BEDROCK_API_KEY 环境变量设为你的 AWS Bedrock API key;配置说明请参阅 https://docs.aws.amazon.com/bedrock/latest/userguide/api-keys-use.html
(可选)设置 BEDROCK_REGION 环境变量以指定 AWS region,默认为 us-east-1。
支持的模型家族包括 Anthropic Claude、Meta Llama、Amazon Titan、AI21 Labs、Cohere 和 Mistral AI。该 generator 使用 Converse API,以统一访问所有模型类型。
export BEDROCK_API_KEY="your-api-key"
export BEDROCK_REGION="us-east-1"
garak --target_type bedrock --target_name claude-3-sonnet --probes dan
(另一种选择)--target_name test.Blank,用于测试。它始终使用 test.Blank generator 生成空字符串。任何需要输出的测试都会将其标记为失败,例如那些提出有争议的主张,并要求模型反驳这些主张才能通过的测试。
(另一种选择)--target_name test.Blank,用于测试。它始终使用 test.Blank generator 生成空字符串。任何需要输出的测试都会将其标记为失败,例如那些提出有争议的主张,并要求模型反驳这些主张才能通过的测试。
--target_type test.Repeat,用于测试。这个 generator 会原样复述收到的 prompt。
--target_type test.Repeat,用于测试。这个 generator 会原样复述收到的 prompt。
garak 会生成多种日志:
日志文件 garak.log。其中包含 garak 及其 plugin 的调试信息,并会跨多次运行持续追加。
当前运行的报告,以 JSONL 格式组织。garak 每次运行都会创建一个新的报告文件。该文件的名称会在运行开始时输出;如果运行成功,也会在结束时再次输出。在报告中,每次 probing 尝试都会记录两次:一次是在收到 generation 时,另一次是在完成评估时。记录的 status 属性使用 garak.attempts 中的常量来描述记录所处的阶段。
hit 日志,详细记录发现 vulnerability 的尝试,即一次 hit。
关于 garak 的代码结构,请查看 reference docs,其中提供了权威指南。
在一次典型运行中,garak 会从命令行读取模型类型以及可选的模型名称,然后确定要运行哪些 probe 和 detector,启动一个 generator,再将它们交给 harness 执行 probing;evaluator 负责处理结果。上述每个类别都包含许多模块,而每个模块又提供若干作为独立 plugin 的类。
garak/probes/——用于生成与 LLM 交互的类
garak/detectors/——用于检测 LLM 是否呈现特定 failure mode 的类
garak/evaluators/——评估报告方案
garak/generators/——待探测 LLM 的 plugin
garak/harnesses/——用于组织测试的类
resources/——plugin 所需的辅助资源
默认运行模式使用 probewise harness。给定一组 probe 模块名称和 probe plugin 名称后,probewise harness 会实例化每个 probe,然后读取每个 probe 的 primary_detector 和 extended_detectors 属性,获取要在输出上运行的 detector 列表。
每个 plugin 类别(probes、detectors、evaluators、generators、harnesses)都包含一个 base.py,用于定义该类别中的 plugin 可以使用的基类。每个 plugin 模块都会定义继承自某个基类的 plugin 类。例如,garak.generators.openai.OpenAIGenerator 继承自 garak.generators.base.Generator。
模型文件和大型语料库等体积较大的 artefact 不会存放在 repository 中;它们可以存储在 Hugging Face Hub 等位置,再由使用 garak 的 client 加载到本地。
查看其他 plugin 是如何实现的。
继承某个基类,例如 garak.probes.base.TextProbe。
尽可能少地 override。
你至少可以通过两种方式测试新代码:启动交互式 Python session;导入模型,例如 import garak.probes.mymodule;实例化 plugin,例如 p = garak.probes.mymodule.MyProbe()。使用测试 plugin 运行 scan:对于 probe,可以尝试 blank generator 和 always.Pass detector:python3 -m garak -m test.Blank -p mymodule -d always.Pass;对于 detector,可以尝试 blank generator 和 blank probe:python3 -m garak -m test.Blank -p test.Blank -d mymodule;对于 generator,可以尝试 blank probe 和 always.Pass detector:python3 -m garak -m mymodule -p test.Blank -d always.Pass。使用 --list_probes、--list_detectors 或 --list_generators,让 garak 列出你正在开发的该类型的所有 plugin。
启动交互式 Python session;导入模型,例如 import garak.probes.mymodule;实例化 plugin,例如 p = garak.probes.mymodule.MyProbe()。
导入模型,例如 import garak.probes.mymodule。
实例化 plugin,例如 p = garak.probes.mymodule.MyProbe()。
使用测试 plugin 运行 scan:对于 probe,可以尝试 blank generator 和 always.Pass detector:python3 -m garak -m test.Blank -p mymodule -d always.Pass;对于 detector,可以尝试 blank generator 和 blank probe:python3 -m garak -m test.Blank -p test.Blank -d mymodule;对于 generator,可以尝试 blank probe 和 always.Pass detector:python3 -m garak -m mymodule -p test.Blank -d always.Pass。
对于 probe,可以尝试 blank generator 和 always.Pass detector:python3 -m garak -m test.Blank -p mymodule -d always.Pass
对于 detector,可以尝试 blank generator 和 blank probe:python3 -m garak -m test.Blank -p test.Blank -d mymodule
对于 generator,可以尝试 blank probe 和 always.Pass detector:python3 -m garak -m mymodule -p test.Blank -d always.Pass
使用 --list_probes、--list_detectors 或 --list_generators,让 garak 列出你正在开发的该类型的所有 plugin。
我们在这里提供了一份 FAQ。如果还有其他问题,欢迎联系!garak@nvidia.com
代码 reference documentation 位于 garak.readthedocs.io。
你可以阅读 garak 的 preprint 论文。如果你使用了 garak,请引用我们的工作。
@article{garak,
title={{garak: A Framework for Security Probing Large Language Models}},
author={Leon Derczynski and Erick Galinkin and Jeffrey Martin and Subho Majumdar and Nanna Inie},
year={2024},
howpublished={\url{https://garak.ai}}
}
“说谎和其他任何技能一样;如果你想维持卓越水准,就必须不断练习。”——Elim
如需了解更新和新闻,请关注 @garak_llm。
© 2023- Leon Derczynski;Apache License v2,参见 LICENSE