これは、マシンでの紙のささやき、つまりLLM統合システムの機密性に付随するコードリポジトリです。
大規模な言語モデル(LLM)は、外部ツールとLLM統合システムへの商用サービスでますます増強されています。これらのインターフェイスはモデルの機能を大幅に強化できますが、新しい攻撃面も導入します。たとえば、操作された統合は、モデルを活用し、他のインターフェイスを介してアクセスされる機密データを妥協することができます。以前の研究では、主にモデルのアラインメントまたはトレーニングデータの漏れを対象とした攻撃に焦点を当ててきましたが、推論中にのみ利用可能なデータのセキュリティは精査を免れています。この作業では、外部コンポーネントに関連する脆弱性を実証し、LLM統合システムの機密性リスクを評価するための体系的なアプローチを導入します。これらのシステムに固有のいくつかの特定の攻撃シナリオを特定し、これらを、機密情報を保護するモデルの能力を測定するように設計されたツールの堅牢性フレームワークに形式化します。このフレームワークにより、機密保持攻撃に対するモデルの脆弱性を評価することができます。私たちの調査結果は、すべての検査されたモデルが攻撃に対して非常に脆弱であり、モデルが外部ツールと一緒に使用されるとリスクが大幅に増加することを示しています。
私たちの作品を引用したい場合は、このbibtexエントリを使用してください。
警告
ハードウェアアセレレーションは、Linuxを実行しているCUDAマシンでのみ完全にサポートされています。 MACOSの議員は多少機能するはずですが、CUDAのWindowsはいくつかの問題に直面する可能性があります。
コードを実行する前に、要件をインストールします。
python -m pip install --upgrade -r requirements.txt
OpenAIまたはHuggingfaceがホストしたモデルを使用する場合は、OpenAI APIキーを含むkey.txt
ファイルと、これのルートディレクトリにプライベートレポ(llama2など)のハグイングフェイストークンを含むhf_token.txt
ファイルの両方を作成します。プロジェクト。
CLIを介してHuggingfaceアカウントにログインする必要がある場合があります。
git config --global credential.helper store
huggingface-cli login
すべてのスクリプトは、Accelerateライブラリを使用して複数の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"
攻撃は、ツール統合システムのReactプロンプト形式を使用してCUDAデバイスで0.7の温度で防御xml_tagging
を使用して、シナリオCalendarWithCloud
で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 | 2番目の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 | ReactまたはTool-Finetunedプロンプト形式がエージェントに使用されるかどうかを指定します。 (反応またはツールフィネチュード) |
-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、ターボ) | gpt-4o / gpt-4o-mini / gpt-4-turbo | リンク | Openai API |
ラマ2 | llama2-7b / llama2-13b / llama2-70b | リンク | ローカル推論 |
llama2硬化 | 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 | vicuna-7b / vicuna-13b / vicuna-33b | リンク | ローカル推論 |
stablebeluga(2) | beluga-7b / beluga-13b / beluga2-70b | リンク | ローカル推論 |
ORCA 2 | orca2-7b / orca2-13b / orca2-70b | リンク | ローカル推論 |
ジェマ | gemma-2b / gemma-7b | リンク | ローカル推論 |
ジェマ2 | gemma2-9b / gemma2-27b | リンク | 局所推論(最初: ollama pull gemma2/gemma2:27b ) |
Phi 3 | phi3-3b / phi3-14b | リンク | ローカル推論(最初: ollama pull phi3:mini/phi3:medium ) |
( finetuning.py
スクリプトを使用して、FinetunedまたはRobust/harded llamaモデルを最初に生成する必要があります。以下を参照)
攻撃 | 防御 | ||
---|---|---|---|
名前 | 指定器 | 名前 | 指定器 |
ペイロード分割 | payload_splitting | ランダムシーケンスエンクロージャー | seq_enclosure |
難読化 | obfuscation | XMLタグ付け | xml_tagging |
脱獄 | jailbreak | ヒューリスティック/フィルタリング防御 | heuristic_defense |
翻訳 | translation | サンドイッチ防衛 | sandwiching |
chatmlの乱用 | chatml_abuse | LLM評価 | llm_eval |
マスキング | masking | 困惑の検出 | ppl_detection |
誤酸症 | typoglycemia | PROMPTGUARD | prompt_guard |
敵対的な接尾辞 | advs_suffix | ||
プレフィックスインジェクション | prefix_injection | ||
拒否抑制 | refusal_suppression | ||
文脈を無視します | context_ignoring | ||
コンテキスト終了 | context_termination | ||
コンテキストスイッチングセパレーター | context_switching_separators | ||
少数のショット | few_shot | ||
認知ハッキング | cognitive_hacking | ||
ベースチャット | base_chat |
base_chat
攻撃は、モデルのテストするための通常の質問で構成されており、実際の攻撃がなくても、コンテキストの流出と機密情報が流出します。
このセクションでは、可能なLlama Finetuningオプションについて説明します。この論文に基づいたPEFTを使用しています。
上記のセットアップの実行に加えて
accelerate config
システムの分散トレーニング機能を構成します。そして
wandb login
WandB APIキーを使用して、Finetuningプロセスのログを有効にします。
最初のFinetuningオプションは、秘密の鍵を安全に保つようにLLMに安全に指示するシステムプロンプトで構成されるデータセット上のものです。 2番目のFinetuningオプション( --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 | FinetuneにLLMのタイプを指定します |
-i, --iterations | int | 10000 | Finetuningの反復回数を指定します |
-advs, --advs_train | ブール | False | Finetuned LLMを強化するために敵対的なトレーニングを利用します |
-a, --attacks | リスト[str] | payload_splitting | Finetuning中にLLMを強化するために使用される攻撃を指定します。 --train_robust がtrueに設定されている場合にのみ効果があります。サポートされている攻撃については、前のセクションを参照してください |
-n, --name_suffix | str | "" | Finetunedモデル名の接尾辞を指定します |
現在、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ドライブとGoogleメール統合でLLMSをテストする可能性を提供します。これを行うには、Google API資格情報を使用して、 /various_scripts/llm_mail_test.py
スクリプトを実行します。
警告
どのLLMが評価されるかを依存することは、GPU VRAMと時間の点で非常に厳しいものになる可能性があります。
注記
結果は、実行ごとにわずかに異なる場合があります。 OllamaはLLMのほとんどを絶えず更新するため、行動は変化する可能性があります。また、最低温度であっても、LLMSは内部のランダム性のために、Behviorでわずかに変動する傾向があります。
攻撃がなくても秘密を漏らすことを確認するために、LLMの良性の質問に質問しますpython attack.py --llm_type <model_specifier> --strategy secret-key --attacks chat_base --defenses None --iterations 100 --device cuda
防御せずにLLMに対するすべての攻撃を実行します。反復は、使用済み攻撃に均等に分割されます。したがって、使用済み攻撃の数に応じて、反復数を適応する必要があります。 (たとえば、100回のイテレーションを備えた14の攻撃について、反復パラメーターを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) }
}