Skip to main content

Corrigez automatiquement les vulnérabilités du code grâce à l’IA

Écrit par
feature ai ide dark

14 octobre 2024

0 minutes de lecture

Dans la série d’ateliers SecRel de Snyk destinés à ses clients, nous en proposons un intitulé Breaking AI. Cet atelier explique comment les assistants d’IA générative, comme copilot et codium, peuvent aider les développeurs à écrire du code plus rapidement. L’idée principale de l’atelier, c’est que les assistants d’IA ressemblent à des développeurs juniors qui viennent de terminer leur bootcamp de programmation : ils sont très enthousiastes et serviables, mais vous devez vraiment vérifier leur code (sans vouloir dénigrer les développeurs juniors : nous avons besoin d’eux, et ils sont formidables !). Pendant l’atelier, nous montrons comment associer les assistants d’IA à Snyk pour obtenir un superpouvoir : écrire du code rapidement et en toute sécurité.

Pour reprendre les mots d’un célèbre chef, Snyk vient de « passer à la vitesse supérieure » avec sa fonctionnalité Deep Code AI Fix. Snyk Code a toujours fourni de bonnes recommandations de correction lorsqu’il détecte une vulnérabilité. Il vous proposait même trois exemples pertinents d’autres projets open source présentant la même vulnérabilité, et vous montrait comment ces projets l’avaient corrigée. Désormais, grâce aux données soigneusement sélectionnées par l’équipe de recherche en sécurité de Snyk et à un modèle d’IA hybride qui associe la puissance de l’IA générative et symbolique ainsi que des modèles de machine learning, Snyk peut corriger automatiquement de nombreuses vulnérabilités courantes directement dans votre IDE préféré.

Dans cet article, je vais vous montrer comment tirer le meilleur parti de Deep Code AI Fix (DCAIF) dans un exemple de projet Java que nous utilisons lors de nos ateliers. Vous trouverez le code source ici. REMARQUE : ce projet contient volontairement plusieurs vulnérabilités et ne convient pas à un environnement de production.

Amusons-nous avec une application de planification de conférences

Si vous avez déjà participé à une conférence technologique ou pris la parole lors d’un tel événement, vous savez que créer et présenter le programme est l’un des aspects les plus difficiles.

L’application de référence en est une version assez catastrophique (je ne suis PAS un bon développeur front-end !), mais elle permet de montrer comment du code peut fonctionner sur le plan technique tout en étant vulnérable.

C’est une application Spring Boot qui utilise le moteur de templates Thymeleaf. Au démarrage, elle génère des données aléatoires sur les intervenants, les titres des présentations et leur description à l’aide de la bibliothèque populaire faker. Les titres et les descriptions des présentations sont tous tirés du livre Le Guide du voyageur galactique. REMARQUE : les titres et descriptions ne sont pas tous forcément adaptés au milieu professionnel. Vous voilà prévenus !

Chaque intervenant généré pour l’événement dispose également d’une page dédiée où figure la liste de ses présentations à la conférence. Nous allons nous concentrer sur cette partie de l’application.

Pour compiler et exécuter l’application, lancez la commande suivante :

mvn clean install
mvn spring-boot:run

Lorsque vous exécutez l’application, vous voyez, en plus de la bannière Spring Boot habituelle et des autres messages, quelque chose comme ceci :

Access talks for heath.davis at: http://localhost:8081/talks?username=heath.davis
Access talks for russell.bernier at: http://localhost:8081/talks?username=russell.bernier
Access talks for kenyetta.jones at: http://localhost:8081/talks?username=kenyetta.jones
Access talks for howard.bailey at: http://localhost:8081/talks?username=howard.bailey
Access talks for buddy.jast at: http://localhost:8081/talks?username=buddy.jast
Access talks for jeanice.kertzmann at: http://localhost:8081/talks?username=jeanice.kertzmann
Access talks for deborah.hamill at: http://localhost:8081/talks?username=deborah.hamill
Access talks for horacio.renner at: http://localhost:8081/talks?username=horacio.renner
Access talks for winfred.schuster at: http://localhost:8081/talks?username=winfred.schuster
Access talks for tommie.hane at: http://localhost:8081/talks?username=tommie.hane
Access talks for micah at: http://localhost:8081/talks?username=micah

REMARQUE : le résultat ne sera pas exactement identique, car les intervenants et leurs présentations sont générés aléatoirement à chaque démarrage de l’application.

Si vous cliquez sur l’un des liens ou le copiez-collez, vous verrez la page d’un intervenant avec la liste de ses présentations :

Page web d’une conférence Java présentant une liste consultable de présentations, avec les noms des intervenants, les titres, les descriptions ainsi que les dates de début et de fin.

À vous de jouer : trouvez la vulnérabilité

Examinez TalkController.java. C’est ainsi que la page d’un intervenant est générée. Saurez-vous repérer la vulnérabilité ?

Nous ne voulons pas vous obliger à vous fier à vos yeux ! Nous voulons que les développeurs puissent avancer vite ET écrire du code sécurisé.

J’utilise IntelliJ Idea pour développer mes applications Java. J’utilise aussi l’extension IDE de Snyk. Bonne nouvelle : Snyk propose des extensions pour les IDE les plus populaires, avec la prise en charge d’un large éventail de langages de programmation.

Si vous souhaitez suivre les étapes et que vous n’avez pas de compte Snyk, vous pouvez en créer un gratuitement ici.

Ai-je précisé que cette application contient de nombreuses vulnérabilités ? C’est parce que nous l’utilisons dans nos ateliers. Je veux me concentrer sur celle qui se trouve dans TalkController.java :

IDE affichant une vulnérabilité de type cross-site scripting mise en évidence dans TalkController.java, avec les résultats de Snyk et une comparaison avec une correction par échappement HTML
  1. Indique qu’une vulnérabilité de type cross-site scripting (XSS) a été détectée

  2. Affiche un diff provenant de l’un des trois projets open source présentant la même vulnérabilité. Il montre comment celle-ci a été corrigée (la partie verte).

  3. Le soulignement rouge ondulé indique l’emplacement de la vulnérabilité dans le code.

Toutes ces informations sont très utiles pour résoudre le problème. Remarquez toutefois le petit éclair (⚡️) situé à gauche de la vulnérabilité n° 1. Il indique que cette vulnérabilité peut être corrigée automatiquement.

Si vous placez le pointeur de la souris sur le soulignement rouge ondulé, l’option Corriger ce problème s’affiche :

Éditeur de code affichant une alerte de vulnérabilité de script intersite et une correction suggérée pour une entrée de paramètre HTTP non assainie.

Avant d’examiner le résultat de Deep Code AI Fix, voyons ce que copilot ferait à notre place.

Voici l’invite que j’ai donnée à copilot à la ligne 42, ainsi que le code qu’il insère :

// guard against XSS
username = username.replaceAll("<", "&lt;").replaceAll(">", "&gt;");

Cela pourrait fonctionner contre des attaques naïves, mais est-ce que cela résisterait à tous les types d’attaques XSS ? J’en doute. En fait, lorsque je relance l’analyse Snyk, la vulnérabilité XSS est toujours présente.

Voyons la correction proposée par Snyk :

String usernameStr = "<h1>" + HtmlUtils.htmlEscape(username) + "'s talks<h1>";

Là, ça, j’aime. La solution adopte une approche idiomatique et attendue, à l’aide d’une bibliothèque intégrée à Spring Boot : HtmlUtils. Je suis convaincu qu’elle assainira complètement la valeur saisie : username. Une nouvelle analyse Snyk confirme que la vulnérabilité a disparu.

Notification de Snyk félicitant l’utilisateur d’avoir corrigé une faille de script intersite (XSS), avec des options de retour positif et négatif.

On applaudit ! Non seulement la correction automatique de Snyk a éliminé la vulnérabilité, mais elle l’a fait en respectant le framework utilisé, Spring Boot dans ce cas.

DCAIF ne vous ralentira pas

Dans cet article, je vous ai montré comment Deep Code AI Fix de Snyk va au-delà des simples recommandations de correction et peut effectuer une correction à votre place. Vous pouvez également en vérifier l’efficacité en constatant que la vulnérabilité initiale a disparu.

Chez Snyk, nous apprécions les assistants d’IA, mais ils ne sont pas très performants en matière de sécurité. Nos recherches montrent que les IA génératives actuelles produisent du code non sécurisé à peu près aussi souvent que les humains, soit environ 40 % du temps. C’est logique : les solutions purement génératives comme Copilot entraînent leurs modèles principalement sur du code existant. L’approche hybride de Snyk, qui combine IA symbolique, IA générative, machine learning et données d’entraînement sélectionnées par notre équipe de sécurité, privilégie la sécurité.

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.