Skip to main content

Comment corriger les problèmes de sécurité Java pendant le codage dans IntelliJ IDEA

Écrit par
Blog Design IntelliJ IDEA

8 avril 2021

0 minutes de lecture

Aujourd’hui, les développeurs ne sont pas seulement responsables de la création de l’application. En plus de travailler sur les fonctionnalités, ils doivent veiller à sa maintenabilité, à son évolutivité, à sa fiabilité et à sa sécurité. Beaucoup ne savent pas par où commencer pour sécuriser leurs applications. De plus, la plupart des entreprises s’appuient encore sur une équipe de sécurité dédiée au lieu d’intégrer cette expertise au sein des équipes de développement.

Beaucoup de développeurs passent pratiquement toute leur journée dans leur environnement de développement intégré (IDE). Un bon IDE est un véritable couteau suisse : c’est l’outil auquel on fait appel pour presque tout. Pouvoir y trouver tout ce dont j’ai besoin pour créer, exécuter, tester, déboguer et sécuriser mon application en fait un outil indispensable pour de nombreux développeurs.

Le rapport Snyk Java Ecosystem de l’an dernier nous apprend qu’IntelliJ IDEA est l’IDE le plus populaire et le plus utilisé dans l’écosystème de la sécurité Java. Snyk a récemment lancé un nouveau plugin d’analyse des vulnérabilités pour les IDE IntelliJ. Voyons comment intégrer la sécurité et le développement sécurisé à cet IDE grâce à ce nouveau plugin.

Avant de commencer, voici un bref aperçu des sujets abordés dans cet article :

Secure Coding with IntelliJ

Je vous recommande de passer en plein écran pour mieux voir les exemples de code.

Snyk Vulnerability Scanner pour IntelliJ IDEA

Il n’existait pas déjà un plugin Snyk pour IntelliJ IDEA ?

Si, mais l’ancien plugin se concentrait exclusivement sur l’analyse de Snyk Open Source et aidait à détecter et à corriger les vulnérabilités dans les dépendances open source. Le nouveau plugin intègre également les fonctionnalités récemment lancées de Snyk Code, qui aident les développeurs à plusieurs niveaux.

Installer le plugin IDE de Snyk

La méthode recommandée pour installer le plugin consiste à passer par la marketplace d’IntelliJ IDEA. Il vous suffit de rechercher « snyk » dans la marketplace des plugins d’IntelliJ IDEA pour le trouver.

Marketplace des plugins IntelliJ IDEA affichant les résultats de recherche pour Snyk Vulnerability Scanner avec un bouton Installer

Après avoir installé le plugin et redémarré l’IDE, vous devez l’authentifier. Pour utiliser le plugin, vous devez disposer au minimum d’un compte Snyk gratuit. Si vous avez déjà un compte Snyk, il vous suffit de vous connecter. Si vous découvrez Snyk, le processus d’intégration vous guidera pour créer un compte gratuit.

Intégration de Snyk Code dans IntelliJ IDEA

Comme indiqué plus haut, la version précédente du plugin Snyk pour IntelliJ IDEA exploitait uniquement les fonctionnalités de Snyk Open Source. Elle vous permettait d’analyser vos projets à la recherche de vulnérabilités de sécurité dans vos dépendances open source. Avec le nouveau plugin, vous pouvez également utiliser les fonctionnalités de Snyk Code en complément de l’analyse Snyk Open Source. Snyk Code est un produit de sécurité qui analyse statiquement votre code pour détecter les constructions potentiellement vulnérables que vous ou votre équipe avez créées. Avec un seul plugin, vous pouvez ainsi sécuriser l’ensemble de votre application. Voyons cela en pratique.

Corriger les vulnérabilités de sécurité dans IntelliJ

Après avoir analysé mon application, plusieurs sections s’affichent à l’écran. La première présente l’analyse Snyk Open Source bien connue. Elle m’indique que j’inclus des bibliothèques, directes ou transitives, qui présentent des vulnérabilités connues. L’une d’elles est snakeyaml, version 1.24. Cette version est vulnérable aux attaques par déni de service. J’ai expliqué le fonctionnement de cette attaque et comment l’éviter dans l’article Prévenir les vulnérabilités liées à l’analyse YAML avec snakeyaml en Java.

La solution est très simple. Il suffit de passer à la version 1.26 ou à une version ultérieure pour corriger la vulnérabilité. Notez que la version qui corrige le problème n’est pas nécessairement la dernière version disponible. C’est la version la plus proche qui ne présente pas cette vulnérabilité. Après avoir mis à jour la version dans mon fichier pom et relancé l’analyse de l’application, la vulnérabilité a disparu. Les conseils pratiques de correction des vulnérabilités fournis par le plugin Snyk pour IntelliJ IDE indiquent très clairement comment résoudre le problème.

IntelliJ IDEA et le panneau Snyk mettent en évidence une vulnérabilité par déni de service dans snakeYAML et sa correction dans la version 1.26.

Analyser le code à la recherche de vulnérabilités de sécurité

La section suivante présente les vulnérabilités de code détectées par le plugin Snyk. Les fonctionnalités de Snyk Code signalent les défauts de mon code susceptibles d’entraîner des vulnérabilités de sécurité spécifiques.

Le premier problème est une « traversée de chemin ». Le plugin Snyk pour IntelliJ IDEA m’indique où se trouve le problème et quel est le flux de données. Pour le moment, j’écris un fichier sur le disque sans vérifier son nom réel. Si le nom de fichier contient quelque chose comme « ../../../textfile.txt », mon code n’enregistrera pas le fichier au bon endroit. Ce nom de fichier remonte dans l’arborescence et sort du dossier de destination. Le fichier se retrouve donc quelque part sur mon système où je ne souhaite pas qu’il soit. Plus important encore, selon les privilèges du processus, il peut écraser des fichiers existants en dehors du dossier de destination, n’importe où sur le système.

Panneau de sécurité du code IntelliJ mettant en évidence une vulnérabilité de traversée de chemin dans UploadController.java à la ligne 50, avec le flux de données vers Files.write affiché.

Pour éviter cela, je peux vérifier que le chemin canonique du nouveau fichier commence par le chemin de la destination souhaitée, comme ci-dessous.

Path path = Paths.get(UPLOADED_FOLDER + file.getOriginalFilename());
String target = new File(UPLOADED_FOLDER).getCanonicalPath();
if (path.toFile().getCanonicalPath().startsWith(target)) {
   Files.write(path, bytes);
}

La traversée de chemin ne fonctionnera alors plus, car le fichier ne pourra pas être enregistré en dehors de mon dossier de destination. Après avoir relancé l’analyse de mon application, je constate que Snyk Code confirme mon constat.

Prenons un autre exemple. D’après l’inspection du code, j’ai créé une vulnérabilité d’injection SQL à la ligne 33 de mon fichier MessageController.java. En examinant le flux de données, je constate que l’injection SQL se trouve en réalité dans MessageRepo.java.  Il est extrêmement utile que Snyk Code puisse analyser plusieurs fichiers pour détecter ce problème inter-fichiers, car peu d’outils en sont capables. À cause de MessageController, l’injection SQL est accessible depuis l’extérieur et constitue une menace immédiate que je dois éliminer.

Interface Snyk mettant en évidence une vulnérabilité d’injection SQL et un flux de données en cinq étapes dans le code Java du contrôleur et du dépôt.

Maintenant que je connais le problème, je vais corriger le code dans MessageRepo.java. Je ne vais plus concaténer directement le paramètre à la chaîne de requête, mais utiliser une requête préparée avec des paramètres. Si j’implémente la requête préparée comme ci-dessous et que je relance l’analyse de mon application, notre plugin ne signalera plus cette vulnérabilité.

String query = "SELECT * FROM message WHERE text LIKE ?";
PreparedStatement statement = connection.prepareStatement(query);
statement.setString(1, text);
ResultSet result = statement.executeQuery();

Pour en savoir plus sur la prévention des injections SQL, consultez également notre très pratique antisèche sur la prévention des injections SQL.

Qualité du code

En plus d’analyser les vulnérabilités de sécurité dans vos dépendances open source et dans votre propre code, le plugin Snyk pour IntelliJ IDEA peut également vous aider à améliorer la qualité de votre code.

Dans l’exemple ci-dessous, le plugin Snyk signale que je ne ferme pas certaines connexions. Cela peut entraîner des fuites de ressources. Pour les éviter, il faut fermer les ressources dans un bloc finally.

Le plugin Snyk pour IntelliJ affiche des problèmes de qualité du code de gravité moyenne dans MessageRepo.java, notamment des avertissements signalant que des requêtes et des instructions de base de données ne sont pas fermées.

Intégrez dès aujourd’hui la sécurité à IntelliJ IDEA

Le Snyk Vulnerability Scanner pour IntelliJ IDEA est en quelque sorte un outil tout-en-un pour les développeurs Java. En associant la puissance de l’analyse Snyk Open Source à celle de Snyk Code, il met à votre disposition un nouvel outil performant pour éviter les erreurs de sécurité dans vos applications. La fonctionnalité dédiée à la qualité du code est également un excellent atout pour l’équipe. Notez que vous pouvez configurer le plugin selon vos préférences, par exemple si vous ne souhaitez pas exécuter l’analyse de la qualité du code.

Quoi qu’il en soit, les développeurs Java comme vous et moi doivent assumer la responsabilité des applications qu’ils créent, notamment en évitant les problèmes de sécurité. Avec le plugin Snyk pour IntelliJ IDEA, vous pouvez le faire facilement depuis votre IDE préféré. Pourquoi ne pas l’essayer ?

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.