fevziegeyurtsevenler/guardrail-arena

GitHub: fevziegeyurtsevenler/guardrail-arena

一个双维度多语种的 LLM 护栏基准测试工具,同时衡量提示注入漏报率和安全相关文本的过度拒绝率。

Stars: 0 | Forks: 0

![guardrail-arena](https://static.pigsec.cn/wp-content/uploads/repos/cas/64/6442cb4640b2c0cda6c4376d0e65bb6dd1e5f05f78551e0459d1a1c17cf6a892.png) # 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](https://img.shields.io/badge/license-Apache--2.0-blue)](LICENSE) [![benchmark](https://img.shields.io/badge/benchmark-337%20prompts-red)](benchmark/data.jsonl) [![languages](https://img.shields.io/badge/languages-EN%20%2B%20TR-red)](benchmark/data.jsonl) [![HF dataset](https://img.shields.io/badge/🤗%20dataset-guardrail--arena-yellow)](https://huggingface.co/datasets/fevzieyurtsevenler/guardrail-arena) [![live results](https://img.shields.io/badge/live-results%20%26%20charts-red)](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 劫持, 凭据扫描, 大语言模型, 护栏, 系统调用监控, 评估指标, 逆向工具