facebookresearch/SecAlign

GitHub: facebookresearch/SecAlign

基于偏好优化的 LLM 提示注入防御方法,可将各类攻击成功率降至接近零并保持模型效用。

Stars: 87 | Forks: 8

# SecAlign:利用偏好优化防御提示注入 [Sizhe Chen](https://sizhe-chen.github.io), [Arman Zharmagambetov](https://arman-z.github.io), [Saeed Mahloujifar](https://smahloujifar.github.io), [Kamalika Chaudhuri](https://cseweb.ucsd.edu/~kamalika), [David Wagner](https://people.eecs.berkeley.edu/~daw), [Chuan Guo](https://sites.google.com/view/chuanguo) [![](https://img.shields.io/badge/CCS'25-a8c66c)](https://arxiv.org/pdf/2410.05451) [![](https://img.shields.io/badge/Website-097770)](https://sizhe-chen.github.io/SecAlign-Website) [![](https://img.shields.io/badge/Poster-1b6535)](https://drive.google.com/file/d/1-HFnET2azKniaS4k5dvgVwoRLa4Eg584/view?usp=sharing) [![](https://img.shields.io/badge/Talk-edca82)](https://docs.google.com/document/d/1pip5y_HGU4qjN0K6NEFuI379RPdL9T6o/edit?usp=sharing) [![](https://img.shields.io/badge/Slides-f47a60)](https://drive.google.com/file/d/1baUbgFMILhPWBeGrm67XXy_H-jO7raRa/view?usp=sharing) 大型语言模型(LLM)在现代软件系统中正变得日益普及,作为用户与互联网之间的接口,协助处理需要高级语言理解的任务。为了完成这些任务,LLM 通常使用外部数据源,例如用户文档、网络检索结果、API 调用结果等。这为攻击者通过提示注入操纵 LLM 开辟了新途径。对抗性提示可以被注入到外部数据源中,以覆盖系统的预期指令,转而执行恶意指令。为了缓解这一漏洞,我们提出了一种名为 SecAlign 的新防御方法,该方法基于偏好优化技术。我们的防御首先构建了一个偏好数据集,其中包含提示注入的输入、安全输出(响应合法指令的输出)和不安全输出(响应注入指令的输出)。然后,我们对该数据集执行偏好优化,教导 LLM 优先选择安全输出而非不安全输出。这是已知的首种能将各种提示注入成功率降至约 0% 的方法,即使面对比训练期间见过的攻击复杂得多的攻击也是如此。这表明我们的防御能很好地泛化以应对未知和未来的攻击。此外,经过防御的模型仍然具有实用性,其效用与防御训练前相似。 SecAlign 概述 | SecAlign 主要结果 :-------------------------:|:-------------------------: ![SecAlign 概述](https://static.pigsec.cn/wp-content/uploads/repos/2026/02/feb8ddffe7203814.png) | ![SecAlign 主要结果](https://static.pigsec.cn/wp-content/uploads/repos/2026/02/712be115c9203815.png) # 环境 + 训练 SecAlign / [StruQ](https://github.com/Sizhe-Chen/StruQ) LLM 需要 4 块 80G A100。测试效用和手动攻击需要 1 块 16G GPU。测试 [GCG](https://github.com/llm-attacks/llm-attacks) 需要 1 块 80G A100。测试 [AdvPrompter](https://github.com/facebookresearch/advprompter) 需要 2 块 80G A100。 + 安装环境依赖 + 安装包依赖 + 下载数据依赖 + 配置用于效用评估的 openai 依赖:参照 ```data/openai_configs_examle.yaml``` 创建 ```data/openai_configs.yaml``` + [可选] 体验 SecAlign Instruct 模型。运行 ```python setup.py --instruct``` 以下载 SecAlign Instruct LoRA 适配器(0.2G)。 + [可选] 体验 SecAlign Alpaca 模型。运行 ```python setup.py --alpaca``` 以下载经过 SFT(基于 [alpaca_data_cleaned.json](https://raw.githubusercontent.com/gururise/AlpacaDataCleaned/refs/heads/main/alpaca_data_cleaned.json))的 Llama-7B(26G)、Mistral-7B(27G)、Llama3-8B(30G)以及相应的 SecAlign LoRA 适配器(0.4G)。 + [可选] 通过在 ```run.py``` 的 ```slurm_prefix``` 变量中指定您的训练/测试 slurm 配置,实现自动高效的测试。这将生成 slurm 脚本,运行它们,然后删除它们。它支持通过 ```nohup``` 额外开启一个线程来监控训练,并在训练结束后如果指定了 ```--do_test``` 则自动进行测试。 # SecAlign 偏好优化 + 获取 slurm 和 python 命令,并自行运行。下方的 ```[model_path]``` 代表 huggingface Instruct 模型 ID(目前支持 ```mistralai/Mistral-7B-v0.1-Instruct``` 和 ```meta-llama/Meta-Llama-3-8B-Instruct```)或您本地 SFT 过(见下一节)的模型路径。 + 运行训练,并在训练结束后立即在多块 GPU 上同时进行测试,使用默认的 ```--test_attack none ignore completion_real completion_realcmb gcg advp```(```none``` 用于效用测试) + 要调整学习率,请更改 ```run.py``` 中 LR_CONFIG 里的 dpo_lr。 # SFT(监督微调) + SecAlign 基于 SFT 过的模型开始。如果您不想使用公开的 SFT 模型(如上一节所示),您可以从基础模型开始 SFT 您自己的模型。 + 以下命令在 [alpaca_data_cleaned.json](https://raw.githubusercontent.com/gururise/AlpacaDataCleaned/refs/heads/main/alpaca_data_cleaned.json) 上进行 SFT。```[model_path]``` 代表 huggingface 模型 ID(目前支持 ```huggyllama/llama-7b```、```mistralai/Mistral-7B-v0.1``` 和 ```meta-llama/Meta-Llama-3-8B```)。 + 我们也支持通过防御性 SFT 复现之前的 SOTA 防御 StruQ + 要调整学习率,请更改 ```run.py``` 中 LR_CONFIG 里的 lr。 # 测试 + 如果您使用 ```bash [script_path] [model_path] run```,所有关于训练、效用评估和安全评估的日志都会保存到 ```[model_path]/summary.tsv``` + 默认设置为 ```--test_attack none ignore completion_real completion_realcmb gcg advp```(```none``` 用于效用测试) + 自定义 ```--test_attack```、基于提示的 ```--defense``` 和测试用的 ```--data_path```。```--defense``` 可以是 ['none', 'sandwich', 'instructional', 'reminder', 'isolation', 'incontext'],```--test_attack``` 可以是 ['naive', 'ignore', 'completion_real', 'completion_realcmb', 'gcg', 'advp'] + 这会触发以下多个命令。 + 将 GCG 和 AdvPrompter 测试结果记录到 ```[model_path]/summary.tsv```。为了支持这种自动记录,AdvPrompter 必须通过 ```bash``` 或 ```python run.py``` 运行,这会在 ```[model_path]``` 中生成一个 ```advp_jobID.out``` 文件。 # 代码致谢 SecAlign 的大部分内容以及包含的 [StruQ](https://github.com/Sizhe-Chen/StruQ) 和 [AdvPrompter](https://github.com/facebookresearch/advprompter) 均采用 CC-BY-NC 许可,但项目的部分内容适用单独的许可条款:[Stanford Alpaca](https://github.com/tatsu-lab/stanford_alpaca) 采用 Apache 2.0 许可;[LLM Attacks](https://github.com/llm-attacks/llm-attacks) 采用 MIT 许可。`gcg/` 下的代码改编自 [LLM Attacks](https://github.com/llm-attacks/llm-attacks)。`advprompter/` 下的代码改编自 [AdvPrompter](https://github.com/facebookresearch/advprompter)。本软件和/或数据于 2025 年存入 BAIR 开放研究知识库。
标签:AI红队测试, CI/CD 安全, DLL 劫持, DNS 解析, Git 安全, IaC 扫描, Kubernetes 安全, LLM安全, Trivy, 凭据扫描, 凭证嗅探, 域名收集, 基线管理, 大语言模型, 密钥泄露防护, 对抗攻击, 指令劫持, 提示注入防御, 敏感信息检测, 数据投毒防御, 机器学习安全, 模型鲁棒性, 源代码安全, 系统提示安全, 逆向工具, 配置审计