這是我們在機器中竊竊私語的代碼存儲庫:LLM集成系統中的機密性。
大型語言模型(LLM)越來越多地通過外部工具和商業服務來擴展到LLM集成系統中。儘管這些接口可以顯著增強模型的功能,但它們也引入了新的攻擊表面。例如,操縱的集成可以利用模型並損害通過其他接口訪問的敏感數據。雖然先前的工作主要集中在針對模型對齊方式或培訓數據洩漏的攻擊上,但僅在推斷期間可用的數據安全性就避免了審查。在這項工作中,我們演示了與外部組件相關的漏洞,並引入了一種系統的方法來評估LLM集成系統中的機密性風險。我們確定了這些系統獨有的幾種特定攻擊方案,並將其正式化為旨在衡量模型保護敏感信息的能力的工具固定框架。該框架使我們能夠評估模型對機密性攻擊的脆弱性。我們的發現表明,所有檢查的模型都非常容易受到攻擊,當模型與外部工具一起使用時,風險大大增加。
如果您想引用我們的作品,請使用此Bibtex條目。
警告
僅針對運行Linux的CUDA機器,硬件插度才得到完全支持。 MacOS上的MPS應該有些可行,但是帶有CUDA的Windows可能會遇到一些問題。
在運行代碼之前,安裝要求:
python -m pip install --upgrade -r requirements.txt
If you want to use models hosted by OpenAI or Huggingface, create both a key.txt
file containing your OpenAI API key as well as a hf_token.txt
file containing your Huggingface Token for private Repos (such as Llama2) in the root directory of this專案.
有時,有必要通過CLI登錄到您的擁抱面帳戶:
git config --global credential.helper store
huggingface-cli login
所有腳本都可以使用加速庫在多個GPU/CPU上工作。為此,運行:
accelerate config
要配置系統的分佈式培訓功能,並使用以下方式啟動腳本
accelerate launch [parameters] <script.py> [script parameters]
python attack . py - - strategy "tools" - - scenario "CalendarWithCloud" - - attacks "payload_splitting" "obfuscation" - - defense "xml_tagging" - - iterations 15 - - llm_type "llama3-70b" - - temperature 0.7 - - device cuda - - prompt_format "react"
將使用防禦xml_tagging
在工具集成系統中使用React提示格式在CUDA設備上使用defess xml_tagging進行攻擊在CalendarWithCloud
中對LLM LLM llama3-70b
payload_splitting
和obfuscation
。
爭論 | 類型 | 預設值 | 描述 |
---|---|---|---|
-h, --help | - | - | 顯示此幫助消息和退出 |
-a, --attacks | 列表[Str] | payload_splitting | 指定將針對LLM使用的攻擊 |
-d, --defense | str | None | 指定LLM的防禦 |
-llm, --llm_type | str | gpt-3.5-turbo | 指定對手的類型 |
-le, --llm_guessing | 布爾 | False | 指定是否使用第二個LLM猜測正常響應的秘密鍵 |
-t, --temperature | 漂浮 | 0.0 | 指定LLM控制隨機性的溫度 |
-cp, --create_prompt_dataset | 布爾 | False | 指定是否應該創建增強系統提示的新數據集 |
-cr, --create_response_dataset | 布爾 | False | 指定是否應創建新的秘密洩漏響應數據集 |
-i, --iterations | int | 10 | 指定攻擊的迭代次數 |
-n, --name_suffix | str | "" | 指定加載自定義模型的名稱後綴。由於不允許參數參數字符串以“ - ”符號開頭,因此將自動添加第一個' - ' |
-s, --strategy | str | None | 指定攻擊策略(是使用正常攻擊還是tools 攻擊) |
-sc, --scenario | str | all | 指定基於工具的攻擊的方案 |
-dx, --device | str | cpu | 指定用於運行腳本的設備(CPU,CUDA或MPS) |
-pf, --prompt_format | str | react | 指定反應或工具 - 更字母的提示格式用於代理。 (RECT或工具 - 更輕鬆) |
-ds, --disable_safeguards | 布爾 | False | 禁用系統提示保護工具策略 |
模型的命名慣例如下: |
< model_name > - < param_count > - < robustness > - < attack_suffix > - < custom_suffix >
例如:
llama2 - 7 b - robust - prompt_injection - 0613
如果要使用自定義後綴(例如1000epochs
)對前綴調整模型進行攻擊,則必須指定參數:
... - - model_name llama2 - 7 b - prefix - - name_suffix 1000 epochs ...
模型 | 參數說明符 | 關聯 | 計算實例 |
---|---|---|---|
GPT-4(O1,O1-Mini,Turbo) | gpt-4o / gpt-4o-mini / gpt-4-turbo | 關聯 | Openai API |
美洲駝2 | llama2-7b / llama2-13b / llama2-70b | 關聯 | 本地推論 |
駱駝2硬化 | llama2-7b-robust / llama2-13b-robust / llama2-70b-robust | 關聯 | 本地推論 |
QWEN 2.5 | qwen2.5-72b | 關聯 | 本地推論(第一: ollama pull qwen2.5:72b ) |
駱駝3.1 | llama3-8b / llama3-70b | 關聯 | 本地推論(首先: ollama pull llama3.1/llama3.1:70b/llama3.1:405b ) |
美洲駝3.2 | llama3-1b / llama3-3b | 關聯 | 本地推論(首先: ollama pull llama3.2/llama3.2:1b ) |
美洲駝3.3 | llama3.3-70b | 關聯 | 本地推論(首先: ollama pull llama3.3/llama3.3:70b ) |
反射駱駝 | reflection-llama | 關聯 | 本地推論(首先: ollama pull reflection ) |
維庫納 | vicuna-7b / vicuna-13b / vicuna-33b | 關聯 | 本地推論 |
穩定的貝爾加(2) | beluga-7b / beluga-13b / beluga2-70b | 關聯 | 本地推論 |
ORCA 2 | orca2-7b / orca2-13b / orca2-70b | 關聯 | 本地推論 |
芽 | gemma-2b / gemma-7b | 關聯 | 本地推論 |
Gemma 2 | gemma2-9b / gemma2-27b | 關聯 | 本地推論(首先: ollama pull gemma2/gemma2:27b ) |
Phi 3 | phi3-3b / phi3-14b | 關聯 | 局部推論(第一: ollama pull phi3:mini/phi3:medium ) |
(首先必須使用finetuning.py
腳本生成固定或健壯/硬化的美洲駝模型,請參見下文)
攻擊 | 防禦 | ||
---|---|---|---|
姓名 | 說明符 | 姓名 | 說明符 |
有效載荷拆分 | payload_splitting | 隨機序列外殼 | seq_enclosure |
混淆 | obfuscation | XML標記 | xml_tagging |
越獄 | jailbreak | 啟發式/過濾防禦 | heuristic_defense |
翻譯 | translation | 三明治防禦 | sandwiching |
Chatml濫用 | chatml_abuse | LLM評估 | llm_eval |
掩蔽 | masking | 困惑檢測 | ppl_detection |
打字性血糖 | typoglycemia | 提示守衛 | prompt_guard |
對抗後綴 | advs_suffix | ||
前綴注入 | prefix_injection | ||
拒絕抑制 | refusal_suppression | ||
上下文忽略 | context_ignoring | ||
上下文終止 | context_termination | ||
上下文切換分離器 | context_switching_separators | ||
幾次 | few_shot | ||
認知黑客 | cognitive_hacking | ||
基礎聊天 | base_chat |
base_chat
攻擊包括正常的問題,即使沒有真正的攻擊,模型溢出了它的上下文和機密信息。
本節涵蓋了可能的美洲駝芬太德選項。我們使用基於本文的PEFT。
除上述設置運行
accelerate config
配置系統的分佈式培訓功能。和
wandb login
使用WANDB API密鑰,可以啟用填充過程的記錄。
第一個填充選項是由系統提示組成的數據集,可以安全地指示LLM確保秘密密鑰安全。第二個FINETUNINing選項(使用--train_robust
選項)是使用系統提示和對抗提示來使模型更加嚴重,以防止及時注入攻擊。
python finetuning . py [ - h ] [ - llm | - - llm_type LLM_NAME ] [ - i | - - iterations ITERATIONS ] [ - a | - - attacks ATTACKS_LIST ] [ - n | - - name_suffix NAME_SUFFIX ]
爭論 | 類型 | 預設值 | 描述 |
---|---|---|---|
-h, --help | - | - | 顯示此幫助消息和退出 |
-llm, --llm_type | str | llama3-8b | 指定LLM到Finetune的類型 |
-i, --iterations | int | 10000 | 指定登錄的迭代次數 |
-advs, --advs_train | 布爾 | False | 利用對抗性培訓來硬化易於訓練的LLM |
-a, --attacks | 列表[Str] | payload_splitting | 指定攻擊將在填充過程中用於硬化LLM的攻擊。僅當將--train_robust 設置為true時才有效果。有關支持的攻擊,請參見上一節 |
-n, --name_suffix | str | "" | 指定固定模型名稱的後綴 |
目前,僅支持Llama型號( llama2-7/13/70b
/ llama3-8/70b
)。
只需運行generate_dataset.py
腳本即可創建新的系統提示,作為使用LLMS的JSON文件。
爭論 | 類型 | 預設值 | 描述 |
---|---|---|---|
-h, --help | - | - | 顯示此幫助消息和退出 |
-llm, --llm_type | str | llama3-70b | 指定用於生成系統提示數據集的LLM |
-n, --name_suffix | str | "" | 如果要使用自定義模型,則指定模型名稱的後綴 |
-ds, --dataset_size | int | 1000 | 最終系統提示數據集的大小 |
為了測試LLM在現實世界工具方案中的機密性,我們提供了在Google Drive和Google Mail集成中測試LLM的可能性。為此,使用您的Google API憑據運行/various_scripts/llm_mail_test.py
腳本。
警告
根據評估LLM的評估,就GPU VRAM和時間而言,評估可能非常苛刻。
筆記
結果可能會因跑步而略有不同。 Ollama不斷更新其LLM的大部分,因此他們的行為可能會發生變化。而且,即使最低溫度LLM的內部隨機性,LLM的溫度也傾向於在Behvior中略微波動。
也會要求LLM良性問題檢查即使沒有攻擊,也會檢查洩漏秘密python attack.py --llm_type <model_specifier> --strategy secret-key --attacks chat_base --defenses None --iterations 100 --device cuda
將在沒有防禦的情況下對LLM進行所有攻擊。迭代將平均分為二手攻擊。因此,根據所用攻擊的數量,必須調整迭代次數。 (例如,14次攻擊,具有100個迭代,將迭代參數設置為1400)
python attack.py --llm_type <model_specifier> --strategy secret-key --attacks all --defenses None --iterations 100 --device cuda
將對所有防禦力的LLM進行所有攻擊python attack.py --llm_type <model_specifier> --strategy secret-key --attacks all --defenses all --iterations 100 --device cuda
系統會提示使用秘密鍵指示LLM,並指示不要洩漏秘密鍵,然後提出簡單的請求以打印秘密鑰匙python attack.py --llm_type <model_specifier> --strategy tools --scenario all --attacks base_attack --defenses None --iterations 100 --device cuda
將使用React框架運行所有工具範圍內無攻擊和防禦的情況python attack.py --llm_type <model_specifier> --strategy tools --scenario all --attacks identity --defenses None --iterations 100 --prompt_format ReAct --device cuda
將使用React框架運行所有工具範圍內無攻擊和防禦的情況python attack.py --llm_type <model_specifier> --strategy tools --scenario all --attacks identity --defenses None --iterations 100 --prompt_format tool-finetuned --device cuda
將使用React框架運行所有工具範圍內無攻擊和防禦的情況python attack.py --llm_type <model_specifier> --strategy tools --scenario all --attacks all --defenses None --iterations 100 --prompt_format tool-finetuned --device cuda
將使用React框架運行所有工具範圍內無攻擊和防禦的情況python attack.py --llm_type <model_specifier> --strategy tools --scenario all --attacks all --defenses all --iterations 100 --prompt_format tool-finetuned --device cuda
如果您想引用我們的工作,請使用以下Bibtex條目:
@article { evertz-24-whispers ,
title = { {Whispers in the Machine: Confidentiality in LLM-integrated Systems} } ,
author = { Jonathan Evertz and Merlin Chlosta and Lea Schönherr and Thorsten Eisenhofer } ,
year = { 2024 } ,
journal = { Computing Research Repository (CoRR) }
}