ArticleCybersécurité & Conformité
Les clients FTP Java et Python, trappes à vulnérabilités XXE
Le chercheur en sécurité Alexander Klink a découvert que des pirates pourraient tromper les applications Java et Python pour exécuter des commandes FTP et ouvrir des ports dans les pare-feux en exploitant une vulnérabilité XML External Entity.

Les runtimes Java et Python ne savent pas valider correctement les URL FTP. Cette incapacité pourrait permettre à des attaquants de faire des trous dans les pare-feux pour accéder aux réseaux locaux. C’est ce qu’a expliqué samedi dernier le chercheur en sécurité Alexander Klink quand il a fait la démonstration d’une attaque exploitant une vulnérabilité XXE (XML External Entity) dans une application Java pour envoyer des courriels. Les failles XXE peuvent être utilisées pour inciter les applications à analyser des fichiers XML spécialement conçus qui forcent l'analyseur syntaxique XML à divulguer des informations sensibles comme des fichiers, des listes d'annuaire ou même des informations sur les processus en cours d'exécution sur le serveur. Alexander Klink a montré qu’il était possible d’utiliser ce même type de vulnérabilités pour tromper le runtime Java et le pousser à ouvrir des connexions FTP avec des serveurs distants en le bombardant d’URL FTP sous forme ftp://user:password@host:port/file.ext.
Il s'avère que l’implémentation du client FTP intégrée dans Java ne filtre pas les caractères spéciaux CR (retour de chariot) et LF (saut de ligne) des URL et les interprète réellement. La présence de tels caractères dans les parties utilisateur ou mot de passe d'une URL FTP peut tromper le client FTP Java et le pousser à exécuter des commandes malveillantes et même à communiquer en SMTP (Simple Mail Transfer Protocol), vu que les syntaxes du SMTP et du FTP sont similaires. Le chercheur a montré qu'en exploitant une vulnérabilité de type XXE et cette faiblesse dans l’implémentation du client FTP dans Java, un attaquant pouvait forcer une application Java à envoyer des courriels à un serveur SMTP. « Cette attaque est particulièrement intéressante pour ouvrir l’accès à un serveur de messagerie interne (non restreint, et peut-être sans filtrage de spam ou de malware) depuis la machine effectuant l'analyse XML », a écrit Alexander Klink dans un blog.
Une injection de commandes FTP profitant de l'absence de filtrage CRLF
Après avoir vu cette présentation, Timothy Morgan, un chercheur de Blindspot Security, a décidé de divulguer une attaque similaire qui fonctionne à la fois contre les implémentations FTP de Java et de Python. Mais son attaque est plus grave, car elle peut être utilisée pour faire des trous dans les pare-feux. L’attaque par « injection de flux dans le protocole FTP via des URL malveillantes », comme la décrit Timothy Morgan, implique également l’injection de commandes FTP malveillantes pour profiter de l'absence de filtrage CRLF. Cependant, au lieu d'injecter des commandes SMTP, le chercheur de Blindspot Security a forcé la commande FTP PORT afin d’inciter le client à ouvrir un canal de données vers un serveur FTP distant sur un port TCP spécifique. Comme l'indique le chercheur, de nombreux firewalls basés sur Linux utilisant le filtrage dynamique de paquets (SPI), dont certains pare-feu commerciaux, supportent le mode classique de traduction FTP, ce qui veut dire que s'ils détectent une commande PORT dans le trafic FTP provenant de ce client, ils ouvriront automatiquement un port TCP et le transmettront au LAN IP d'un client FTP.
Ce vecteur d'attaque est connu depuis de nombreuses années, c'est la raison pour laquelle les développeurs d'outils de suivi de connexions basés sur Linux (ou conntrack) utilisés par la plupart des pare-feux ont ajouté une vérification supplémentaire. Un port ne sera ouvert que si la commande PORT apparaît au tout début d'un paquet TCP, pour s'assurer que le client a effectivement envoyé la commande. Cette protection pose à l’attaquant potentiel deux problèmes : d'abord, il doit trouver l'adresse IP interne du client afin de falsifier une commande PORT, et ensuite il doit organiser les paquets TCP entre le client et le serveur de sorte que la commande PORT malveillante se place au début d'un paquet. Timothy Morgan a trouvé un moyen de résoudre ces deux contraintes grâce à son attaque par injection de flux dans le protocole FTP et prétend avoir développé un exploit de preuve de concept qu'il n'a pas l'intention de rendre public tant qu’Oracle et Python n’auront pas corrigé le code de leur client FTP. « L'attaque complète (y compris la requête utilisée pour déterminer l'IP interne de la victime) est réalisée par trois attaques SSRF (Server Side Request Falsification) seulement pour ouvrir un port TCP », a-t-il déclaré lundi dans un blog. « Chaque attaque SSRF supplémentaire peut ouvrir un port TCP supplémentaire ».
La dissociation de l'extension de fichier .jnlp du binaire Java Web Start recommandée
Il existe plusieurs méthodes pour exploiter ce problème, y compris en se servant du code Java installé sur l’ordinateur des utilisateurs. Ces derniers n'ont même pas besoin d'exécuter un applet Java malveillant, car l'exploit peut être livré via une application Java Web Start. « Si le pirate parvient à pousser l’utilisateur à visiter un site Web malveillant alors que Java est installé, et même si les applets Java sont désactivés, il est encore possible de déclencher Java Web Start pour analyser un fichier JNLP », a déclaré Timothy Morgan. « Ces fichiers peuvent contenir des URL FTP malveillantes qui déclenchent le bug ». Les attaquants pourraient également cibler les serveurs où les applications Java s'exécutent en abusant d'une position « man-in-the-middle » sur le réseau ou en exploitant les vulnérabilités SSRF ou XXE dans ces applications. Timothy Morgan affirme avoir testé cette attaque contre un pare-feu Linux personnalisé exécutant un kernel récent, et contre les pare-feux de Palo Alto Networks et de Cisco Systems qui se sont avérés vulnérables avec les paramétrages par défaut. « À ce stade, les tests sur les pare-feux commerciaux sont peu nombreux, mais il est probable qu'un nombre important de pare-feux en production sont vulnérables à l'attaque par injection de flux dans le protocole FTP », a-t-il déclaré.
Les développeurs Java et Python ont été informés de ce problème, mais tant qu’ils n’auront pas corrigé leurs implémentations de client FTP, le chercheur conseille aux fournisseurs de pare-feu de désactiver par défaut le mode de traduction FTP classique. Les utilisateurs doivent désinstaller Java de leurs systèmes, ou du moins désactiver le plug-in du navigateur et dissocier l'extension de fichier .jnlp du binaire Java Web Start. Il faudrait aussi, selon le chercheur, rechercher les éventuelles failles SSRF et XXE dans les applications Java et Python. « Cependant, l'analyse XML dans Java est actuellement vulnérable par défaut, si bien que les vulnérabilités XXE sont très communes sur cette plate-forme », a encore déclaré Timothy Morgan.

