Remédier aux vulnérabilités de type traversée de chemin en Java avec Snyk Code
6 mars 2023
0 minutes de lectureLes failles de sécurité de type « traversée de chemin » peuvent apparaître lorsqu’une application ou un service Web permet à un pirate d’accéder à des fichiers ou à des répertoires du serveur qui se trouvent en dehors de l’arborescence prévue. Cela peut aboutir à une lecture ou modification non autorisée de données sensibles. Dans le contexte du chargement de fichiers, une vulnérabilité de traversée de chemin peut se manifester lorsqu’une application ne valide pas correctement le chemin d’accès au fichier spécifié par l’utilisateur, ce qui permet à un attaquant d’envoyer un fichier malveillant dont le nom lui donne accès à des fichiers à accès restreint sur le serveur.
Pour assurer la sécurité des applications Java, il est donc essentiel d’éviter les traversées de chemin liées au chargement de fichiers. Dans cet article, nous allons nous pencher plus en détail sur la traversée de chemin dans le cadre des chargements de fichiers et vous montrer comment éviter ce type de vulnérabilité dans les applications Java à l’aide de Snyk Code.
Que vous soyez développeur ou simplement désireux d’en savoir plus sur la sécurité en Java, cet article vous propose des informations et des points de vue qui vous permettront d’assurer la sécurité de vos applications Java.
Comprendre la traversée de chemin dans le contexte des chargements de fichiers
Prenons le cas d’une application permettant aux utilisateurs d’envoyer des photos de profil. L’application stocke les photos de profil dans un répertoire sur le serveur, par exemple /images/profiles/
. Si l’application ne valide pas correctement le nom de fichier spécifié par l’utilisateur, un pirate pourrait charger un fichier malveillant avec un nom du type ../../etc/passwd
. Cela lui permettrait d’accéder à des fichiers système sensibles situés hors de l’arborescence prévue.
Prenons l’exemple suivant, qui concerne une application Spring Boot utilisant Thymeleaf.
1@PostMapping("/uploadimage")
2public String uploadImage (Model model, @RequestParam("image") MultipartFile file) throws IOException {
3 var name = file.getOriginalFilename().replace(" ", "_");
4 var fileNameAndPath = Paths.get(UPLOAD_DIRECTORY, name);
5 Files.write(fileNameAndPath, file.getBytes());
6 model.addAttribute("msg", "Uploaded images: " + name);
7 return "person/upload";
8}
Les formulaires Web sont très utilisés pour envoyer des images. Lors du chargement, nous utilisons le champ originalFilename
du MultipartFile
entrant. Si nous interceptons et inspectons l’appel HTTP POST, nous constatons que filename
est simplement une métadonnée dans cette requête HTTP, montrée à la ligne 24.
Avec les bons outils, il est facile de remplacer le nom de fichier par ce que l’on veut ! Si nous changeons le nom de fichier en ../../../../../../../etc/passwd
, notre code enverra le fichier vers images/profiles/../../../../../../../../../../etc/passwd
. Le chemin sera parcouru jusqu’à la racine et le fichier écrasera /etc/passwd
.
Méthode de détection des traversées de chemin par Snyk Code
Snyk Code est un outil SAST qui aide les développeurs Java à identifier en temps réel les vulnérabilités de leurs applications, notamment les traversées de chemin dans les chargements de fichiers. Il utilise une analyse statique basée sur un modèle d’apprentissage automatique avancé pour analyser votre code et identifier les risques de sécurité potentiels.
En ce qui concerne les traversées de chemin, Snyk Code peut vous aider à identifier les endroits de votre code où des chemins de fichiers spécifiés par l’utilisateur sont utilisés sans aucune validation appropriée. Par exemple, quand j’ai connecté mon dépôt GitHub à Snyk, Snyk Code m’a montré le problème de traversée de chemin dans l’interface Web.
Je peux ensuite utiliser le plugin Snyk pour IntelliJ IDEA en ayant activé Snyk Code. L’analyse effectuée sur ma machine locale au cours du développement a déjà mis en évidence le problème de traversée de chemin au niveau de mes chargements de fichiers. Il m’a également donné quelques suggestions d’actions correctives possibles.
En utilisant Snyk Code, vous pouvez identifier et corriger de manière proactive ces vulnérabilités de traversée de chemin, avant qu’elles ne soient exploitées, contribuant ainsi à garantir la sécurité de votre application et des données qu’elle traite.
Pour résumer, Snyk Code aide les développeurs Java à identifier les vulnérabilités de traversée de chemin dans le cadre de chargements de fichiers en analysant leur code et en identifiant les zones où aucune validation appropriée n’est en place. Cela vous aide à assurer la sécurité de votre application et à vous protéger contre les attaques potentielles.
Remédier aux risques de traversée de chemin dans les chargements de fichiers
La manière la plus simple de corriger une vulnérabilité de traversée de chemin consiste à éviter d’utiliser file.getOriginalFilename()
. En générant vous-même le nom du fichier, vous disposez d’un contrôle absolu sur l’emplacement de stockage du fichier, car cet emplacement dépend en partie de la saisie de l’utilisateur.
Toutefois, si vous souhaitez conserver le nom du fichier d’origine, il convient de vérifier si l’emplacement de stockage correspond effectivement à celui désiré. Snyk Code (voir l’exemple du plugin IDE) a déjà indiqué que nous pouvons normaliser (normalize
) le chemin.
Modifions notre exemple précédent pour vérifier si le chemin normalisé commence au moins par le dossier de chargement prévu. Cela nous permet d’éviter les problèmes de traversée de chemin.
Note du rédacteur : 31 mars 2023
Ce bloc de code a été mis à jour.
1@PostMapping("/uploadimage")
2public String uploadImage (Model model, @RequestParam("image") MultipartFile file) throws IOException {
3 var name = file.getOriginalFilename().replace(" ", "_");
4 var fileNameAndPath = Paths.get(UPLOAD_DIRECTORY, name);
5
6 if (!fileNameAndPath.normalize().startsWith(UPLOAD_DIRECTORY)) {
7 throw new IOException("Could not upload file: " + name);
8 }
9
10 Files.write(fileNameAndPath, file.getBytes());
11 model.addAttribute("msg", "Uploaded images: " + name);
12 return "person/upload";
13}
14
Il est essentiel de prévenir les vulnérabilités liées aux traversées de chemin.
Les vulnérabilités de traversée de chemin constituent une menace sérieuse pour la sécurité des applications Web Java et figurent actuellement parmi les principaux problèmes de sécurité détectés par Snyk dans le code Java.
Les développeurs doivent en avoir conscience et bien comprendre comment les éviter. En implémentant une validation appropriée et en utilisant des outils comme Snyk Code pour identifier les vulnérabilités potentielles, les développeurs peuvent assurer la sécurité de leurs applications et se protéger contre les risques de ces attaques. Il est essentiel de garder à l’esprit que la sécurité est un processus continu : le fait de rester vigilant et proactif en matière d’identification et de correction des vulnérabilités s’avère déterminant pour le maintien de la sécurité de vos applications Java.
Corriger ses vulnérabilités de traversée de chemin et décrocher des récompenses sympas au passage
Le concours de correction des vulnérabilités de Snyk, intitulé « The Big Fix », se déroule du 14 février au 14 mars. Participez à la compétition et corrigez les vulnérabilités de vos projets personnels ou d’un projet open source que vous utilisez fréquemment. Si vous venez de découvrir que votre application présente une vulnérabilité de traversée de chemin, ajoutez votre projet à The Big Fix. Le simple fait de corriger une vulnérabilité vous permettra de gagner un T-shirt The Big Fix 2023 en édition limitée, les meilleurs contributeurs de cette année étant également en compétition pour d’autres prix fabuleux.
Alors, qu’attendez-vous ? Rejoignez The Big Fix et commencez à sécuriser votre application dès aujourd’hui.
Cap sur la capture du drapeau
Découvrez comment résoudre les défis de capture du drapeau en regardant notre atelier virtuel à la demande.