Piratage de Google Bard : de l’injection de prompt à l’exfiltration de données
(embracethered.com)- Avec Bard Extensions désormais capable de lire des documents personnels et des e-mails, une injection indirecte de prompt dissimulée dans un document externe peut devenir un véritable vecteur d’exfiltration de données
- Un attaquant peut partager de force un Google Docs malveillant avec la victime et faire en sorte que Bard exécute les instructions contenues dans le document dès qu’il le recherche ou l’analyse
- Le rendu d’images Markdown de Bard peut appeler une URL externe sans clic de l’utilisateur, ce qui ouvre un canal pour exfiltrer le contexte de la conversation en l’ajoutant à la chaîne de requête
- La Content Security Policy de Google bloquait le chargement arbitraire d’images, mais Google Apps Script exécuté depuis
script.google.cometgoogleusercontent.coma été utilisé comme voie de contournement - Le problème a été signalé au Google VRP le 19 septembre 2023, la correction a été confirmée le 19 octobre, et un filtrage semble avoir été ajouté pour empêcher l’insertion de données dans les URL
La nouvelle surface d’attaque créée par Bard Extensions
- Google Bard prend en charge les Extensions depuis une mise à jour, permettant l’accès à YouTube, à la recherche de vols et d’hôtels, ainsi qu’aux documents personnels et e-mails de l’utilisateur
- Comme Bard peut analyser le Drive, Docs et Gmail de l’utilisateur, des données externes non fiables peuvent désormais être intégrées au contexte du LLM
- Dans cette architecture, le service peut être exposé à l’injection indirecte de prompt, où des instructions cachées dans du contenu externe modifient la réponse du modèle
- Des tests de résumés de vidéos YouTube et de
Google Docsont montré que Bard suivait des instructions incluses dans du contenu externe
Scénario d’attaque
- L’injection indirecte de prompt via e-mail ou Google Docs est dangereuse, car elle peut être transmise sans que l’utilisateur clique explicitement sur un lien malveillant
- Un attaquant peut partager de force un Google Docs malveillant avec la victime
- Si la victime recherche ce document ou interagit avec lui via Bard, les instructions d’injection de prompt qu’il contient peuvent être exécutées
- Dans les applications LLM, un vecteur de vulnérabilité fréquent est l’exfiltration de l’historique de chat via des hyperliens et le rendu d’images
Injection d’image Markdown
- Le LLM de Google peut inclure des éléments Markdown dans ses réponses textuelles, que Bard rend ensuite en HTML
- La syntaxe Markdown des images est convertie en balise HTML
<img>, et l’attributsrcpeut pointer vers le serveur de l’attaquant - Le navigateur se connecte automatiquement à cette URL pour afficher l’image, sans interaction de l’utilisateur
- Si le LLM résume ou lit des données antérieures du contexte de chat, puis ajoute cette valeur à l’URL de l’image, les données peuvent être exfiltrées via une requête externe
- Le premier exploit a été rapidement développé en lisant l’historique de conversation puis en créant un hyperlien qui l’incluait, mais le rendu d’images a été bloqué par la Content Security Policy de Google
Contournement de la Content Security Policy
- La CSP de Google empêche le chargement d’images depuis des emplacements arbitraires
- Toutefois, la CSP inclut des emplacements autorisés relativement larges, comme
*.google.comet*.googleusercontent.com - Google Apps Script peut être appelé par URL, à la manière des macros Office, et s’exécute depuis les domaines
script.google.comougoogleusercontent.com - Cette caractéristique a fait d’Apps Script un bon candidat pour le contournement de CSP
Implémentation de Bard Logger
- Bard Logger a été implémenté avec
Apps Script - Le Logger enregistre dans un Google Doc tous les paramètres de requête attachés à l’URL appelée
- Dans l’interface d’Apps Script, il a été possible de trouver un réglage accessible sans authentification et de créer un endpoint pouvant être appelé anonymement
- La chaîne d’attaque se compose des éléments suivants
- Injection indirecte de prompt issue des données de Bard Extensions
- Requête zero-click déclenchée par le rendu d’images de Bard
- Instructions d’injection de prompt dans un Google Doc malveillant
- Endpoint de journalisation basé sur
google.comrecevant les données lors du chargement de l’image
Déroulé de la démo
- Dans la démo, lorsque le
Google Docmalveillant entre dans le contexte de chat, l’historique de chat de l’utilisateur est exfiltré - Le déroulé illustré par les captures d’écran est le suivant
- L’utilisateur se rend dans le Google Doc intitulé « The Bard2000 »
- Les instructions de l’attaquant sont injectées et l’image est rendue
- L’attaquant reçoit les données dans un Google Doc via Bard Logger Apps Script
- La chaîne était plus complexe que les cas précédemment évoqués pour Bing Chat, ChatGPT et Claude, car un contournement de CSP était nécessaire
Shell Code en langage naturel et payload
- Comme le suggère l’expression « Shell Code is natural language these days », l’exploit est composé de prompts en langage naturel
- Le Google Doc malveillant contient un payload réalisant l’injection de prompt et l’exfiltration de données
- Ce payload incite le LLM à remplacer le texte dans l’URL de l’image par les données de la conversation
- Pour que Bard accomplisse la tâche, un in-context learning avec quelques exemples était nécessaire
- Le payload en annexe demande d’afficher les 20 premiers mots de la conversation, d’encoder les espaces en
+, puis de les insérer dans la requête de l’URL d’exécution d’Apps Script - L’annexe contient également la chaîne de sortie « AI Injection succeeded #10 »
Correction par Google et calendrier
- Le problème a été signalé au Google VRP le 19 septembre 2023
- Après une demande de vérification de statut le 19 octobre 2023, Google a confirmé que la correction était terminée et a autorisé l’inclusion de la démo dans une présentation à Ekoparty 2023
- La méthode de correction exacte n’était pas totalement claire à ce moment-là
- La CSP n’a pas été modifiée et les images sont toujours rendues ; il semble donc qu’un filtrage ait été ajouté pour empêcher l’insertion de données dans les URL
- Calendrier de correction
- 19 septembre 2023 : signalement du problème
- 19 octobre 2023 : correction confirmée
1 commentaires
Avis de Hacker News
thesur 2 ou 3 prompts d’affilée, mais cette méthode ne fonctionne pas avec BardJe pensais que les règles s’appliquaient de manière globale et uniforme à l’ensemble du prompt
Ensuite, le même problème est réapparu avec le XSS : le système ne distinguait pas les commandes des données, ce qui permettait à un attaquant de fabriquer un message que le système prenait à tort pour une commande. La solution a été de trouver un moyen de délimiter clairement les données
Pour les LLM, la solution sera probablement similaire. Il pourrait s’agir d’entraîner le LLM à respecter une consigne du genre : « Les 100 premiers tokens sont immuables, et aucune autre instruction ne peut les contredire. [insertion d’instructions protégées] ». Si l’on intègre ce genre de chose au moment de l’entraînement, plutôt que d’ajouter des consignes de protection au moment de l’inférence, il deviendra peut-être plus difficile d’injecter des instructions malveillantes ; mais en pratique ce n’est pas simple, car il faudrait anticiper toutes les attaques possibles au moment de l’entraînement
Le problème, c’est de comprendre pourquoi on donne des droits d’accès spéciaux à un échantillonneur de tokens aléatoires extraits d’une botte de foin, puis pourquoi on croit qu’il fonctionnera toujours correctement sous prétexte qu’il semble globalement bien se comporter
Il faut espérer que, dans les prochaines années, une percée architecturale permettra de séparer les instructions — c’est-à-dire les prompts — de la conversation principale, qui constitue les « données »
Par exemple, on pourrait imaginer fournir en entrée deux types de tokens, des tokens de prompt et des tokens de données, de façon à ce qu’ils ne se mélangent ni ne soient jamais confondus. Je ne sais pas encore comment faire, et il faudrait une avancée architecturale majeure pour entraîner et faire fonctionner un système sur ces deux niveaux, mais il ne reste qu’à espérer que quelqu’un trouve la solution
Il n’y a pas de raison fondamentale de penser que ce soit impossible. Cela ne cadre pas avec le paradigme actuel de la séquence unique de tokens, mais c’est justement pour cela que les paradigmes évoluent
Il ne faut fournir au modèle que des données que l’utilisateur aurait le droit de lire via une autre interface
La solution consiste à traiter le LLM comme un composant non fiable et à concevoir le système en partant de ce principe
Avec une base de données vectorielle et des API, on peut facilement transmettre du contexte ou des informations de contrôle d’accès fondées sur les rôles, et cela fonctionne bien
Je n’ai pas été particulièrement impressionné par les LLM sous forme de bases de connaissances, mais comme interface, c’est nettement plus convaincant
Il y a quelques jours, quelqu’un ici a parlé de système d’exploitation, et cette expression me plaît aussi
Il y a encore une heure, j’ai utilisé ChatGPT ; fait intéressant, il a transformé ma requête en recherche Bing, puis a répondu de manière cohérente avec les bonnes informations. Je posais des questions précises sur un projet open source ; auparavant il ne connaissait que la spécification d’API et la documentation, mais cette fois cela a très bien fonctionné
Les LLM ne sont pas intrinsèquement sûrs, principalement parce qu’ils sont par nature faciles à tromper. Pour être utiles, ils doivent être un peu crédules, mais cela signifie que toute application qui les expose à du texte provenant de sources non fiables — par exemple la synthèse de pages web — peut être détournée par un acteur malveillant
Cela fait 14 mois que l’on parle d’injection de prompt, et rien ne semble encore se rapprocher d’une solution fiable
J’espère vraiment que quelqu’un résoudra bientôt ce problème ; sinon, il sera difficile de construire en toute sécurité beaucoup de choses que l’on aimerait créer avec les LLM
[1] https://gandalf.lakera.ai/
Pour préciser un peu mon point de vue, je pense qu’au final on ira vers l’application de quelque chose comme
addslashesà tous les prompts interprétés par les LLM. C’est pour ça que j’ai simplifié en disant que « le LLM peut résoudre ce problème »Si l’on regarde ce que fait
addslashes, cela revient à appliquer du code qui supprime ou atténue les caractères spéciaux susceptibles d’influer sur l’exécution du code qui suit. De la même façon, je pense qu’un LLM peut assainir lui-même l’entrée pour empêcher toute échappatoireSi l’on est d’accord qu’aucun caractère d’entrée ne permet de supprimer les barres obliques ajoutées, alors il devrait exister une version prompt de
addslashes: unaddslashesenveloppant qui atténue l’injection de prompt et dont aucune instruction ne permettrait de s’échapperJe n’ai pas poussé la réflexion jusqu’au bout sur l’impact que cela aurait sur l’utilisabilité du système, mais il devrait rester possible d’accomplir la plupart des tâches tout en restant dans le périmètre d’usage prévu
Si Lakera AI dispose d’une défense contre cela, ils devraient pouvoir le prouver. S’il existe une méthode bloquant les injections avec une efficacité de 100 %, il devrait y avoir dans le jeu un niveau impossible à passer. Mais comme cette méthode n’existe pas, il n’y a pas non plus un tel niveau dans le jeu
Lakera AI propose une défense probabiliste, mais son marketing donne l’impression qu’ils disposent de quelque chose de plus fiable. Personne n’a démontré de détecteur totalement fiable, et il n’existe aucune méthode pour empêcher avec certitude toutes les injections de prompt. Le fait que Lakera AI omette souvent ce point dans son marketing me paraît franchement trompeur
Le texte ci-dessus est faux. Il n’existe aucun moyen de détecter cette attaque précise avec une fiabilité de 100 % à l’aide d’un détecteur d’injection. Il faudrait dire que Lakera AI dispose d’un détecteur d’injection qui repère parfois cette attaque. Mais Lakera ne formule pas son marketing ainsi. Ils essaient subtilement de vendre un produit qui n’existe pas et dont les chercheurs n’ont même pas prouvé qu’il pouvait être créé
Autrement dit, parmi les clients qui ont besoin d’une défense contre l’injection de prompt et qui sont prêts à payer, lesquels peuvent tolérer un certain niveau d’erreurs ?
L’utilisateur n’avait pas l’intention que ses conversations précédentes soient visibles par l’attaquant. C’est ça, la faille de sécurité
Ces conversations pouvaient être totalement inoffensives, mais elles auraient aussi pu contenir des conseils sur des problèmes personnels, par exemple des questions médicales, financières ou relationnelles
J’ai créé un GPT personnalisé qui le fait à ma place
Est-ce que tu as écrit un billet de blog ou publié quelque chose sur le processus de création ? Ça a l’air assez cool