GitHub Copilot
Copilot peut générer du code contenant des failles de sécurité dans une proportion non négligeable
Introduction
Les outils de génération de code basés sur l’intelligence artificielle (IA), tels que GitHub Copilot, sont de plus en plus utilisés par les développeurs pour améliorer leur productivité. Cependant, l’étude Security Weaknesses of Copilot Generated Code in GitHub soulève des inquiétudes quant à la sécurité du code généré par ces outils.
Contexte
Les outils de génération de code basés sur l’intelligence artificielle (IA) et les grands modèles de langage (LLM) sont devenus des outils incontournables pour les développeurs, comme GitHub Copilot.
Des études antérieures ont révélé que ces outils peuvent parfois reproduire des failles de sécurité présentes dans les données d’entraînement, ce qui peut entraîner l’introduction de vulnérabilités dans les projets logiciels. Cette problématique est d’autant plus préoccupante que GitHub Copilot est largement adopté par les développeurs, ce qui signifie que les failles de sécurité potentielles pourraient se propager à grande échelle.
L’étude présentée vise à répondre à ces préoccupations en évaluant de manière empirique la sécurité du code généré par Copilot. L’objectif principal est d’analyser des extraits de code Python et JavaScript issus de projets réels hébergés sur GitHub afin de déterminer si ces extraits contiennent des failles de sécurité.
En identifiant et en caractérisant ces failles, l’étude cherche à fournir des informations précieuses sur les risques potentiels associés à l’utilisation de Copilot et d’autres outils similaires. Cette analyse approfondie permettra de mieux comprendre les défis liés à la sécurité du code généré par l’IA et d’éclairer les développeurs sur les précautions à prendre lors de l’utilisation de tels outils.
Méthodes
Pour évaluer la sécurité du code généré par Copilot, les chercheurs ont utilisé une méthode appelée “analyse statique”. Imaginez que l’analyse statique est un peu comme un scanner de sécurité pour le code. Au lieu d’exécuter le code et de voir s’il fonctionne correctement, l’analyse statique examine le code lui-même, un peu comme un correcteur orthographique vérifie un texte.
Dans cette étude, les chercheurs ont utilisé deux types de scanners de sécurité pour le code :
- CodeQL : C’est un outil très connu et utilisé par de nombreux développeurs. Il est capable de vérifier différents types de code, un peu comme un scanner de sécurité polyvalent qui peut détecter différents types de problèmes.
- Outils spécifiques à chaque langage : En plus de CodeQL, les chercheurs ont utilisé des outils spécialement conçus pour vérifier le code Python (Bandit) et le code JavaScript (ESLint).
L’utilisation de ces deux types d’outils a permis aux chercheurs d’avoir une vision plus complète des problèmes de sécurité potentiels dans le code généré par Copilot. Ils ont ensuite examiné manuellement les résultats pour s’assurer qu’il n’y avait pas d’erreurs et pour confirmer les problèmes identifiés.
Résultats
L’étude menée sur 452 extraits de code Python et JavaScript générés par GitHub Copilot révèle des résultats préoccupants : près d’un tiers (29,6 %) de ces extraits présentent des failles de sécurité. Plus précisément, 32,8 % des extraits Python et 24,5 % des extraits JavaScript sont concernés.
Huit de ces failles de sécurité identifiées figurent parmi les 25 vulnérabilités les plus dangereuses selon le classement MITRE CWE Top 25 de 2023. Parmi ces huit CWE, six sont considérées comme des “Stubborn Weaknesses” (failles persistantes et difficiles à corriger) :
- CWE-20 : Validation insuffisante des entrées ou Improper Input Validation (Stubborn Weaknesses). Cette faiblesse est liée à une absence de vérification ou de validation adéquate des données fournies en entrée par l’utilisateur, ce qui peut permettre à un attaquant d’introduire des données malveillantes dans le système, entraînant des conséquences néfastes telles que le vol de données, l’exécution de code non autorisé ou la corruption de données.
- CWE-22 : Limitation incorrecte d’un chemin d’accès à un répertoire restreint ou Improper Limitation of a Pathname to a Restricted Directory (Stubborn Weaknesses). Cette vulnérabilité survient lorsque le code ne restreint pas correctement l’accès à des fichiers ou répertoires sensibles, permettant potentiellement à un attaquant de naviguer dans la structure de fichiers de l’application et d’accéder à des données confidentielles ou d’exécuter du code non autorisé.
- CWE-78 : Injection de commandes du système d’exploitation ou Improper Neutralization of Special Ele- ments used in an OS Command (Stubborn Weaknesses). Les attaquants peuvent exploiter cette faille en injectant des commandes malveillantes dans les entrées de l’application, qui seront ensuite exécutées avec les privilèges du système d’exploitation. Cela peut permettre à l’attaquant de prendre le contrôle du système, de voler des données ou de perturber le fonctionnement normal de l’application.
- CWE-79 : Neutralisation incorrecte des entrées lors de la génération de pages Web ou Improper Neutralization of Input During Web Page Generation (Stubborn Weaknesses). Cette faille permet à un attaquant d’injecter du code malveillant (JavaScript par exemple) dans une page web. Ce code sera ensuite exécuté par le navigateur des autres utilisateurs, ce qui peut entraîner le vol de leurs informations de session, la modification du contenu de la page ou d’autres actions malveillantes.
- CWE-502 : Désérialisation de données non fiables ou Deserialization of Untrusted Data (Stubborn Weaknesses). La désérialisation est le processus de conversion de données structurées (comme un flux d’octets) en objets. Si des données non fiables sont désérialisées, un attaquant peut manipuler ces données pour exécuter du code arbitraire sur le système, ce qui peut compromettre la sécurité de l’application.
- CWE-798 : Utilisation d’informations d’identification codées en dur (Stubborn Weaknesses). Cette vulnérabilité se produit lorsque des mots de passe, des clés API ou d’autres informations d’identification sensibles sont stockés directement dans le code source de l’application. Cela rend ces informations facilement accessibles à toute personne ayant accès au code, y compris les attaquants potentiels.
- CWE-94 : Contrôle inadéquat de la génération de code ou Use of Hard-coded Credentials. Les attaquants peuvent exploiter cette faille pour injecter du code malveillant dans une application, permettant potentiellement à un attaquant de prendre le contrôle du système ou de voler des données.
- CWE-276 : Permissions par défaut incorrectes ou Incorrect Default Permissions. Si les permissions par défaut sur les ressources (fichiers, répertoires, etc.) ne sont pas correctement configurées, un attaquant pourrait exploiter ces permissions pour accéder à des données sensibles ou modifier le système.
Il est important de noter que l’étude a identifié 38 CWE différentes au total. Bien que ces 8 CWE soient importantes en raison de leur présence dans le Top 25 de MITRE, il est crucial de ne pas négliger les autres vulnérabilités potentielles lors de l’utilisation de Copilot.
Discussion et conclusion
Les résultats de cette étude soulignent un défi majeur dans l’adoption croissante des outils de génération de code basés sur l’IA : la sécurité du code produit. Bien que Copilot et d’autres outils similaires puissent accélérer le développement, ils ne sont pas infaillibles et peuvent introduire une variété de failles de sécurité, dont certaines sont reconnues comme particulièrement critiques.
Il est donc crucial de ne pas considérer ces outils comme une solution miracle, mais plutôt comme des assistants qui nécessitent une supervision attentive. Les développeurs doivent être conscients des risques potentiels et adopter une approche proactive en matière de sécurité. Cela implique de vérifier minutieusement le code généré, d’utiliser des outils d’analyse statique et de suivre les meilleures pratiques de sécurité logicielle.
L’étude suggère également qu’il est nécessaire de développer de meilleures pratiques pour l’utilisation de Copilot et d’outils similaires. Cela pourrait inclure des directives sur la façon d’écrire des invites qui minimisent les risques de générer du code vulnérable, ainsi que des recommandations sur les types de vérifications de sécurité à effectuer.
Implications pour les entreprises
Les implications de cette étude pour les entreprises sont claires : l’adoption d’outils de génération de code basés sur l’IA, tels que GitHub Copilot, ne doit pas se faire au détriment de la sécurité. Bien que ces outils puissent améliorer la productivité, ils ne doivent pas être considérés comme infaillibles.
Les entreprises doivent mettre en place des processus de vérification rigoureux pour garantir la sécurité du code généré. Cela peut inclure :
- Analyses de sécurité continues du code généré par Copilot : L’utilisation régulière d’outils d’analyse statique peut aider à détecter les vulnérabilités connues. Cependant, comme ces outils ne peuvent pas tout détecter, une évaluation manuelle est également nécessaire, notamment par le biais de revues de code approfondies.
- Prévention des failles de sécurité : Les entreprises peuvent mettre en place des contre-mesures de sécurité ciblées, en se basant sur les faiblesses les plus fréquentes identifiées dans l’étude. L’utilisation de la liste CWE Top 25 comme référence pour les audits de sécurité peut également être bénéfique. De plus, l’amélioration des “prompts” (instructions données à l’outil) pour générer du code plus sûr dès le départ est une piste à explorer.
- Formation des développeurs : Il est essentiel de sensibiliser les développeurs aux risques de sécurité liés à l’utilisation de ces outils et de leur fournir les compétences nécessaires pour évaluer et corriger le code généré. La formation devrait porter sur les CWE courantes et les meilleures pratiques de sécurité logicielle.
L’intégration d’outils comme Copilot dans le flux de travail des développeurs doit s’accompagner d’une prise de conscience accrue des enjeux de sécurité. Les entreprises doivent investir dans des processus de vérification robustes et dans la formation continue de leurs développeurs pour garantir la sécurité et la fiabilité de leurs applications.