Ayowhane-commit/context-aware-prompt-injection-detection
GitHub: Ayowhane-commit/context-aware-prompt-injection-detection
一项受控网络安全研究实验,验证对话历史上下文分析相比静态 Prompt 检测在识别多轮 Prompt Injection 攻击方面的显著优势。
Stars: 0 | Forks: 0
# 多轮 Prompt Injection 攻击的上下文感知检测
**毕业设计研究项目:** *大语言模型应用中多轮 Prompt Injection 攻击的上下文感知检测框架设计与评估*
本代码库包含最终的毕业设计实验包,旨在评估与仅分析静态最终 Prompt 的基线相比,对话历史记录分析是否能够提升对多轮 Prompt Injection 攻击的检测能力。
本项目被有意识地设定为一项**受控网络安全研究实验**。它并非作为可用于生产环境的 Prompt Injection 防火墙、通用的越狱(Jailbreak)防御机制或完整的现实世界基准测试而呈现。其目标是在可复现的实验设置下验证一项明确的研究主张。
## 研究问题
大语言模型(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
```
## 最终受控评估结果
### 整体性能
| 数据集划分 | 检测器 | 准确率 (Accuracy) | 精确率 (Precision) | 召回率 (Recall) | F1 | 误报率 (False Positive Rate) |
|---|---|---:|---:|---:|---:|---:|
| 盲测留出 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 基线。对于仅含良性样本的压力划分,应主要通过误报率来进行解读,而不是基于统计上的优越性。
## 主张边界
一项稳妥的毕业设计主张是:
**不要**主张:
- 该检测器已具备生产环境可用性;
- 该检测器能够阻止所有的 Prompt Injection 攻击;
- 该实验证明了可在现实世界中进行普遍的泛化;
- 外部的人工标注确认已经完成;
- 独立挑战验证集是第三方的现实世界基准测试。
## 外部人工标注状态
外部人工标注确认目前处于**待定**状态,并已被有意排除在此最终的毕业设计提交包之外。作为以发表为导向的扩展工作的一部分,人工标注的工作流程将在后续完成。
对于本次毕业设计提交,本项目应被解读为一项受控实验评估,具备高度可复现性、盲测验证、压力测试以及基线对比。
## 局限性
本项目存在以下重要的局限性:
1. 数据集属于受控的研究数据集,并非大规模的现实世界生产日志。
2. 检测器基于规则且具有可解释性,但可能无法对每一种未知的攻击表述实现泛化。
3. 人工标注确认尚处于待定状态,不应声称已经完成。
4. 独立挑战集旨在测试鲁棒性,但它并不是第三方的公开基准测试。
5. 生产环境的部署需要更广泛的测试、独立标注、监控以及持续的对抗性评估。
## 未来工作
未来的工作应包括:
- 完成独立的人工标注确认;
- 裁定审阅者之间的分歧;
- 在第三方或现实世界的数据集上进行评估;
- 多语言的 Prompt Injection 样本;
- 与基于 embedding 或机器学习的分类器进行对比;
- 混合基于规则的语义检测机制;
- 在检索增强生成(RAG)和 Agentic LLM 应用中进行部署测试。
## 最终毕业设计定位
本代码库作为一项可复现的网络安全研究实验,已准备好进行最终的毕业设计评审。其正确的定位是:
标签:NoSQL, 逆向工具