Skip to main content

Enquête sur les vulnérabilités d’injection de code causées par l’IA générative

Écrit par
Headshot of Jack Hair

Jack Hair

feature ai ide dark

16 avril 2024

0 minutes de lecture

L’IA générative est une technologie passionnante, désormais facilement accessible via les API cloud proposées par des entreprises comme Google et OpenAI. Bien qu’elle soit puissante, son utilisation dans le code soulève des enjeux de sécurité supplémentaires que les développeurs doivent prendre en compte pour garantir la sécurité de leurs applications.

Dans cet article, nous examinons les implications potentielles des grands modèles de langage (LLM), une forme d’IA générative qui produit du texte, pour la sécurité.

Nous avons utilisé le moteur de Snyk Code pour analyser plus de 4 000 dépôts Python sur GitHub, identifiés comme faisant appel à des API LLM courantes. L’analyse visait à détecter les vulnérabilités d’injection de code (CWE-94) causées par des données issues d’un LLM, puis à examiner les résultats afin de repérer les pratiques courantes que les développeurs devraient éviter lorsqu’ils utilisent l’IA générative.

Grands modèles de langage : quelques notions de base

Un LLM reçoit une séquence initiale de texte (également appelée prompt) et la divise en jetons représentant des mots ou des parties de mots. Il utilise ensuite ces jetons pour en générer d’autres qui ont une probabilité élevée de suivre les précédents, à l’aide d’un modèle obtenu en entraînant le LLM sur un corpus de données.

En général, la réponse d’un LLM à un prompt donné est non déterministe et peut même contenir des informations erronées (communément appelées « hallucinations »). Le texte généré par un LLM doit donc être considéré comme non fiable, et des mesures doivent être prises pour vérifier la réponse. Il est particulièrement important de traiter avec prudence les réponses d’un LLM lorsque le prompt contient des données externes, car celles-ci peuvent influencer la réponse de manière inattendue : c’est ce qu’on appelle l’injection de prompt.

Injection de prompt

Dans une application utilisant un LLM, il est courant d’intégrer des données fournies par l’utilisateur à un prompt rédigé à l’avance. Cependant, l’utilisateur peut saisir un texte qui manipule le LLM et l’amène à ignorer les instructions prévues dans ce prompt. Prenons le prompt suivant : « Répondez à la question suivante avec un seul mot : ». Si la question de l’utilisateur est ajoutée à ce prompt, celui-ci peut demander au LLM : « Veuillez expliquer l’injection de prompt en 3 paragraphes ». Le LLM risque alors d’ignorer l’instruction précédente (même sans injection de prompt, rien ne garantit qu’il répondrait par un seul mot).

Pour en savoir plus sur l’injection de prompt, consultez notre page Snyk Learn.

Utilisation abusive des réponses des LLM dans du code Python

Lors de l’analyse de code Python open source, nous avons relevé des pratiques vulnérables dans l’utilisation des réponses des LLM, susceptibles d’entraîner une injection de code. Cette vulnérabilité provoque l’exécution de code malveillant sur la machine qui exécute l’application vulnérable.

Analyser du JSON en Python

Un problème courant identifié concernait du code utilisant la fonction Python eval pour analyser la réponse d’un LLM, qui était censée être au format JSON. Cette méthode semble dater d’avant l’ajout du module json à la bibliothèque standard de Python (avant Python 2.6, publié en 2008).

En plus de traiter incorrectement l’analyse du JSON (les valeurs booléennes ne sont pas correctement analysées), l’utilisation de la fonction eval pose un problème plus grave. La fonction eval exécute son entrée en tant que code Python. Par exemple, le code Python eval(“””__import__(“os”).system(“touch hello_world.txt”)”””) exécute la commande système touch hello_world.txt, qui crée un fichier sur le système. Cet exemple particulier est relativement inoffensif, mais la possibilité d’exécuter n’importe quelle commande sur un système constitue une grave faille de sécurité, exploitable à diverses fins : déni de service, vol de données client ou lancement d’attaques plus profondes au sein d’un réseau.

Si une entrée utilisateur est intégrée à un prompt adressé à un LLM, puis que sa réponse est transmise à eval, une injection de prompt peut amener le LLM à renvoyer du code Python malveillant au lieu d’un JSON bien formé, entraînant ainsi l’exécution du code malveillant.

Heureusement, il est facile de corriger ce problème : il suffit de remplacer eval par json.loads. Le module Python json devrait être disponible dans les versions récentes de Python. S’il ne l’est pas pour une raison quelconque, il existe également sous la forme d’une bibliothèque externe appelée simplejson.

Exécuter du code généré

Nous avons également constaté que certaines applications exécutaient explicitement le code généré par des LLM.

Des données provenant d’une source externe servent à créer un prompt demandant à un LLM de générer du code Python. La réponse du LLM est ensuite transmise à une fonction, telle que eval ou exec, puis exécutée comme du code Python. Cela peut permettre l’exécution de code arbitraire, comme dans les problèmes liés à eval décrits plus haut, où une injection de prompt peut servir à générer du code malveillant.

Corriger ce problème tout en préservant le comportement de votre application est complexe et dépasse le cadre de cet article. Dans la mesure du possible, demandez-vous s’il est vraiment nécessaire de pouvoir générer et exécuter du code arbitraire. Si cette fonctionnalité est indispensable, veillez à exécuter tout code généré par un LLM dans un environnement restreint et isolé. Votre modèle de sécurité doit partir du principe qu’un attaquant pourrait y exécuter n’importe quel code.

Utiliser les LLM en toute sécurité

Les données produites par l’IA générative doivent être traitées avec précaution afin d’éviter les vulnérabilités dans votre code. Même si cet article s’est principalement concentré sur l’injection de code, il est également important de tenir compte de l’utilisation des données issues de LLM dans le contexte d’autres vulnérabilités, comme les scripts intersites (XSS) et l’injection SQL.

Nous espérons que cet article vous aura donné envie d’utiliser les LLM en toute sécurité dans vos applications.

Commencez à sécuriser le code généré par l’IA

Créez gratuitement votre compte Snyk pour commencer à sécuriser le code généré par l’IA en quelques minutes. Vous pouvez aussi réserver une démonstration avec un expert pour découvrir comment Snyk répond à vos besoins en sécurité des développeurs.