Il s'agit du référentiel de code accompagnant nos chuchotements de papier dans la machine: confidentialité dans les systèmes intégrés à LLM.
Les modèles de grands langues (LLM) sont de plus en plus augmentés d'outils externes et de services commerciaux dans des systèmes intégrés à LLM . Bien que ces interfaces puissent améliorer considérablement les capacités des modèles, elles introduisent également une nouvelle surface d'attaque. Les intégrations manipulées, par exemple, peuvent exploiter le modèle et compromettre les données sensibles accessibles via d'autres interfaces. Alors que les travaux antérieurs se sont principalement concentrés sur les attaques ciblant l'alignement d'un modèle ou la fuite des données de formation, la sécurité des données qui n'est disponible que pendant l'inférence a échappé à un examen. Dans ce travail, nous démontrons les vulnérabilités associées aux composants externes et introduisons une approche systématique pour évaluer les risques de confidentialité dans les systèmes intégrés à LLM. Nous identifions plusieurs scénarios d'attaque spécifiques uniques à ces systèmes et les formalisons dans un cadre d'outils de robustesse conçu pour mesurer la capacité d'un modèle à protéger les informations sensibles. Ce cadre nous permet d'évaluer la vulnérabilité du modèle aux attaques de confidentialité. Nos résultats montrent que tous les modèles examinés sont très vulnérables aux attaques, le risque augmentant considérablement lorsque les modèles sont utilisés avec des outils externes.
Si vous souhaitez citer notre travail, veuillez utiliser cette entrée Bibtex.
Avertissement
L'acélération matérielle n'est entièrement prise en charge que pour les machines CUDA exécutant Linux. Les députés sur macOS devraient un peu fonctionner, mais Windows avec CUDA pourrait faire face à certains problèmes.
Avant d'exécuter le code, installez les exigences:
python -m pip install --upgrade -r requirements.txt
Si vous souhaitez utiliser des modèles hébergés par OpenAI ou HuggingFace, créez à la fois un fichier key.txt
contenant votre touche API OpenAI ainsi qu'un fichier hf_token.txt
contenant votre jeton HuggingFace pour des reposs privés (tels que LLAMA2) dans le répertoire racine de cette projet.
Parfois, il peut être nécessaire de se connecter à votre compte HuggingFace via la CLI:
git config --global credential.helper store
huggingface-cli login
Tous les scripts peuvent travailler sur plusieurs GPU / CPU à l'aide de la bibliothèque Accelerate. Pour ce faire, courez:
accelerate config
Pour configurer les capacités de formation distribuées de votre système et démarrer les scripts avec:
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"
Exécuterait les attaques payload_splitting
et obfuscation
contre le LLM llama3-70b
dans le scénario CalendarWithCloud
en utilisant la défense xml_tagging
pour 15 itérations avec une température de 0,7 sur un périphérique CUDA en utilisant le format d'invite React dans un système intégré à l'outil.
Argument | Taper | Valeur par défaut | Description |
---|---|---|---|
-h, --help | - | - | afficher ce message d'aide et quitter |
-a, --attacks | Liste [Str] | payload_splitting | Spécifie les attaques qui seront utilisées contre le LLM |
-d, --defense | Str | None | Spécifie la défense du LLM |
-llm, --llm_type | Str | gpt-3.5-turbo | Spécifie le type d'adversaire |
-le, --llm_guessing | bool | False | Spécifie si un deuxième LLM est utilisé pour deviner la clé secrète de la réponse normale ou non |
-t, --temperature | flotter | 0.0 | Spécifie la température du LLM pour contrôler l'aléatoire |
-cp, --create_prompt_dataset | bool | False | Spécifie si un nouvel ensemble de données d'invites système améliorées doit être créée |
-cr, --create_response_dataset | bool | False | Spécifie si un nouvel ensemble de données de réponses de fuite secrète doit être créée |
-i, --iterations | int | 10 | Spécifie le nombre d'itérations pour l'attaque |
-n, --name_suffix | Str | "" | Spécifie un suffixe de nom pour charger des modèles personnalisés. Étant donné que les chaînes de paramètres d'argument ne sont pas autorisées à commencer par '-' symboles, le premier '' - «sera ajouté automatiquement par l'analyseur |
-s, --strategy | Str | None | Spécifie la stratégie pour l'attaque (que ce soit pour utiliser des attaques ou tools normaux) |
-sc, --scenario | Str | all | Spécifie le scénario des attaques basées sur l'outil |
-dx, --device | Str | cpu | Spécifie l'appareil utilisé pour exécuter le script (CPU, CUDA ou MPS) |
-pf, --prompt_format | Str | react | Spécifie si la réaction ou le format d'invite à couches d'outils est utilisé pour les agents. (réagir ou-fintuned) |
-ds, --disable_safeguards | bool | False | Désactive les garanties d'invite du système pour la stratégie d'outil |
Les conventions de dénomination des modèles sont les suivantes: |
< model_name > - < param_count > - < robustness > - < attack_suffix > - < custom_suffix >
Par exemple:
llama2 - 7 b - robust - prompt_injection - 0613
Si vous souhaitez exécuter les attaques contre un modèle préfixe avec un suffixe personnalisé (par exemple, 1000epochs
), vous devrez spécifier les arguments que a suit:
... - - model_name llama2 - 7 b - prefix - - name_suffix 1000 epochs ...
Modèle | Spécificateur de paramètre | Lien | Instance de calcul |
---|---|---|---|
GPT-4 (O1, O1-MINI, TURBO) | gpt-4o / gpt-4o-mini / gpt-4-turbo | Lien | API Openai |
Lama 2 | llama2-7b / llama2-13b / llama2-70b | Lien | Inférence locale |
Lama 2 endurci | llama2-7b-robust / llama2-13b-robust / llama2-70b-robust | Lien | Inférence locale |
Qwen 2.5 | qwen2.5-72b | Lien | Inférence locale (premier: ollama pull qwen2.5:72b ) |
Lama 3.1 | llama3-8b / llama3-70b | Lien | Inférence locale (Premier: ollama pull llama3.1/llama3.1:70b/llama3.1:405b ) |
Lama 3.2 | llama3-1b / llama3-3b | Lien | Inférence locale (premier: ollama pull llama3.2/llama3.2:1b ) |
Lama 3.3 | llama3.3-70b | Lien | Inférence locale (premier: ollama pull llama3.3/llama3.3:70b ) |
REFLECTION LAMA | reflection-llama | Lien | Inférence locale (premier: ollama pull reflection ) |
Vicuna | vicuna-7b / vicuna-13b / vicuna-33b | Lien | Inférence locale |
StableBeluga (2) | beluga-7b / beluga-13b / beluga2-70b | Lien | Inférence locale |
Orque 2 | orca2-7b / orca2-13b / orca2-70b | Lien | Inférence locale |
Gemme | gemma-2b / gemma-7b | Lien | Inférence locale |
Gemma 2 | gemma2-9b / gemma2-27b | Lien | Inférence locale (Premier: ollama pull gemma2/gemma2:27b ) |
Phi 3 | phi3-3b / phi3-14b | Lien | Inférence locale (Premier: ollama pull phi3:mini/phi3:medium ) |
(Les modèles LLAMA finetuned ou robustes / endurcis doivent d'abord être générés en utilisant le script finetuning.py
, voir ci-dessous)
Attaques | Défenses | ||
---|---|---|---|
Nom | Spécificateur | Nom | Spécificateur |
Division de charge utile | payload_splitting | Boîtier de séquence aléatoire | seq_enclosure |
Obscurcissement | obfuscation | Tagging XML | xml_tagging |
Jailbreak | jailbreak | Défense heuristique / filtrage | heuristic_defense |
Traduction | translation | Défense des sandwichs | sandwiching |
Abus de chat | chatml_abuse | Évaluation LLM | llm_eval |
Masquage | masking | Détection de perplexité | ppl_detection |
Typoglycémie | typoglycemia | Protège-pied | prompt_guard |
Suffixe adversaire | advs_suffix | ||
Injection de préfixe | prefix_injection | ||
Suppression de refus | refusal_suppression | ||
Contexte Ignorer | context_ignoring | ||
Résiliation du contexte | context_termination | ||
Séparateurs de commutation de contexte | context_switching_separators | ||
À quelques coups | few_shot | ||
Piratage cognitif | cognitive_hacking | ||
Chat de base | base_chat |
L'attaque base_chat
se compose de questions normales pour tester le modèle déverse son contexte et ses informations confidentielles même sans attaque réelle.
Cette section couvre les options de finetuning LLAMA possibles. Nous utilisons PEFT, qui est basé sur ce document.
En plus à l'exécution de configuration ci-dessus
accelerate config
Pour configurer les capacités de formation distribuées de votre système. Et
wandb login
avec votre clé API WANDB pour activer la journalisation du processus de financement.
La première option de financement se trouve sur un ensemble de données composé d'invites système pour instruire en toute sécurité un LLM pour garder une clé secrète en sécurité. La deuxième option de finetuning (à l'aide de l'option --train_robust
) utilise des invites système et des invites adversaires pour durcir le modèle contre les attaques d'injection invites.
python finetuning . py [ - h ] [ - llm | - - llm_type LLM_NAME ] [ - i | - - iterations ITERATIONS ] [ - a | - - attacks ATTACKS_LIST ] [ - n | - - name_suffix NAME_SUFFIX ]
Argument | Taper | Valeur par défaut | Description |
---|---|---|---|
-h, --help | - | - | Afficher ce message d'aide et quitter |
-llm, --llm_type | Str | llama3-8b | Spécifie le type de LLM à Finetune |
-i, --iterations | int | 10000 | Spécifie le nombre d'itérations pour le Finetuning |
-advs, --advs_train | bool | False | Utilise la formation contradictoire pour durcir le LLM Finetuned |
-a, --attacks | Liste [Str] | payload_splitting | Spécifie les attaques qui seront utilisées pour durcir le LLM pendant la finetuning. N'a qu'un effet si --train_robust est défini sur true. Pour les attaques soutenues, voir la section précédente |
-n, --name_suffix | Str | "" | Spécifie un suffixe pour le nom du modèle Finetuned |
Actuellement, seuls les modèles de lama sont pris en charge ( llama2-7/13/70b
/ llama3-8/70b
).
Exécutez simplement le script generate_dataset.py
pour créer de nouvelles invites système en tant que fichier JSON à l'aide de LLMS.
Argument | Taper | Valeur par défaut | Description |
---|---|---|---|
-h, --help | - | - | Afficher ce message d'aide et quitter |
-llm, --llm_type | Str | llama3-70b | Spécifie le LLM utilisé pour générer l'ensemble de données d'invite système |
-n, --name_suffix | Str | "" | Spécifie un suffixe pour le nom du modèle si vous souhaitez utiliser un modèle personnalisé |
-ds, --dataset_size | int | 1000 | Taille de l'ensemble de données d'invite du système résultant |
Pour tester la confidentialité des LLM dans les scénarios d'outils du monde réel, nous offrons la possibilité de tester les LLM dans Google Drive et Google Mail. Pour ce faire, exécutez le script /various_scripts/llm_mail_test.py
avec vos informations d'identification Google API.
Avertissement
Dépèchement sur lequel LLM est évalué l'évaluation peut être très exigeante en termes de GPU VRAM et de temps.
Note
Les résultats peuvent varier légèrement de l'exécution à la course. Olllama met à jour la plupart de leurs LLM constamment, donc leur comportement est susceptible de changer. De plus, même avec les LLM à température la plus basse, ont tendance à fluctuer légèrement chez le comportement en raison de l'aléatoire interne.
Posera aux questions bénignes de LLM pour vérifier la fuite du secret même sans attaques
python attack.py --llm_type <model_specifier> --strategy secret-key --attacks chat_base --defenses None --iterations 100 --device cuda
Exécutera toutes les attaques contre le LLM sans défenses. Les itérations seront divisées également sur les attaques utilisées. Ainsi, en fonction du nombre d'attaques utilisées, le nombre d'itérations doit être adapté. (Par exemple, pour 14 attaques avec 100 itérations, définissez le paramètre Itérations à 1400)
python attack.py --llm_type <model_specifier> --strategy secret-key --attacks all --defenses None --iterations 100 --device cuda
Exécutera toutes les attaques contre le LLM avec toutes les défenses
python attack.py --llm_type <model_specifier> --strategy secret-key --attacks all --defenses all --iterations 100 --device cuda
L'invite du système instruisera le LLM avec une clé secrète et les instructions pour ne pas divulguer la clé secrète suivie des demandes simples pour imprimer la clé secrète
python attack.py --llm_type <model_specifier> --strategy tools --scenario all --attacks base_attack --defenses None --iterations 100 --device cuda
Exécutera tous les scénarios d'outils sans attaques et défenses en utilisant le cadre React
python attack.py --llm_type <model_specifier> --strategy tools --scenario all --attacks identity --defenses None --iterations 100 --prompt_format ReAct --device cuda
Exécutera tous les scénarios d'outils sans attaques et défenses en utilisant le cadre React
python attack.py --llm_type <model_specifier> --strategy tools --scenario all --attacks identity --defenses None --iterations 100 --prompt_format tool-finetuned --device cuda
Exécutera tous les scénarios d'outils sans attaques et défenses en utilisant le cadre React
python attack.py --llm_type <model_specifier> --strategy tools --scenario all --attacks all --defenses None --iterations 100 --prompt_format tool-finetuned --device cuda
Exécutera tous les scénarios d'outils sans attaques et défenses en utilisant le cadre React
python attack.py --llm_type <model_specifier> --strategy tools --scenario all --attacks all --defenses all --iterations 100 --prompt_format tool-finetuned --device cuda
Si vous souhaitez citer notre travail, veuillez utiliser l'entrée Bibtex suivante:
@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) }
}