fevziegeyurtsevenler/guardrail-arena
GitHub: fevziegeyurtsevenler/guardrail-arena
一个双维度多语种的 LLM 护栏基准测试工具,同时衡量提示注入漏报率和安全相关文本的过度拒绝率。
Stars: 0 | Forks: 0

# guardrail-arena
**你的 LLM 护栏能拦截攻击吗 —— 同时又不会误伤那些仅仅是*讨论*攻击的正常用户?**
大多数 prompt injection 护栏只在一个维度上评分:它们能拦截多少攻击。这个数字
很容易被刷高 —— 一个直接屏蔽 *"ignore instructions"* 和 *"jailbreak"* 等词汇的护栏
在攻击测试集上看起来会很棒。但真实的流量中,会有安全工程师在写 *"our policy
says the assistant must refuse to reveal its system prompt"*,会有老师在问 *"what is a
jailbreak?"*,或者是一份引用了攻击者原话的土耳其语事件报告。一个拦截了这些内容的护栏
**在生产环境中是坏掉的** —— 只是这种坏掉的方式是单维度基准测试永远无法衡量的。
guardrail-arena 会在**两个维度上同时**对每个护栏进行评分,并支持**英语和土耳其语**:
1. **Miss-rate (漏报率)** ↓ —— 漏掉的攻击。
2. **Over-refusal (过度拒绝)** ↓ —— 被错误拦截的良性 prompt,分为*普通*请求和
**与安全相关 (security-adjacent)** 的文本(即讨论或引用攻击的合法内容)。
所谓护栏,就是任何可调用的 `guard(text) -> 0 | 1`。放入你的代码,运行一条命令,就能生成一行结果。
[](LICENSE)
[](benchmark/data.jsonl)
[](benchmark/data.jsonl)
[](https://huggingface.co/datasets/fevzieyurtsevenler/guardrail-arena)
[](https://fevziegeyurtsevenler.github.io/guardrail-arena/)
## 🏁 排行榜
337 个 prompt · 217 个注入 (EN+TR) · 120 个良性样本 (80 个普通 + 40 个与安全相关)。对于漏报率和过度拒绝率,数值越低越好;对于 F1,数值越高越好。使用 `python run_baselines.py` 进行复现。
| # | Guardrail (护栏) | Miss-rate ↓ | Over-refusal (all) ↓ | **Over-refusal: security-adjacent** ↓ | F1 ↑ | TR miss | TR over-refusal |
|---|-----------|:-----------:|:--------------------:|:-------------------------------------:|:----:|:-------:|:---------------:|
| 1 | **[protectai-deberta-v2](https://huggingface.co/protectai/deberta-v3-base-prompt-injection-v2)** | 0.02 | 0.18 | **0.40** | 0.94 | 0.02 | 0.25 |
| 2 | **AltaySec-detector** \* | 0.00 | 0.23 | **0.70** | 0.94 | 0.00 | 0.23 |
| 3 | **[jackhhao-jailbreak](https://huggingface.co/jackhhao/jailbreak-classifier)** | 0.46 | 0.12 | **0.25** | 0.67 | **0.83** | 0.00 |
| 4 | **keyword** | 0.88 | 0.12 | **0.38** | 0.20 | 0.91 | 0.08 |
| 5 | **regex-rules** | 0.91 | 0.10 | **0.30** | 0.16 | 0.90 | 0.10 |
## 🔎 只有在第二维度才会显现的两个发现
**1. 过度拒绝的断崖。** 几乎没有护栏会过度拦截*普通*请求 —— 但在*与安全相关*
的文本(即讨论或引用攻击的合法内容)上,过度拒绝率呈现爆发式增长:
| Guard (护栏) | 对*普通*请求的 Over-refusal | 对*与安全相关*文本的 Over-refusal |
|-------|:--------------------------------:|:----------------------------------------:|
| regex-rules | 6% | **30%** |
| keyword | 8% | **38%** |
| **protectai-deberta-v2** (工业标准) | 8% | **40%** |
| AltaySec-detector | 0% | **70%** |
即使是 ProtectAI 广泛部署的检测器 —— 一个优秀的攻击捕捉工具 —— 也会拒绝 **10个中足足有4个** 仅
*提及*攻击的良性 prompt。这种权衡在纯攻击性的常规基准测试中是不可见的,而这恰恰就是护栏在实际产品中
发生故障的地方:包括安全团队、SOC 副驾驶、合规工具,以及会引用用户报告的客服机器人。
**2. 多语种盲区。** `jackhhao-jailbreak`,一个用英语训练的分类器,漏掉了
**83% 的土耳其语攻击**,同时却能拦截大多数英语攻击 —— 而且 ProtectAI 的土耳其语过度拒绝率
(25%) 要高于其整体过度拒绝率 (18%)。一个仅用英语验证过的护栏,在英语排行榜上看起来可能没问题,
但在另一种语言中可能几乎是瞎子。
结论:**过度防御和单语种偏差是第一级的故障模式。** 一个如果你无法
在多个语种中同时从这两个维度进行衡量的护栏,就是一个你无法安全部署的护栏。
## 🚀 快速开始 —— 为你的护栏评分
```
pip install -r requirements.txt
```
```
from arena import evaluate, load_benchmark
# guardrail 是任何 callable: text -> 1 (block) / 0 (allow)
def my_guard(text: str) -> int:
return int("ignore previous instructions" in text.lower())
print(evaluate(my_guard, load_benchmark())["overall"])
# {'miss_rate': ..., 'over_refusal_rate': ..., 'f1': ..., ...}
```
复现完整排行榜(keyword + regex-rules + AltaySec 检测器 + 两个开源 HF
护栏 —— ProtectAI deberta-v2 和 jackhhao jailbreak-classifier):
```
pip install transformers torch sentence-transformers scikit-learn joblib huggingface_hub # for the model baselines
python run_baselines.py # writes results.json + LEADERBOARD.md
```
keyword 和 regex-rules 基线不需要额外的依赖;如果未安装
`transformers` / `sentence-transformers`,模型基线将被优雅地跳过。
批量护栏(如 embedding 模型)需实现 `guard(list[str]) -> list[int]` 并使用
`score_batch`。请参阅 [`run_baselines.py`](run_baselines.py) 获取完整的模型示例。
## 📦 基准测试中包含什么
`benchmark/data.jsonl` —— 每行一个 JSON 对象:
```
{"text": "...", "label": 1, "language": "tr", "category": "indirect-injection", "source": "..."}
```
| 划分 (Split) | 数量 | 具体内容 |
|-------|------:|------------|
| Injections (注入, `label=1`) | 217 | 直接 + 间接 prompt injection、jailbreak、数据窃取、角色扮演、编码、隐形文本 —— EN (110) + TR (107)。来自 [AltaySec injection 语料库](https://github.com/fevziegeyurtsevenler/prompt-injection-corpus)。 |
| Benign — plain (良性 - 普通, `label=0`) | 80 | 正常请求,EN + TR。护栏永远不应拦截这些。 |
| Benign — security-adjacent (良性 - 安全相关, `label=0`) | 40 | **合法**的讨论、科普或引用攻击的文本(安全文档、OWASP 参考资料、红蓝对抗经验、检测规则请求、事件摘要),EN + TR。这是过度拒绝的陷阱。 |
每个注入样本都带有 `category` 字段,底层的语料库会将每个类别映射到 OWASP LLM Top 10
和 MITRE ATLAS 技术。
## 📊 指标
| 指标 | 定义 | 良好 |
|--------|------------|:----:|
| `miss_rate` (漏报率) | 放行的注入数 / 总注入数 | ↓ |
| `injection_recall` (注入召回率) | 1 − miss_rate | ↑ |
| `over_refusal_rate` (过度拒绝率) | 被拦截的良性样本 / 总良性样本 | ↓ |
| `benign_specificity` (良性特异性) | 1 − over_refusal_rate | ↑ |
| `f1` | 精确率和召回率的调和平均数 (视攻击为正例) | ↑ |
所有指标均支持**整体、按语言 (en/tr) 以及按良性样本类别**进行报告。
## ➕ 将你的护栏添加到排行榜
1. 实现 `guard(text) -> 0|1`(或批量处理版本)。
2. 将其添加到 `run_baselines.py` 的 `GUARDS` 中,运行它,并提交更新后的 `results.json` 和
`LEADERBOARD.md`。
3. 发起 PR。我们欢迎针对 Llama Guard、Prompt Guard、Lakera、Rebuff、NeMo Guardrails、
OpenAI moderation 的封装,或是你自己的模型 —— 核心诉求在于进行一场**同等条件下的、
双维度、多语种**的对比。
## 🎯 存在的意义
护栏供应商会发布攻击召回率数据;但几乎没人发布在安全相关流量上的过度拒绝率,
更没几个人会**用土耳其语**报告它。这个空白正是导致团队上线了那些悄悄破坏自身
安全和支持工作流的护栏的充分原因。guardrail-arena 提供了一种小型、开源、可复现的方式,
让你在部署前看清这种权衡的双方。
## ⚖️ 诚实声明与局限性
- **体量小,为便捷而生。** 337 个 prompt 只能算作一种探针,而非普查。数据量增加时,数据也会变动;
提交增加 prompt 的 PR(尤其是高难度的良性样本 + 新语种)是最具价值的贡献。
- **检测器存在训练集重叠**,涉及注入 + 普通良性样本(如上所述已披露)。
security-adjacent 列是它唯一完全留作对比的保留集。
- **二元拦截/放行。** 真实的护栏有阈值和严重性等级;这会将它们简化为
在其默认设置下的单一决策。如果调整后更公平,请在提交前调整你的模型。
- **并非安全保证。** 在这里获得好成绩并不意味着护栏在生产环境中是安全的。请将任何
护栏与沙箱、出口白名单以及最小权限工具结合使用。
## 🔗 相关的 AltaySec 项目
- 🕵️ [**uncloak**](https://github.com/fevziegeyurtsevenler/uncloak) —— 隐藏 / 不可见 Unicode 的 prompt injection 扫描器([在线演示](https://fevziegeyurtsevenler.github.io/uncloak/))
- 📏 [**prompt-injection-detection-rules**](https://github.com/fevziegeyurtsevenler/prompt-injection-detection-rules) —— `regex-rules` 基线所使用的 20 条正则表达式规则
- 🧪 [**prompt-injection-corpus**](https://github.com/fevziegeyurtsevenler/prompt-injection-corpus) —— 多语种注入数据来源
- 🤗 [**turkish-prompt-injection-detector**](https://huggingface.co/fevziegeyurtsevenler/turkish-prompt-injection-detector) —— `AltaySec-detector` 基线背后的模型
- 🌐 [AltaySec](https://altaysec.com.tr) · [Açık Kaynak Lab](https://altaysec.com.tr/acik-kaynak)
## 引用
```
@misc{yurtsevenler2026guardrailarena,
title = {guardrail-arena: A Two-Axis, Multilingual Benchmark for LLM Guardrails},
author = {Yurtsevenler, Fevzi Ege},
year = {2026},
publisher = {AltaySec},
howpublished = {\url{https://github.com/fevziegeyurtsevenler/guardrail-arena}}
}
```
Apache-2.0 · 由 **[AltaySec](https://altaysec.com.tr)** 构建 —— 土耳其语优先的 AI/LLM 安全项目。
标签:DLL 劫持, 凭据扫描, 大语言模型, 护栏, 系统调用监控, 评估指标, 逆向工具