Skip to main content

Comment utiliser l’IA pour le développement logiciel et la cybersécurité

Écrit par
blog feature ai pink

30 août 2023

0 minutes de lecture

Nous avons vu la technologie évoluer à une vitesse fulgurante, et l’IA s’est imposée à la fois comme une force révolutionnaire et une énigme fascinante. Que vous soyez un développeur chevronné souhaitant élargir votre boîte à outils ou un passionné de sécurité en quête de réponses sur l’IA, entreprendre de démystifier ce domaine en pleine évolution peut être aussi exaltant que déroutant.

Cet article vous servira de boussole pour vous orienter dans le labyrinthe de l’IA. Il a été conçu pour donner aux développeurs comme aux passionnés de sécurité les outils nécessaires non seulement pour comprendre les concepts fondamentaux, mais aussi pour engager des discussions constructives et approfondir le sujet. Nous allons procéder du général au particulier : nous commencerons par examiner les domaines de l’IA sur lesquels nous devons nous concentrer, puis nous décrypterons sa terminologie et mettrons en lumière des pistes qui méritent d’être explorées.

Les catégories de l’IA dans le développement

Après avoir discuté de l’IA avec de nombreuses personnes, j’ai constaté qu’une bonne façon d’organiser ses idées autour des capacités ou technologies de l’IA consiste à les répartir en trois catégories :

  1. Développement assisté par l’IA - Développement faisant appel à l’IA générative pour aider à écrire, relire et documenter du code.

  2. Applications assistées par l’IA - Capacités d’IA intégrées à une application, comme un chatbot.

  3. Outils assistés par l’IA - Outils qui s’appuient sur l’IA intégrée pour améliorer leur efficacité et celle des processus dans lesquels ils sont utilisés.

Dans cet article, nous nous intéresserons au développement assisté par l’IA. Nous parlerons bientôt des autres catégories dans de prochains articles, alors restez à l’affût !

D’autres termes à connaître

Définissons quelques autres termes !

Concepts fondamentaux de l’IA

  • Intelligence artificielle (IA) - Simulation des processus de l’intelligence humaine par des machines, qui leur permet de tirer des enseignements de l’expérience, de s’adapter à de nouvelles informations et d’effectuer des tâches nécessitant habituellement l’intelligence humaine.

  • Traitement automatique du langage naturel (TALN) - Branche de l’IA qui vise à permettre aux ordinateurs de comprendre, d’interpréter et de générer le langage humain.

  • Apprentissage automatique (AA) - Sous-domaine de l’IA qui permet aux systèmes d’améliorer leurs performances sur une tâche donnée en exploitant des données, sans être explicitement programmés à cette fin.

  • Réseaux neuronaux - Modèles informatiques inspirés de la structure et du fonctionnement du cerveau humain, capables d’apprendre les schémas et les relations présents dans les données.

Compréhension du langage et du texte :

  • LLM (grand modèle de langage) - Type de réseau neuronal artificiel entraîné sur une quantité massive de données textuelles, ce qui lui permet de générer du texte semblable à celui d’un humain et de comprendre le langage dans une certaine mesure.

  • Transformer génératif pré-entraîné (GPT) - Architecture avancée de réseau neuronal utilisée pour générer des textes cohérents, semblables à ceux d’un humain, après un entraînement approfondi sur des données linguistiques.

  • Chatbot - Logiciel basé sur l’IA qui échange automatiquement avec les utilisateurs et s’appuie sur le traitement automatique du langage naturel pour comprendre les entrées textuelles ou vocales et y répondre.

Développement assisté par l’IA

Cet article porte sur le développement assisté par l’IA. Nous allons voir comment l’IA nous aide à écrire et à préparer du code de façon plus efficace et productive. Nous commencerons par l’écriture du code, puis nous aborderons les tests, la relecture et la documentation.

Écrire du code

L’application la plus évidente et la plus souvent évoquée de l’utilisation de l’IA pendant le développement est la suggestion de code. Certains outils, comme ChatGPT, peuvent fournir des exemples de code en réponse à vos demandes précises. Vous pouvez donc décrire en langage courant une tâche à effectuer et demander du code, par exemple :

Conversation ChatGPT montrant une demande de méthode Java pour extraire un fichier ZipFile dans un répertoire de destination, suivie d’une réponse introductive.

Voyons le code qu’il génère.

public class ZipExtractor {

    public static void extract(ZipFile zip, String dest) throws I0Exception
        File dir = new File(dest);
        if (!dir.exists ()) {
            dir.mkdirs ();
        }

        Enumeration<? extends ZipEntry> entries = zip.entries();

        while (entries.hasMoreElements ()) {
            ZipEntry entry = entries. nextElement();
            File destFile = new File(dir, entry. getName());

            if (entry.isDirectory()) {
                destFile.mkdirs ();
            } else {
                destFile.getParentFile().mkdirs();

                try (InputStream in = zip.getInputStream (entry);
                    OutputStream out = new FileOutputStream(destFile)) {
                    byte[] buffer = new byte[1024];
                    int len;
                    while ((len = in. read (buffer)) > 0) {
                        out. write (buffer, O, len);
                    }
                }
            }
        }
    }

D’autres outils, comme GitHub Copilot, Amazon CodeWhisperer ou Tabnine, trois exemples bien connus, offrent des fonctionnalités similaires directement dans l’IDE que vous utilisez. Ainsi, pendant que vous écrivez du code, par exemple dans la définition d’une méthode ou un commentaire, les extensions de l’IDE vous suggèrent du code que vous pouvez accepter ou refuser.

Petit avertissement : le code généré ci-dessus contient une vulnérabilité critique, de gravité élevée. Eh oui, les LLM apprennent à partir du code de la communauté, qui regorge de vulnérabilités. Le code qui nous est suggéré peut donc en contenir lui aussi. Il est essentiel de continuer à le tester avec les outils habituels afin de vérifier la sécurité du code généré comme de celui que nous écrivons. Examinez à nouveau le code et voyez si vous repérez la vulnérabilité. Poursuivez votre lecture jusqu’à la section suivante, Tester le code, où nous vous expliquerons le problème et comment le corriger !

Parmi les autres outils intéressants, citons AI Query, un outil d’IA qui génère des requêtes SQL à partir de vos instructions en langage naturel. Il peut être particulièrement utile si, pour des raisons de sécurité, vous cherchez à séparer votre LLM de vos données. Vous pouvez alors vérifier que les requêtes générées ne présentent aucun risque et qu’elles sont adaptées à ce qu’un utilisateur final peut raisonnablement demander compte tenu de ses autorisations. 

Tester le code

Vous êtes ici parce que vous avez repéré la vulnérabilité ? Ou vous n’avez même pas essayé de la trouver et cherchez directement la réponse ? Dans les deux cas, précisons un peu les choses :) La vulnérabilité est un exemple de faille de sécurité Zip Slip. Elle combine une traversée de répertoires et l’écrasement arbitraire de fichiers, et peut même entraîner l’exécution de code arbitraire. Voici la ligne à l’origine de la vulnérabilité :

File destFile = new File(dir, entry.getName());

Commençons par examiner le contenu d’une archive dangereuse. Vous comprendrez probablement alors pourquoi le code ci-dessus est vulnérable. Le fichier suivant peut tout à fait être ajouté à une archive ZIP, conformément aux spécifications du format ZIP.

5 Fri Aug 18  11:04:29 BST 2023 good.sh 20 Fri Aug 18 11:04:42 BST 2023 ../../../../../../../../tmp/evil.sh

Comme vous l’avez sans doute compris, lorsque nous concaténons ce nom de fichier compressé au répertoire de destination, la copie du fichier obtenu est susceptible d’être effectuée dans le répertoire temporaire du système plutôt que dans le répertoire de destination. Il s’agit d’un vecteur d’attaque potentiellement dangereux, et pourtant les outils de génération de code produisent assez souvent ce type de résultat.

Pour corriger le problème, il faut récupérer le nom de fichier canonique après la concaténation et vérifier qu’il se trouve bien dans le répertoire cible, comme suit :

File destFile = new File(dir, entry.getName());
    String canonicalDestinationFile =  destinationfile.getCanonicalPath();
    if (!canonicalDestinationFile.startsWith(canonicalDestinationDirPath + File.separator)) { 
        throw new  ArchiverException("Entry is outside of the target dir: " + e.getName()); 
   }

Je vais ouvrir ce fichier dans l’éditeur IntelliJ, où Snyk est déjà installé. Snyk analyse le code source et, grâce à ses capacités d’IA symbolique, comprend les flux de données et de code dans l’application. Comme le montre la capture d’écran ci-dessous, il a détecté le problème dans le nouveau code (1), fourni une description complète du problème (2) et même proposé des exemples de correction, semblables à celui que nous avons présenté plus haut (3).

IntelliJ IDEA affiche du code Java à côté des résultats de Snyk, qui signalent une vulnérabilité de traversée de chemin de gravité moyenne.

Lancez-vous dans les compétitions Capture The Flag

Apprenez à résoudre des défis Capture The Flag en regardant à la demande notre atelier virtuel d’initiation.

Nous avons mentionné l’IA symbolique, l’un des types d’IA utilisés par Snyk. Il existe aussi d’autres types d’IA, chacun présentant des avantages et des inconvénients selon vos objectifs. Pour en savoir plus, consultez notre guide sur l’utilisation de différents modèles d’IA. Les IA popularisées par ChatGPT s’appuient sur :

  • IA fondée sur l’apprentissage automatique - Approche de l’IA qui permet aux systèmes d’apprendre à partir de données et d’améliorer leurs performances sur une tâche donnée sans être explicitement programmés, avec notamment l’apprentissage supervisé, non supervisé et par renforcement.

  • IA fondée sur les réseaux neuronaux - Sous-domaine de l’apprentissage automatique où des réseaux neuronaux artificiels, inspirés du cerveau humain, servent à reconnaître des schémas, des caractéristiques et des relations dans les données.

  • IA symbolique (ou raisonnement symbolique) - Type d’IA qui représente les connaissances à l’aide de symboles, de règles et de logique pour effectuer des tâches, souvent au moyen d’expressions lisibles par l’humain et d’un raisonnement formel.

  • IA évolutionnaire (ou algorithmes génétiques) - Approche de l’IA qui imite la sélection naturelle afin de faire évoluer et d’optimiser des solutions à des problèmes, souvent pour des tâches d’optimisation et de conception.

  • Systèmes experts - Type d’IA qui reproduit l’expertise humaine dans un domaine précis en s’appuyant sur une base de connaissances composée de faits et de règles pour prendre des décisions ou formuler des recommandations.

Autre outil à découvrir : Codium, un outil basé sur l’IA qui peut analyser votre code, vous expliquer son fonctionnement, créer un plan de test et même générer les tests que vous pouvez copier et intégrer à vos suites de tests unitaires.

Relire le code

Pour examiner du code déjà écrit, comme celui d’une pull request, vous pouvez essayer What the Diff. Cet outil intéressant, basé sur Git, peut résumer les modifications apportées à la PR, vous aider à en rédiger le résumé et même à refactoriser le code qu’elle contient.

Nous avons couvert beaucoup de sujets : écrire, tester et relire du code… Prêt à vous lancer ?  

  1. Veillez à ce que vos modifications n’entraînent pas de régressions ni de problèmes de sécurité. Ceux-ci peuvent concerner la qualité du code ou sa sécurité, comme nous l’avons vu plus haut.

  2. Continuez à utiliser vos outils habituels tout au long du processus de revue et du cycle de développement logiciel (SDLC). L’IA générative ne doit pas les remplacer : vous devez plutôt vous appuyer davantage sur eux, car vous développerez et livrerez probablement plus de code et de fonctionnalités dans le même laps de temps.

  3. Consultez notre antisèche des bonnes pratiques d’utilisation de l’IA dans le SDLC. Les intégrations de Snyk au SDLC, notamment nos intégrations aux PR des dépôts Git, peuvent vous aider à relire votre code dans le cadre de votre flux de travail habituel et à éviter d’introduire des vulnérabilités de première partie ou des vulnérabilités de dépendances tierces, des conteneurs vulnérables ou des problèmes de sécurité ou erreurs de configuration IaC.

Prenez en main la sécurité de l’IA avec Snyk

Découvrez comment Snyk aide à sécuriser le code généré par l’IA de vos équipes de développement, tout en offrant aux équipes de sécurité une visibilité et des contrôles complets.

Publié dans: