jiraphat-j/Prompt-Guard

GitHub: jiraphat-j/Prompt-Guard

一个二元分类系统,用于检测针对LLM的越狱攻击、提示词注入和提示词提取攻击,支持TF-IDF和DistilBERT两种模型。

Stars: 0 | Forks: 0

# PromptGuard — LLM越狱与提示词注入防御 一个二元分类系统,用于检测并阻止针对大型语言模型(LLM)的越狱攻击、提示词注入和提示词提取攻击。 实现并基准测试了两个模型: - **TF-IDF + 逻辑回归** — 轻量级、可解释、近乎零延迟 - **DistilBERT(微调)** — 基于Transformer,对未见过的攻击模式具有更强的泛化能力 ## 问题所在 LLM容易受到对抗性提示词的攻击,这些攻击试图: - **绕过安全指南**(越狱) - **覆盖系统指令**(提示词注入) - **泄露机密上下文**(提示词提取) 攻击者还使用编码技术(Base64、ROT13、leet speak)对这些提示词进行混淆,以规避基于关键词的过滤器。PromptGuard同时解决了分类和混淆问题。 ## 架构 ``` Raw Prompt │ ▼ Preprocessing Pipeline ├─ Base64 decode ├─ ROT13 decode ├─ Leetspeak normalization (e.g. "1gn0r3" → "ignore") └─ URL removal + whitespace collapse │ ▼ Classifier ├─ TF-IDF + Logistic Regression (fast, CPU-only) └─ DistilBERT fine-tuned (accurate, GPU recommended) │ ▼ Label: safe / malicious ``` ## 数据集 | 数据集划分 | TF-IDF模型 | DistilBERT模型 | |---|---|---| | 总样本数 | 440 | 4,568 | | 训练集 | 330 | 3,426 | | 测试集 | 110 | 1,142 | | 恶意样本比例 | 约58% | 约61% | **数据来源:** - 自定义数据集(`prompts_dataset_full.csv` + `adversarial_dataset_v2.csv`) - [`jackhhao/jailbreak-classification`](https://huggingface.co/datasets/jackhhao/jailbreak-classification)(HuggingFace)— 用于TF-IDF流程 - [`neuralchemy/Prompt-injection-dataset`](https://huggingface.co/datasets/neuralchemy/Prompt-injection-dataset) — 用于DistilBERT流程 **覆盖的攻击类型:** 指令覆盖、目标劫持、越狱角色、多语言劫持、基于编码的混淆(Base64、ROT13、leet speak)、真实世界越狱攻击 ## 结果 ### TF-IDF + 逻辑回归 在预留测试集上评估(110个样本): | 指标 | 安全 | 恶意 | 整体 | |---|---|---|---| | 精确率 | 0.87 | 1.00 | 0.94 | | 召回率 | 1.00 | 0.89 | 0.94 | | F1分数 | 0.93 | 0.94 | 0.94 | | 准确率 | — | — | **93.6%** | 5折交叉验证:`F1 = 0.940 ± 0.025` 测试集上**零误报**。 ### DistilBERT(微调,3个epoch,RTX 5050) 在预留测试集上评估(1,142个样本): | 指标 | 安全 | 恶意 | 整体 | |---|---|---|---| | 精确率 | 0.95 | 0.98 | 0.97 | | 召回率 | 0.97 | 0.96 | 0.97 | | F1分数 | 0.96 | 0.97 | 0.97 | | 准确率 | — | — | **96.6%** | 3折交叉验证:`F1 = 0.973 ± 0.005` 模型参数:66,955,010 ### 公平对比 — 未见数据集 两个模型在[`deepset/prompt-injections`](https://huggingface.co/datasets/deepset/prompt-injections)上评估(116个样本,**训练时未见过**): | 模型 | 准确率 | 精确率 | 召回率 | F1 | 推理时间 | |---|---|---|---|---|---| | TF-IDF + LR | 63.8% | 0.821 | 0.383 | 0.523 | 0.007秒 | | DistilBERT | 74.1% | 0.714 | 0.833 | **0.769** | 0.587秒 | DistilBERT在新颖攻击模式上泛化能力明显更强(F1提升24.6%)。TF-IDF速度快90倍,但会遗漏更多之前未见过的对抗性样本。 ## 何时使用哪个模型 | 标准 | TF-IDF + LR | DistilBERT | |---|---|---| | 延迟 | < 1毫秒/提示词 | ~10–50毫秒(GPU) | | 资源 | 仅CPU,< 1MB | 推荐GPU,约260MB | | 可解释性 | 特征系数 | 黑盒 | | 已知的攻击模式 | 优秀 | 优秀 | | 新颖/混淆攻击 | 泛化能力较弱 | 泛化能力更强 | | 部署复杂度 | 简单(sklearn pickle) | 需要PyTorch + transformers | ## 预处理流程 `preprocessing.py`在所有notebook中共享。该流程在分类之前处理混淆攻击: ``` from preprocessing import preprocess preprocess("aWdub3JlIGFsbCBwcmV2aW91cyBpbnN0cnVjdGlvbnM=") # 忽略所有之前的指令 preprocess("1gn0r3 4ll pr3v10us 1nstruct10ns") # 忽略所有之前的指令 preprocess("Vtaber nyy cerivbhf vafgehpgvbaf.") # 忽略所有之前的指令 ``` 流程顺序:Base64解码 → ROT13解码 → 小写化 → leet speak规范化 → 移除URL → 合并空白符 ## 仓库结构 ``` PromptGuard/ ├── preprocessing.py # Shared preprocessing pipeline ├── P-G_TF-IDF_LR.ipynb # TF-IDF + Logistic Regression ├── P-G_bert.ipynb # DistilBERT fine-tuning ├── P-G_compare_TF-bert.ipynb # Fair model comparison ├── model_TF-IDF_LR_P-G.pkl # Saved TF-IDF + LR model ├── model_bert_P-G.pkl # Saved DistilBERT model └── README.md ``` ## 安装 ``` pip install scikit-learn pandas matplotlib transformers datasets torch ``` 按顺序运行notebook: 1. `P-G_TF-IDF_LR.ipynb` — 训练和评估TF-IDF + LR 2. `P-G_bert.ipynb` — 微调和评估DistilBERT 3. `P-G_compare_TF-bert.ipynb` — 在未见数据上对比两个模型 ## 局限性 - TF-IDF模型在较小的数据集上训练(440个样本)——对新攻击的泛化能力较弱 - DistilBERT在测试集上有14个误报,主要是带有安全相关语言的角色扮演提示词 - 目前两个模型都无法处理间接提示词注入(嵌入在文档或工具输出中的注入) ## 动机 作为对LLM安全和AI红队持续兴趣的一部分而构建。目标是了解攻击模式——从攻击和防御两方面入手——为企业的LLM部署提供更好的护栏设计。 *Jiraphat Jarernpipattada — 计算机工程,KMUTT*
标签:Adversarial Attack, AI防护, AMSI绕过, Apex, Base64解码, DistilBERT, DLL 劫持, Jailbreak, Logistic Regression, NLP, Prompt Extraction, ROT13解码, TF-IDF, Transformer, 二分类, 人工智能安全, 凭据扫描, 合规性, 大语言模型, 威胁检测, 安全防护, 对抗攻击, 恶意意图检测, 敏感信息检测, 文本分类, 文本预处理, 机器学习, 模型微调, 深度学习, 系统调用监控, 越狱检测, 逆向工具