Les outils de génération de code visent à générer automatiquement du code fonctionnel basé sur des invites, qui peuvent inclure des descriptions textuelles (commentaires), du code (tel que des signatures de fonction, des expressions, des noms de variables, etc.) ou une combinaison de texte et de code. Après avoir écrit un code ou un commentaire initial, les développeurs peuvent s'appuyer sur des outils de génération de code pour compléter le code restant.
Cette approche peut permettre de gagner du temps de développement et accélérer le processus de développement logiciel. Les outils de génération de code automatisés ont toujours été un sujet de discussion actif en matière de recherche.
Certains des premiers travaux remontent aux années 1960, lorsque Waldinger et Lee ont proposé un synthétiseur de programmes appelé PROW, qui générait automatiquement des programmes LISP basés sur des spécifications fournies par les utilisateurs sous la forme de calcul de prédicats.
À mesure que les langages informatiques continuaient d'évoluer, de plus en plus de langages de programmation ont commencé à prendre en charge la métaprogrammation, rendant la technologie de génération de code automatisée plus efficace et plus flexible. Ces dernières années, le développement rapide des technologies d’intelligence artificielle, notamment sous la forme de modèles d’apprentissage automatique et d’apprentissage profond, a accéléré le développement des technologies de génération de code.
Les progrès récents dans la génération de code sont accompagnés de l’émergence des grands modèles linguistiques (LLM). Les LLM sont des modèles d'apprentissage en profondeur formés sur un vaste corpus de code/texte doté de puissantes capacités de compréhension du langage qui peuvent être utilisées pour des tâches telles que la génération de langage naturel, la classification de texte et les systèmes de questions-réponses.
Par rapport aux méthodes d'apprentissage en profondeur précédentes, les derniers développements en matière de LLM, tels que les modèles Generative Pre-trained Transformer (GPT), ont ouvert de nouvelles opportunités pour remédier aux limites de la technologie de génération de code automatisée existante.
Actuellement, les outils de génération de code basés sur les LLM ont également été largement appliqués, tels que Codex d'OpenAI, AlphaCode de DeepMind et CodeWhisperer d'Amazon.
Le cas de GitHub Copilot
Qu'est-ce que c'est ?
GitHub décrit Copilot comme l'équivalent IA de la « programmation en paire », dans laquelle deux développeurs travaillent ensemble sur un seul ordinateur. L'idée est qu'un développeur peut apporter de nouvelles idées ou repérer des problèmes que l'autre développeur aurait pu manquer, même si cela nécessite plus d'heures de travail.
Dans la pratique, cependant, Copilot est plutôt un outil utilitaire de gain de temps, qui intègre les ressources que les développeurs devraient autrement chercher ailleurs. Lorsque les utilisateurs saisissent des données dans Copilot, l'outil leur suggère des extraits de code à ajouter en cliquant sur un bouton. Ainsi, ils n'ont pas à passer du temps à chercher dans la documentation de l'API ou à rechercher des exemples de code sur des sites spécialisés.
GitHub Copilot peut vous fournir des suggestions de code à partir d’un commentaire en langage naturel décrivant ce que vous voulez que le code fasse. GitHub Copilot est disponible pour plusieurs langages et frameworks, tels que Python, JavaScript, TypeScript, Ruby, Go, Java, C#, HTML, CSS et SQL.
Du code non sécurisé
Dans l'étude intitulée Security Weaknesses of Copilot Generated Code in GitHub, des chercheurs ont mené une étude empirique en analysant les faiblesses de sécurité dans les extraits de code générés par GitHub Copilot qui font partie de projets publics hébergés sur GitHub. L’objectif est d’investiguer les types de problèmes de sécurité et leur ampleur dans des scénarios réels (plutôt que des scénarios élaborés).
À cette fin, ils ont identifié 435 extraits de code générés par GitHub Copilot à partir de projets accessibles au public. Ils ont ensuite effectué une analyse de sécurité approfondie pour identifier les instances CWE (Common Weakness Enumeration) dans ces extraits de code.
Les résultats montrent que :
- 35,8 % des extraits de code générés par Copilot contiennent des CWE, et que ces problèmes sont répartis dans plusieurs langages;
- les faiblesses de sécurité sont diverses et liées à 42 CWE différents, dans lesquels CWE-78 : Injection de commandes du système d'exploitation , CWE-330 : Utilisation de valeurs insuffisamment aléatoires et CWE-703 : Vérification ou gestion incorrecte de conditions exceptionnelles se sont produites le plus fréquemment, et
- parmi les 42 CWE identifiés, 11 d'entre eux appartiennent au Top-25 CWE 2022 actuellement reconnu.
Envoyé par chercheurs
Interprétation des résultats
RQ1 : Dans quelle mesure le code généré par Copilot est-il sécurisé ?
Parmi les 435 extraits de code générés par Copilot, nous avons constaté que 35,8 % de ces extraits de code contiennent des failles de sécurité. Ces faiblesses apparaissent dans les six langages de programmation les plus utilisés pris en charge par Copilot. De plus, lorsqu’il s’agit de l’apparition de problèmes de sécurité dans des extraits de code de différents langages de programmation, il est important de les analyser en fonction de la popularité de ces langages. Dans les extraits de code écrits dans des langages comme Python et JavaScript, qui sont fréquemment utilisés avec Copilot, le nombre de problèmes de sécurité peut être légèrement plus élevé. Cependant, globalement, la proportion de problèmes de sécurité dans ces six langues varie de 25 % à 45 %, ne montrant pas de différence significative.
En outre, nous avons également constaté que les problèmes CWE-502: Désérialisation de données non fiables et CWE-400 : Consommation de ressources non contrôlée apparaissaient principalement dans des extraits de code écrits en Python et JavaScript. Cela pourrait être attribué à certaines fonctionnalités qui rendaient leur code plus flexible, telles que le typage dynamique et l'interprétation dynamique. Par conséquent, les développeurs doivent accorder une attention particulière à la sécurité de leur code généré par JavaScript et Python, en prenant les mesures appropriées pour valider les données d'entrée et gérer efficacement les ressources afin de minimiser les risques de sécurité. Les résultats de RQ1 suggèrent que dans la production pratique, bien que Copilot puisse aider les développeurs à écrire du code plus rapidement et à augmenter la productivité, des évaluations de sécurité et des correctifs supplémentaires sont également nécessaires pour garantir que le code généré n'introduit pas de risques de sécurité potentiels.
QR2 : Quelles failles de sécurité sont présentes dans les extraits de code générés par GitHub Copilot ?
Après avoir effectué une évaluation de sécurité de 425 extraits de code générés par Copilot, un total de 600 failles de sécurité ont été identifiées, impliquant 42 types de CWE, soit environ 10 % des CWE (439 types de CWE) dans le développement de logiciels. Cela peut être dû au fait que Copilot génère du code dans différents langages de programmation et scénarios d'application, et qu'une grande variété de scénarios d'application peut conduire à divers types de problèmes de sécurité. De plus, étant donné que le modèle de base Copilot (Codex) est formé sur des données accessibles au public qui contiennent potentiellement divers types de failles de sécurité, cela peut conduire à la présence de plusieurs CWE dans le code généré par Copilot. Cet ensemble de 42 types de CWE couvre de nombreux types de problèmes de sécurité, et le tableau 10 montre les types de problèmes de sécurité pour lesquels ces 42 CWE sont pertinents.
La diversité des failles de sécurité indique que les développeurs utilisant Copilot sont confrontés à divers risques de sécurité. Ces risques sont divers et couvrent différents environnements de développement et scénarios d’application. Dans le même temps, cela reflète également le caractère inévitable des failles de sécurité dans le code généré par Copilot. Les développeurs doivent avoir une sensibilisation et des compétences en matière de sécurité correspondantes et prendre des mesures de sécurité appropriées pour éviter ces risques de manière opportune et ciblée. De plus, nous pouvons constater que les développeurs rencontrent souvent CWE-78 : OS Command Injection, CWE-330 : Utilisation de valeurs insuffisamment aléatoires et CWE-703 : Mauvaise vérification ou gestion des valeurs exceptionnelles.
Conclusion
Les chercheurs ont également examiné les causes possibles des faiblesses de sécurité dans le code généré par Copilot. Ils ont identifié trois facteurs principaux :
- Le manque de contexte : Copilot génère du code en se basant sur le commentaire ou le nom de la fonction, mais il ne prend pas en compte le contexte global du projet ou les exigences de sécurité spécifiques. Par exemple, il peut générer du code qui utilise des fonctions obsolètes ou dangereuses, ou qui ne respecte pas les bonnes pratiques de codage.
- La qualité des données d’entraînement : Copilot s’entraîne sur des milliards de lignes de code provenant de sources publiques, mais il ne filtre pas les données qui peuvent contenir des erreurs, des bugs ou des vulnérabilités. Par conséquent, il peut reproduire les mêmes problèmes dans le code qu’il génère.
- L’absence de vérification : Copilot ne vérifie pas la validité, la fonctionnalité ou la sécurité du code qu’il génère. Il se contente de proposer des suggestions qui peuvent être acceptées ou rejetées par les développeurs. Il incombe donc aux développeurs de tester et de réviser le code généré avant de l’intégrer à leur projet.
Les chercheurs concluent que GitHub Copilot est un outil puissant et innovant qui peut aider les développeurs à écrire du code plus rapidement et plus facilement, mais qu’il présente également des risques de sécurité importants qui doivent être pris en compte. Ils recommandent aux développeurs d’utiliser Copilot avec prudence et discernement, et de ne pas faire confiance aveuglément au code généré. Ils suggèrent également aux concepteurs de Copilot d’améliorer la qualité des données d’entraînement, d’ajouter des mécanismes de vérification et de sensibilisation à la sécurité, et de fournir plus d’informations sur le fonctionnement interne et les limites de l’outil .
Source : rapport
Et vous ?
Quelles sont les conséquences potentielles des faiblesses de sécurité dans le code généré par Copilot pour les développeurs et les utilisateurs ?
Quelles sont les responsabilités des développeurs, des concepteurs de Copilot, pour assurer la sécurité du code généré par Copilot ?
Quelles sont les bonnes pratiques ou les outils que vous utilisez ou recommandez pour vérifier et améliorer la sécurité du code généré par Copilot ?
Quels sont les avantages et les inconvénients de l’utilisation de Copilot par rapport à d’autres méthodes de programmation ?
Quelles sont vos attentes ou vos suggestions pour l’évolution future de Copilot et des outils similaires de génération de code basés sur l’IA ?