3nesdeniz/llm-security-testbench
GitHub: 3nesdeniz/llm-security-testbench
面向 prompt 注入检测器和 LLM 防护栏的可复现评估框架,通过配对感知的混淆矩阵和切片分析同时衡量攻击拦截能力与误报影响。
Stars: 0 | Forks: 0
# LLM 安全测试台
[](https://github.com/3nesdeniz/llm-security-testbench/actions/workflows/ci.yml)
[](https://github.com/3nesdeniz/llm-security-testbench/releases/tag/v0.1.0)
[](https://www.python.org/)
[](LICENSE)
**用于 prompt 注入检测器和 LLM 防护栏的可复现、配对感知评估。**
LLM 安全测试台同时衡量两项要求:防御机制是否能检测到攻击,以及是否不会干扰合法的用户请求。它会生成混淆矩阵、假阳性率和假阴性率、按家族划分的切片,以及针对共享相似语言的良性和恶意请求的严格配对评分。
首个支持的语料库是开放的开源 [土耳其语对话 Prompt 注入数据集](https://huggingface.co/datasets/3nesdeniz/turkish-conversation-prompt-injection)。
引擎本身与数据集和检测器无关。
## 存在的意义
仅针对攻击的评估会鼓励系统进行过于激进的拦截。检测器可以报告高攻击召回率,但同时会干扰普通用户、安全团队和 agent 工作流。这不是一个生产就绪的管控措施。
该测试台让运营权衡保持透明可见:
- TP、FP、TN 和 FN 会一同报告;
- 攻击召回率绝不会脱离假阳性率和特异性单独出现;
- 匹配的良性和攻击对会获得单独的全有或全无评分;
- 结果按攻击家族、来源上下文、类别和数据集划分进行切片;
- 报告包含行 ID 和指标,但默认省略原始 prompt 文本。
## 功能特性
- 从磁盘或直接从 Hugging Face 加载 JSONL 数据集。
- 验证 ID、标签、重复文本、数据集划分隔离性和配对完整性。
- 评估预计算的预测结果、Python 可调用对象或 JSON HTTP 端点。
- 接受二分类标签、攻击概率或两者兼有。
- 并发运行 HTTP 和 Python 预测器。
- 导出机器可读的 JSON、审阅者友好的 Markdown 以及行级别的 JSONL。
- 导出完整的 Promptfoo 测试以及现成的 HTTP provider。
- 缓存远程数据集并固定明确的 Hugging Face 版本。
## 安装说明
需要 Python 3.10 或更高版本。运行时包没有第三方依赖项。
```
git clone https://github.com/3nesdeniz/llm-security-testbench.git
cd llm-security-testbench
uv sync --dev
uv run llmst --version
```
## 验证数据集
直接从 Hugging Face 验证每个已发布的数据集划分:
```
uv run llmst validate \
--dataset hf://3nesdeniz/turkish-conversation-prompt-injection \
--split all
```
本地数据集目录可以包含 `data/train.jsonl`、`data/validation.jsonl` 和 `data/test.jsonl`,或者包含位于目录根目录下的相同文件。
## 评估离线预测
预测文件每行使用一个 JSON 对象:
```
{"id":"tcpi_p0129_a","prediction":"attack","score":0.93}
{"id":"tcpi_p0129_b","prediction":"benign","score":0.08}
```
`prediction` 接受 `attack`/`benign`、`unsafe`/`safe`、布尔值或 `1`/`0`。
`score` 是可选的,表示介于 `0` 和 `1` 之间的攻击概率。
```
uv run llmst evaluate \
--dataset hf://3nesdeniz/turkish-conversation-prompt-injection \
--split test \
--predictions predictions.jsonl \
--output-dir reports/offline-run
```
默认情况下,缺失的预测会导致运行失败。仅当部分覆盖是有意为之时才使用 `--allow-missing`;报告将显示被排除的 ID 和覆盖率。
## 评估 Python 检测器
暴露一个接受完整数据集行作为字典的函数:
```
def predict(example):
result = detector.classify(example["text"])
return {
"label": result.label,
"score": result.attack_probability,
}
```
然后运行:
```
uv run llmst evaluate \
--dataset hf://3nesdeniz/turkish-conversation-prompt-injection \
--split test \
--python path/to/detector.py:predict \
--max-workers 4 \
--output-dir reports/python-run
```
## 评估 HTTP 防护栏
默认的请求契约是:
```
{
"text": "input to classify",
"id": "stable-row-id",
"metadata": {
"category": "benign_boundary",
"attack_family": "none",
"source_context": "direct_user",
"pair_id": "pair_0084",
"split": "test"
}
}
```
默认的响应契约接受标签、分数或两者兼有:
```
{"label":"benign","score":0.14}
```
```
export GUARDRAIL_TOKEN='replace-me'
uv run llmst evaluate \
--dataset hf://3nesdeniz/turkish-conversation-prompt-injection \
--split test \
--http https://guardrail.example/v1/classify \
--http-token-env GUARDRAIL_TOKEN \
--max-workers 8 \
--output-dir reports/http-run
```
嵌套响应可通过 `--http-label-field result.label` 和 `--http-score-field result.score` 支持。有关重试、标头和标签规范化的详细信息,请参阅[端点契约](docs/endpoint-contract.md)。
## 报告
每次完成的运行都会写入:
| 文件 | 用途 |
| --- | --- |
| `report.json` | 完整的机器可读指标、切片、运行元数据和错误 |
| `report.md` | 包含混淆矩阵、配对和家族表格的人工审阅报告 |
| `predictions.jsonl` | 行 ID、真实值、预测结果、分数、切片元数据和延迟 |
故意排除了原始 prompt 文本。这使得报告在通过 CI、工单系统和审阅系统流转时更加安全。源数据集仍然是检查单个示例的权威来源。
## Promptfoo 集成
将选定的数据集划分导出为带有确定性 `equals` 断言的 Promptfoo 测试:
```
uv run llmst export-promptfoo \
--dataset hf://3nesdeniz/turkish-conversation-prompt-injection \
--split test \
--output-dir integrations/promptfoo
cd integrations/promptfoo
export TESTBENCH_ENDPOINT=https://guardrail.example/v1/classify
npx promptfoo@latest eval -c promptfooconfig.yaml
npx promptfoo@latest view
```
导出内容包括 `promptfooconfig.yaml`、`tests.json`、一个 Python HTTP provider 以及运行说明。有关 Promptfoo 的应用层评估与本包的检测器指标之间的确切界限,请参阅 [Promptfoo 集成](docs/promptfoo.md)。
## 指标
报告包括:
- 混淆计数:TP、FP、TN、FN;
- 准确率和平衡准确率;
- 精确率、攻击召回率、特异性和 F1;
- 假阳性率和假阴性率;
- 当每个评估行都包含攻击分数时的 ROC AUC;
- 预测器平均延迟;
- 配对准确率,要求攻击和匹配的合法请求必须同时预测正确;
- 按家族、类别、来源上下文和数据集划分的切片。
指标定义和分母为零时的行为记录在 [docs/metrics.md](docs/metrics.md) 中。
## 数据集契约
仅需要 `id`、`text` 和 `label`。以下可选字段可实现更丰富的切片和配对分析:
| 字段 | 用途 |
| --- | --- |
| `category` | 数据集组合切片 |
| `attack_family` | 正样本行的攻击分类体系 |
| `source_context` | 直接用户输入、检索到的文档、工具输出、内存等上下文 |
| `pair_id` | 将一个攻击与一个合法的边界情况进行关联 |
| `source_type` | 来源元数据 |
| `split` | 训练集、验证集、测试集或自定义的划分名称 |
未知字段将被保留并传递给 Python 预测器。
## 安全性和解释边界
- 这是一个评估工具,而不是生产环境的防护栏。
- 成功运行并不能证明可以防御未见过的或自适应的攻击。
- 合成的测试分布无法估计现实世界的攻击普遍程度。
- 分数被解释为攻击概率;反向评分的 API 需要适配器。
- 数据集的许可和隐私仍由数据集发布者和用户负责。
- 仅测试您拥有或被明确授权评估的系统。
有关漏洞报告,请参阅 [SECURITY.md](SECURITY.md)。
## 土耳其语摘要
LLM Security Testbench, prompt injection savunmalarını yalnızca yakalanan saldırılar
üzerinden değerlendirmez. Meşru kullanıcı taleplerindeki yanlış alarmları, eşleştirilmiş
güvenli/saldırı çiftlerini ve saldırı ailesi bazındaki sonuçları aynı raporda gösterir.
İlk desteklenen veri seti Türkçe Conversation Prompt-Injection Dataset'tir; araç farklı
JSONL veri setleri ve detector API'leriyle de çalışır.
## 引用
如果本软件对已发表的工作有帮助,请引用 [CITATION.cff](CITATION.cff) 以及用于该运行的数据集。数据集结果应始终包含确切的版本、划分、阈值和预测器配置。
## 许可证
代码采用 [Apache License 2.0](LICENSE) 授权。数据集许可证相互独立;土耳其语对话 Prompt 注入数据集采用 CC BY 4.0 发布。
由 [AltaySec](https://altaysec.com.tr/) 联合创始人 [Enes Deniz](https://github.com/3nesdeniz) 维护。
标签:DLL 劫持, LLM护栏, Python, 反取证, 大语言模型, 安全评估, 无后门, 测试工具, 逆向工具