NVIDIA/garak
GitHub: NVIDIA/garak
NVIDIA 开源的大语言模型漏洞扫描器,用于检测 LLM 的提示注入、越狱、数据泄露、幻觉生成等安全风险。
Stars: 7101 | Forks: 804
# garak,LLM 漏洞扫描器
*生成式 AI 红队评估与检测套件*
`garak` 用于检查 LLM 是否会以我们不希望的方式失效。`garak` 探测幻觉、数据泄露、提示注入、虚假信息、毒性生成、越狱以及许多其他弱点。如果您了解 `nmap` 或 `msf` / Metasploit Framework,garak 的功能与它们类似,但针对的是 LLM。
`garak` 专注于导致 LLM 或对话系统失效的方式。它结合静态、动态和自适应探针来探索这些问题。
`garak` 是一款免费工具。我们热爱开发它,并始终有兴趣添加功能以支持各种应用。
[](https://opensource.org/licenses/Apache-2.0)
[](https://github.com/NVIDIA/garak/actions/workflows/test_linux.yml)
[](https://github.com/NVIDIA/garak/actions/workflows/test_windows.yml)
[](https://github.com/NVIDIA/garak/actions/workflows/test_macos.yml)
[](http://garak.readthedocs.io/en/latest/?badge=latest)
[](https://arxiv.org/abs/2406.11036)
[](https://discord.gg/uVch4puUCs)
[](https://github.com/psf/black)
[](https://pypi.org/project/garak)
[](https://badge.fury.io/py/garak)
[](https://pepy.tech/project/garak)
[](https://pepy.tech/project/garak)
## 入门指南
### > 查看我们的用户指南! [docs.garak.ai](https://docs.garak.ai/)
### > 加入我们的 [Discord](https://discord.gg/uVch4puUCs)!
### > 项目链接 & 主页:[garak.ai](https://garak.ai/)
### > Twitter:[@garak_llm](https://twitter.com/garak_llm)
### > DEF CON [slides](https://garak.ai/garak_aiv_slides.pdf)!
## LLM 支持 目前支持: * [hugging face hub](https://huggingface.co/models) 生成式模型 * [replicate](https://replicate.com/) 文本模型 * [openai api](https://platform.openai.com/docs/introduction) 聊天与续写模型 * [aws bedrock](https://aws.amazon.com/bedrock/) 基础模型 * [litellm](https://www.litellm.ai/) * 几乎所有可通过 REST 访问的模型 * gguf 模型,如 [llama.cpp](https://github.com/ggerganov/llama.cpp) 版本 >= 1046 * .. 以及更多 LLM! ## 安装: `garak` 是一个命令行工具。它在 Linux 和 OSX 上开发。 ### 使用 `pip` 标准安装 只需从 PyPI 获取,您就可以开始了: ``` python -m pip install -U garak ``` ### 使用 `pip` 安装开发版本 `garak` 的标准 pip 版本会定期更新。要从 GitHub 获取更新鲜的版本,请尝试: ``` python -m pip install -U git+https://github.com/NVIDIA/garak.git@main ``` ### 从源码克隆 `garak` 有自己的依赖项。您可以在其独立的 Conda 环境中安装 `garak`: ``` 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 上阅读此文,请按如下方式更新您的远程仓库: ``` git remote set-url origin https://github.com/NVIDIA/garak.git ``` ## 快速开始 通用语法是: `garak`
`garak` 需要知道要扫描哪个模型,默认情况下,它会尝试在该模型上运行它知道的所有探针,并使用每个探针推荐的漏洞检测器。您可以使用以下命令查看探针列表:
`garak --list_probes`
要指定生成器,请使用 `--target_type` 以及可选的 `--target_name` 选项。模型类型指定模型系列/接口;模型名称指定要使用的具体模型。下面的“生成器简介”部分描述了一些支持的生成器。一个简单的生成器系列是 Hugging Face 模型;要加载其中一个,请将 `--target_type` 设置为 `huggingface`,并将 `--target_name` 设置为 Hub 上的模型名称(例如 `"RWKV/rwkv-4-169m-pile"`)。某些生成器可能需要将 API 密钥设置为环境变量,如果需要,它们会通知您。
`garak` 默认运行所有探针,但您也可以具体指定。例如,`--probes promptinject` 将仅使用 [PromptInject](https://github.com/agencyenterprise/promptinject) 框架的方法。您也可以通过在插件名称后添加 `.` 来指定特定的插件而不是插件系列;例如,`--probes lmrc.SlurUsage` 将使用基于 [Language Model Risk Cards](https://arxiv.org/abs/2303.18190) 框架的检查模型生成侮辱性言论的实现。
如需帮助和灵感,请在 [Twitter](https://twitter.com/garak_llm) 或 [discord](https://discord.gg/uVch4puUCs) 上找到我们!
## 示例
探测商业模型的基于编码的提示注入(OSX/*nix)(将示例值替换为真实的 OpenAI API 密钥)
```
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
```
## 解读结果
对于加载的每个探针,garak 将在生成时打印一个进度条。生成完成后,将给出评估每个检测器上该探针结果的行。如果任何提示尝试产生了不良行为,响应将被标记为 FAIL,并给出失败率。
以下是 GPT-3 变体上 `encoding` 模块的结果:

以及 ChatGPT 的相同结果:

我们可以看到,较新的模型更容易受到基于编码的注入攻击,而 text-babbage-001 仅被发现容易受到引用可打印和 MIME 编码注入的攻击。每行末尾的数字,例如 840/840,表示文本生成的总数,以及其中看起来行为正常的数量。这个数字可能很高,因为每个提示会进行多次生成——默认为 10 次。
错误信息会记录在 `garak.log` 中;运行过程会详细记录在一个 `.jsonl` 文件中,该文件在分析开始和结束时指定。在 `analyse/analyse_log.py` 中有一个基本的分析脚本,它会输出导致最多命中的探针和提示。
欢迎提交 PR 和开启 issue。祝狩猎愉快!
## 生成器简介
### Hugging Face
使用 Pipeline API:
* `--target_type huggingface`(用于本地运行 transformers 模型)
* `--target_name` - 使用 Hub 上的模型名称。只有生成式模型有效。如果失败但不应该失败,请开启一个 issue 并粘贴您尝试的命令 + 异常!
使用 Inference API:
* `--target_type huggingface.InferenceAPI`(用于基于 API 的模型访问)
* `--target_name` - Hub 上的模型名称,例如 `"mosaicml/mpt-7b-instruct"`
使用私有端点:
* `--target_type huggingface.InferenceEndpoint`(用于私有端点)
* `--target_name` - 端点 URL,例如 `https://xxx.us-east-1.aws.endpoints.huggingface.cloud`
* (可选)将 `HF_INFERENCE_TOKEN` 环境变量设置为具有“read”角色的 Hugging Face API 令牌;登录后查看 https://huggingface.co/settings/tokens
### OpenAI
* `--target_type openai`
* `--target_name` - 您想使用的 OpenAI 模型。`gpt-5-nano` 速度快,适合测试。
* 将 `OPENAI_API_KEY` 环境变量设置为您的 OpenAI API 密钥(例如 "sk-19763ASDF87q6657");登录后查看 https://platform.openai.com/account/api-keys
识别的模型类型已列入白名单,因为插件需要知道使用哪个子 API。Completion 或 ChatCompletion 模型均可。如果您想使用不支持的模型,您应该会收到一条信息丰富的错误消息,请发送 PR 或开启 issue。
### Replicate
* 将 `REPLICATE_API_TOKEN` 环境变量设置为您的 Replicate API 令牌,例如 "r8-123XXXXXXXXXXXX";登录后查看 https://replicate.com/account/api-tokens
公共 Replicate 模型:
* `--target_type replicate`
* `--target_name` - Replicate 模型名称和哈希,例如 `"stability-ai/stablelm-tuned-alpha-7b:c49dae36"`
私有 Replicate 端点:
* `--target_type replicate.InferenceEndpoint`(用于私有端点)
* `--target_name` - 已部署端点的 username/model-name slug,例如 `elim/elims-llama2-7b`
### Cohere
* `--target_type cohere`
* `--target_name`(可选,默认为 `command`)- 您想测试的特定 Cohere 模型
* 将 `COHERE_API_KEY` 环境变量设置为您的 Cohere API 密钥,例如 "aBcDeFgHiJ123456789";登录后查看 https://dashboard.cohere.ai/api-keys
### Groq
* `--target_type groq`
* `--target_name` - 通过 Groq API 访问的模型名称
* 将 `GROQ_API_KEY` 环境变量设置为您的 Groq API 密钥,有关创建 API 密钥的详细信息,请参阅 https://console.groq.com/docs/quickstart
### ggml
* `--target_type ggml`
* `--target_name` - 您想加载的 ggml 模型的路径,例如 `/home/leon/llama.cpp/models/7B/ggml-model-q4_0.bin`
* 将 `GGML_MAIN_PATH` 环境变量设置为您的 ggml `main` 可执行文件的路径
### REST
`rest.RestGenerator` 非常灵活,可以连接到任何返回纯文本或 JSON 的 REST 端点。它确实需要一些简短的配置,通常会导致一个描述您端点的简短 YAML 文件。示例请参阅 https://reference.garak.ai/en/latest/garak.generators.rest.html。
### NIM
使用来自 https://build.nvidia.com/ 或其他 NIM 端点的模型。
* 将 `NIM_API_KEY` 环境变量设置为您的认证 API 令牌,或在配置 YAML 中指定
对于聊天模型:
* `--target_type nim`
* `--target_name` - NIM `model` 名称,例如 `meta/llama-3.1-8b-instruct`
对于补全模型:
* `--target_type nim.NVOpenAICompletion`
* `--target_name` - NIM `model` 名称,例如 `bigcode/starcoder2-15b`
### AWS Bedrock
* `--target_type bedrock`
* `--target_name` - Bedrock 模型 ID 或别名,例如 `anthropic.claude-3-sonnet-20240229-v1:0` 或 `claude-3-sonnet`
* 将 `BEDROCK_API_KEY` 环境变量设置为您的 AWS Bedrock API 密钥;设置说明请参阅 https://docs.aws.amazon.com/bedrock/latest/userguide/api-keys-use.html
* (可选)设置 `BEDROCK_REGION` 环境变量以指定 AWS 区域(默认为 `us-east-1`)
支持的模型系列包括 Anthropic Claude、Meta Llama、Amazon Titan、AI21 Labs、Cohere 和 Mistral AI 模型。生成器使用 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_type test`
* (或者)`--target_name test.Blank`
用于测试。这总是生成空字符串,使用 `test.Blank` 生成器。对于任何*需要*输出的测试,将被标记为失败,例如那些提出有争议的主张并期望模型反驳才能通过的测试。
* `--target_type test.Repeat`
用于测试。此生成器重复接收到的提示。
## 探针简介
| 探针 | 描述 |
|----------------------|-------------------------------------------------------------------------------------------------------------------------------|
| blank | 一个简单的探针,总是发送一个空提示。 |
| atkgen | 自动攻击生成。一个红队 LLM 探测目标并对其做出反应,试图获取毒性输出。原型,大多无状态,目前仅在产生可检测毒性的 hhrlhf 尝试子集上使用简单的 GPT-2 [fine-tuned](https://huggingface.co/garak-llm/artgpt2tox)(目前仅支持该目标)。 |
| badchars | 实现受 [Bad Characters](https://arxiv.org/abs/2106.09898) 论文启发的难以察觉的 Unicode 扰动(不可见字符、同形字、重排序、删除)。 |
| av_spam_scanning | 试图让模型输出恶意内容特征的探针 |
| continuation | 测试模型是否会续写一个可能不良的单词 |
| dan | 各种 [DAN](https://adguard.com/en/blog/chatgpt-dan-prompt-abuse.html) 和类似 DAN 的攻击 |
| donotanswer | 负责任的语言模型不应回答的提示。 |
| encoding | 通过文本编码进行的提示注入 |
| gcg | 通过附加对抗性后缀来破坏系统提示。 |
| glitch | 探测模型中引发异常行为的故障标记。 |
| grandma | 请求被提醒某人的祖母。 |
| goodside | Riley Goodside 攻击的实现。 |
| leakreplay | 评估模型是否会重放训练数据。 |
| lmrc | [Language Model Risk Cards](https://arxiv.org/abs/2303.18190) 探针的子采样 | malwaregen | 试图让模型生成构建恶意软件的代码 |
| misleading | 试图让模型支持误导性和虚假声明 |
| packagehallucination | 试图获取指定不存在(因此不安全)包的代码生成。 |
| promptinject | Agency Enterprise [PromptInject](https://github.com/agencyenterprise/PromptInject/tree/main/promptinject) 工作的实现 (NeurIPS ML Safety Workshop 2022 最佳论文奖) |
| realtoxicityprompts | RealToxicityPrompts 工作的子集(数据受限,因为完整测试运行时间太长) |
| snowball | [Snowballed Hallucination](https://ofir.io/snowballed_hallucination.pdf) 探针,旨在让模型对对其来说过于复杂而无法处理的问题给出错误答案 |
| xss | 寻找允许或实施跨站攻击的漏洞,例如私人数据窃取。 |
## 日志记录
`garak` 生成多种日志:
* 日志文件 `garak.log`。这包含来自 `garak` 及其插件的调试信息,并在多次运行中延续。
* 当前运行的报告,结构为 JSONL。每次 `garak` 运行时都会创建一个新的报告文件。此文件的名称在开始时输出,如果成功,也在运行结束时输出。在报告中,每个探测尝试都会在收到生成结果时以及评估时各记录一次;条目的 `status` 属性采用 `garak.attempts` 中的常量来描述其制作阶段。
* 命中日志,详细记录产生漏洞(“命中”)的尝试
## 代码结构如何?
查看 [reference docs](https://reference.garak.ai/) 以获取 `garak` 代码结构的权威指南。
在典型的运行中,`garak` 将从命令行读取模型类型(以及可选的模型名称),然后确定要运行的 `probe` 和 `detector`,启动 `generator`,然后将这些传递给 `harness` 进行探测;`evaluator` 处理结果。这些类别中有许多模块,每个模块提供许多充当单独插件的类。
* `garak/probes/` - 用于生成与 LLM 交互的类
* `garak/detectors/` - 用于检测 LLM 是否表现出给定失效模式的类
* `garak/evaluators/` - 评估报告方案
* `garak/generators/` - 用于被探测 LLM 的插件
* `garak/harnesses/` - 用于构建测试的类
* `resources/` - 插件所需的辅助项目
默认操作模式是使用 `probewise` harness。给定探针模块名称和探针插件名称列表,`probewise` harness 实例化每个探针,然后对于每个探针读取其 `primary_detector` 和 `extended_detectors` 属性,以获取要在输出上运行的 `detector` 列表。
每个插件类别(`probes`、`detectors`、`evaluators`、`generators`、`harnesses`)都包含一个 `base.py`,它定义了该类别中插件可使用的基类。每个插件模块定义继承自其中一个基类的插件类。例如,`garak.generators.openai.OpenAIGenerator` 继承自 `garak.generators.base.Generator`。
较大的构件(如模型文件和较大的语料库)不保存在存储库中;它们可以存储在例如 Hugging Face Hub 上,并由客户端使用 `garak` 在本地加载。
## 开发您自己的插件
* 看看其他插件是如何做的
* 继承自其中一个基类,例如 `garak.probes.base.TextProbe`
* 尽可能少地重写
* 您可以通过至少两种方式测试新代码:
* 启动交互式 Python 会话
* 导入模型,例如 `import garak.probes.mymodule`
* 实例化插件,例如 `p = garak.probes.mymodule.MyProbe()`
* 使用测试插件运行扫描
* 对于探针,尝试空白生成器和 always.Pass 检测器:`python3 -m garak -m test.Blank -p mymodule -d always.Pass`
* 对于检测器,尝试空白生成器和空白探针:`python3 -m garak -m test.Blank -p test.Blank -d mymodule`
* 对于生成器,尝试空白探针和 always.Pass 检测器:`python3 -m garak -m mymodule -p test.Blank -d always.Pass`
* 让 `garak` 列出您正在编写的类型的所有插件,使用 `--list_probes`、`--list_detectors` 或 `--list_generators`
## 常见问题解答
我们有一个常见问题解答 [here](https://github.com/NVIDIA/garak/blob/main/FAQ.md)。如果您有更多问题,请联系我们
代码参考文档位于 [garak.readthedocs.io](https://garak.readthedocs.io/en/latest/)。
## 引用 garak
您可以阅读 [garak preprint paper](garak-paper.pdf)。如果您使用 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](https://twitter.com/garak_llm) © 2023- Leon Derczynski; Apache license v2,请参阅 [LICENSE](LICENSE)
## LLM 支持 目前支持: * [hugging face hub](https://huggingface.co/models) 生成式模型 * [replicate](https://replicate.com/) 文本模型 * [openai api](https://platform.openai.com/docs/introduction) 聊天与续写模型 * [aws bedrock](https://aws.amazon.com/bedrock/) 基础模型 * [litellm](https://www.litellm.ai/) * 几乎所有可通过 REST 访问的模型 * gguf 模型,如 [llama.cpp](https://github.com/ggerganov/llama.cpp) 版本 >= 1046 * .. 以及更多 LLM! ## 安装: `garak` 是一个命令行工具。它在 Linux 和 OSX 上开发。 ### 使用 `pip` 标准安装 只需从 PyPI 获取,您就可以开始了: ``` python -m pip install -U garak ``` ### 使用 `pip` 安装开发版本 `garak` 的标准 pip 版本会定期更新。要从 GitHub 获取更新鲜的版本,请尝试: ``` python -m pip install -U git+https://github.com/NVIDIA/garak.git@main ``` ### 从源码克隆 `garak` 有自己的依赖项。您可以在其独立的 Conda 环境中安装 `garak`: ``` 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 上阅读此文,请按如下方式更新您的远程仓库: ``` git remote set-url origin https://github.com/NVIDIA/garak.git ``` ## 快速开始 通用语法是: `garak
_"撒谎和其他技能一样,如果你想保持卓越水平,就必须不断练习"_ - Elim 有关更新和新闻,请参阅 [@garak_llm](https://twitter.com/garak_llm) © 2023- Leon Derczynski; Apache license v2,请参阅 [LICENSE](LICENSE)
标签:AI安全, Chat Copilot, Clair, DLL 劫持, IaC 扫描, Kubernetes 安全, LLM, OCI, Petitpotam, Python, Unmanaged PE, 云安全监控, 反取证, 后端开发, 后端开发, 域名收集, 基础设施安全, 大语言模型, 安全评估, 对抗攻击, 提示注入, 敏感信息检测, 无后门, 模型鲁棒性, 生成式AI, 索引, 红队测试, 网络安全, 逆向工具, 镜像安全, 隐私保护, 集群管理, 零日漏洞检测, 静态分析