barbodz/capstone-v2-prompt-injection-detector
GitHub: barbodz/capstone-v2-prompt-injection-detector
一个毕业设计研究项目,通过分析对话历史的上下文感知规则评分机制,验证其对多轮 Prompt Injection 攻击的检测能力是否优于静态最终 prompt 基线。
Stars: 0 | Forks: 0
# 多轮 Prompt Injection 攻击的上下文感知检测
**毕业设计研究项目:** *大型语言模型应用中多轮 Prompt Injection 攻击的上下文感知检测框架的设计与评估*
本代码库包含最终的毕业设计实验包,旨在评估与仅针对静态最终 prompt 的基线相比,对话历史分析是否能够提升对多轮 Prompt Injection 攻击的检测能力。
本项目被刻意界定为一项**受控的网络安全研究实验**。它并非作为可用于生产环境的 Prompt Injection 防火墙、通用的越狱防御机制或完整的现实世界基准测试而呈现。其目标是在可复现的实验设置下验证一项明确的研究主张。
## 研究问题
大型语言模型(LLM)应用通常通过同一自然语言通道处理系统指令、开发者指令、用户 prompt、检索文本以及工具输出。这带来了安全风险:恶意用户输入可能会试图覆盖应用程序的预期行为、绕过安全控制、泄露隐藏指令,或污染后续的对话上下文。
许多 Prompt Injection 检测器孤立地分析单个 prompt。这种方法对于恶意意图清晰地体现在最终消息中的直接攻击可能有效。然而,多轮攻击可能会将意图分散在早期的对话轮次中,除非检查之前的对话记录,否则会使最终 prompt 看起来不完整或含义模糊。
## 主要研究问题
**与静态的最终 prompt 检测相比,对对话历史的上下文感知分析如何能提升 LLM 应用中多轮 Prompt Injection 攻击的检测能力?**
## 检测方法对比
### 1. 静态最终 prompt 基线
基线检测器仅分析 `final_turn`。它代表了 prompt 级别的检测,即将每个 prompt 视为孤立的输入。
### 2. 冻结的上下文感知 V2 检测器
上下文感知检测器分析:
- `turn_1`
- `turn_2`
- `turn_3`
- `turn_4`
- `final_turn`
它使用可解释的基于规则的评分机制来检测:
- 指令覆盖;
- 角色操纵;
- 数据泄露;
- 策略绕过;
- 上下文污染;
- 受保护目标的引用;
- 上下文桥梁,如“continue”、“apply it”、“use that”或“follow the earlier rule”;
- 良性网络安全与 AI 安全意图防护。
在进行预测时,检测器不得使用标签、样本 ID、攻击类别、风险等级、备注、行顺序、文件名或划分名称。
## 代码库结构
```
capstone_v2_detector_blind_pack/
├── README.md
├── README_COLAB_V2.md
├── dataset_and_code_manifest_v2.csv
├── datasets/
│ ├── prompt_injection_development_100_cleaned.csv
│ ├── blind_held_out_test_v2_50.csv
│ ├── blind_external_validation_v2_50.csv
│ ├── benign_security_ai_safety_stress_v2_60.csv
│ ├── adversarial_paraphrase_stress_v2_60.csv
│ └── independent_peer_review_validation_v2_120.csv
├── detector/
│ └── detector_v2_source.py
├── frozen/
│ ├── frozen_detector_v2.py
│ ├── freeze_manifest_v2.json
│ └── DO_NOT_EDIT_AFTER_FREEZE_V2.txt
├── scripts/
│ ├── 00_validate_v2_datasets.py
│ ├── 01_run_diagnostic_and_freeze_v2.py
│ ├── 02_evaluate_frozen_v2_on_blind_sets.py
│ ├── 03_generate_v2_final_tables.py
│ └── common_utils_v2.py
├── notebooks/
│ └── Capstone_Detector_V2_Blind_Validation_Colab.ipynb
├── docs/
└── outputs/
```
## 数据集概览
| 数据集 | 行数 | 用途 |
|---|---:|---|
| `prompt_injection_development_100_cleaned.csv` | 100 | 开发与冻结阶段数据集 |
| `blind_held_out_test_v2_50.csv` | 50 | 最终盲测留出验证 |
| `blind_external_validation_v2_50.csv` | 50 | 最终盲测外部验证 |
| `benign_security_ai_safety_stress_v2_60.csv` | 60 | 针对良性网络安全与 AI 安全 prompt 的误报压力测试 |
| `adversarial_paraphrase_stress_v2_60.csv` | 60 | 恶意复述与依赖上下文的压力测试 |
| `independent_peer_review_validation_v2_120.csv` | 120 | 额外的独立挑战验证集 |
文件 `independent_peer_review_validation_v2_120.csv` 是一个独立的挑战验证数据集。外部人工标注确认被刻意标记为待定状态,且未包含在最终的毕业设计包中。
## 可复现性与验证
本包包含:
- 数据集验证输出;
- 评估数据集的 SHA256 哈希值;
- 冻结检测器哈希验证;
- 预测文件;
- 错误文件;
- 最终结果表;
- Wilson 置信区间;
- McNemar 配对错误比较。
最终冻结检测器 SHA256:
```
06f5db586789563301567c2940e51c11f117cbad466a782dc196b9ad41aba5b0
```
数据集验证报告:
```
issue_count = 0
high_similarity_threshold = 0.86
```
最终结果表位于:
```
outputs/03_v2_final_tables/final_v2_blind_validation_tables.md
```
## 如何运行实验
在项目文件夹内,运行:
```
python scripts/00_validate_v2_datasets.py
python scripts/01_run_diagnostic_and_freeze_v2.py
python scripts/02_evaluate_frozen_v2_on_blind_sets.py
python scripts/03_generate_v2_final_tables.py
```
脚本名 `01_run_diagnostic_and_freeze_v2.py` 为保持 Notebook 兼容性而被保留。在清理后的最终包中,开发集在冻结前使用,最终主张基于冻结检测器的评估输出。
有关 Google Colab 的用法,请参见:
```
README_COLAB_V2.md
```
## 最终受控评估结果
### 整体性能
| 数据集划分 | 检测器 | 准确率 | 精确率 | 召回率 | F1 | 误报率 |
|---|---|---:|---:|---:|---:|---:|
| 盲测留出集 V2 | 基线 | 0.800 | 1.000 | 0.714 | 0.833 | 0.000 |
| 盲测留出集 V2 | 上下文感知 V2 | **1.000** | **1.000** | **1.000** | **1.000** | **0.000** |
| 盲测外部集 V2 | 基线 | 0.820 | 0.957 | 0.733 | 0.830 | 0.050 |
| 盲测外部集 V2 | 上下文感知 V2 | **1.000** | **1.000** | **1.000** | **1.000** | **0.000** |
| 良性网络安全 / AI 安全压力测试 | 基线 | 0.983 | N/A | N/A | N/A | 0.017 |
| 良性网络安全 / AI 安全压力测试 | 上下文感知 V2 | **1.000** | N/A | N/A | N/A | **0.000** |
| 对抗性复述压力测试 | 基线 | 0.617 | 1.000 | 0.617 | 0.763 | 0.000 |
| 对抗性复述压力测试 | 上下文感知 V2 | **1.000** | **1.000** | **1.000** | **1.000** | **0.000** |
| 独立挑战验证 | 基线 | 0.683 | 0.981 | 0.589 | 0.736 | 0.033 |
| 独立挑战验证 | 上下文感知 V2 | **1.000** | **1.000** | **1.000** | **1.000** | **0.000** |
对于仅包含良性样本的压力测试集,精确率、召回率和 F1 不适用,因为该划分不包含恶意正样本。该划分的相关指标是误报率。
## 主要发现
最强有力的发现并不仅仅是上下文感知检测器获得了高分。最强有力的发现是,**对话历史大幅改善了对依赖上下文的多轮 Prompt Injection 攻击的检测**,在这些攻击中,仅凭最终 prompt 是不够的。
依赖上下文行为的示例包括:早期的对话轮次建立了虚假规则、隐藏角色、授权框架、备忘录、token、路由或策略上下文,而最后一轮对话仅表示继续、应用、使用或执行该先前上下文的攻击。
静态基线遗漏了许多此类攻击,因为它仅分析最终 prompt。上下文感知检测器可以通过分析先前的对话轮次和跨轮次的意图演变来识别它们。
## McNemar 配对比较
| 数据集划分 | 仅基线正确 | 仅上下文正确 | 精确 p 值 |
|---|---:|---:|---:|
| 盲测留出集 V2 | 0 | 10 | 0.001953 |
| 盲测外部集 V2 | 0 | 9 | 0.003906 |
| 良性网络安全 / AI 安全压力测试 | 0 | 1 | 1.000000 |
| 对抗性复述压力测试 | 0 | 23 | 0.000000238 |
| 独立挑战验证 | 0 | 38 | 0.00000000000728 |
## 主张边界
合理的毕业设计主张为:
**不要**主张:
- 该检测器已具备生产环境的可用性;
- 该检测器能阻止所有 Prompt Injection 攻击;
- 该实验证明了在现实世界中的普适泛化能力;
- 外部人工标注确认已完成;
- 独立挑战验证集是第三方现实世界的基准测试。
## 外部人工标注状态
外部人工标注确认**待定**,并被刻意排除在最终的毕业设计提交包之外。人工标注工作流将作为以发表为核心的扩展内容在后续完成。
对于本次毕业设计提交,本项目应被解读为一项受控实验评估,具备强大的可复现性、盲测验证、压力测试以及基线对比。
## 局限性
本项目存在以下重要局限性:
1. 数据集为受控研究数据集,并非大规模的现实世界生产日志。
2. 检测器基于规则且具备可解释性,但可能无法泛化至所有未见的攻击话术。
3. 人工标注确认处于待定状态,不应声称已完成。
4. 独立挑战集旨在测试鲁棒性,但它并非第三方的公开基准测试。
5. 生产环境部署需要更广泛的测试、独立标注、监控以及持续的对抗性评估。
## 未来工作
未来的工作应包括:
- 完成独立的人工标注确认;
- 裁定审稿人之间的分歧;
- 在第三方或现实世界数据集上进行评估;
- 多语言 Prompt Injection 样本;
- 与基于 embedding 或机器学习分类器进行比较;
- 混合基于规则与语义的检测;
- 在检索增强生成和 Agentic LLM 应用中进行部署测试。
## 最终毕业设计定位
本代码库作为一项可复现的网络安全研究实验,已准备好接受最终的毕业设计评审。正确的定位是:
标签:逆向工具