Pas d’échappement, pas de pot
Une importante faille de sécurité a été découverte dans plusieurs versions de PHP sous Windows, où l’exploitation est jugée triviale. Les personnes ayant installé un serveur avec XAMPP sont encouragées à modifier leur configuration, aucune nouvelle version n’étant pour l’instant disponible.
La vulnérabilité, estampillée CVE-2024-4577, affecte toutes les versions de PHP fonctionnant sur Windows. Elle concerne les versions 8.3 avant 8.3.8, 8.2 avant 8.2.20 et 8.1 avant 8.1.29. Toutes les moutures du langage sont touchées, y compris les plus anciennes. Les branches 8.0, 7 et 5 sont ainsi impactées, mais ne sont plus entretenues.
La faille a été découverte par Orange Tsai, chercheur en sécurité chez DevCore. Elle réside dans la conjonction d’un problème de vérification dans PHP et du fonctionnement d’un mécanisme de Windows, nommé best-fit. Ce dernier est responsable de la conversion du codage des caractères.
Pour un simple trait d’union invisible
Pour comprendre le fonctionnement de la faille, expliquons d’abord le concept d’échappement. Ce processus permet de convertir une partie des entrées utilisateur pour en retirer tout ce qui pourrait être interprété de travers. Cas classique, les symboles < et >, convertis dans leur équivalent en hexadécimal, afin de ne pas créer par inadvertance des balises web, selon l’utilisation.
Dans le cas de Best Fit, certains caractères ne sont pas échappés. Le trait d’union conditionnel (ou virtuel) est ainsi cité. Il s’agit d’un caractère invisible servant à indiquer où un mot a le droit d’être coupé pour créer un trait d’union. C’est ce type de caractère que l’on trouve parfois dans des noms de domaines pour afficher un nom paraissant légitime, mais renvoyant vers un faux site. Best Fit modifie notamment la valeur du trait d’union conditionnel (0xAD) en trait d’union classique (0x2D).
Pour le mode CGI uniquement
PHP peut fonctionner dans plusieurs modes. Seul le mode CGI est concerné par la faille, alors même qu’il a été conçu pour la sécurité, l’interprétation du code se faisant dans un processus distinct.
« Il s’avère que, dans le cadre du traitement d’Unicode, PHP applique ce que l’on appelle une correspondance « best fit », et suppose que, lorsque l’utilisateur a saisi un trait d’union virtuel, il avait en fait l’intention de saisir un véritable trait d’union, et l’interprète en tant que tel. C’est là que réside notre vulnérabilité. Si nous fournissons à un gestionnaire CGI un trait d’union virtuel (0xAD), le gestionnaire CGI ne ressentira pas le besoin de l’échapper, et le transmettra à PHP », pointent les chercheurs de WatchTowr.
Vous devinez la suite : PHP va l’interpréter comme un vrai trait d’union. Un changement simple en apparence, mais déterminant, le trait d’union servant à introduire des arguments dans les commandes.
Les chercheurs soulignent que le mécanisme est « remarquablement similaire » à une vieille faille de PHP en 2012. L’équipe de développement ne semble pas avoir pensé à Best Fit sous Windows, permettant de reprendre les codes d’exploitation d’il y a 12 ans et d’y apporter quelques modifications pour les faire fonctionner. Il s’agit d’une attaque par injection d’arguments, comme en 2012.
Une faille critique, avec quelques conditions
La faille est critique, dans le sens où une installation vulnérable peut être utilisée pour déclencher une exécution de code arbitraire à distance, sans intervention de l’utilisateur. En pratique, il faut quand même que quelques conditions soient réunies.
Par défaut, PHP n’est pas installé sur Windows. Pour qu’il le soit, il faut avoir installé un serveur, comme XAMPP, cité par les chercheurs. Il faut en outre que PHP fonctionne en mode CGI, un usage devenu minoritaire (largement remplacé par FastCGI). Mais attention, exposer le binaire PHP (php.exe ou php-cgi.exe) dans un dossier accessible au serveur web permet aussi l’exploitation de la faille. C’est malheureusement la configuration par défaut de XAMPP, qui n’est plus mis à jour depuis plus d’un an.
Les chercheurs ont par ailleurs attesté l’exploitation de la faille – tout en donnant la méthode – sur les versions chinoises (traditionnel et simplifié) et japonaise de Windows. Ils disent ne pas savoir si l’exploitation peut se faire sur d’autres variantes linguistiques. Ils ajoutent avoir été confrontés à une trop grande variation des configurations, d’autant qu’il n’est pas simple, depuis l’extérieur, de savoir dans quelle langue un système est configuré.
Toutes les personnes ayant un serveur PHP sont invitées à vérifier sa configuration et à installer la version la plus récente de PHP.
Les pirates sont vite partis à l’assaut
Révélée vendredi avec de nombreuses précisions par DevCore, la faille a rapidement fait l’objet d’une recherche active de victimes. C’est ce qu’a indiqué la Shadowserver Foundation dès vendredi après-midi.
L’exploitation est simple à réaliser et les pirates peuvent tabler sur l’installation par défaut de XAMPP (qui n’est pas censé être utilisé en production, s’agissant avant tout d’un environnement de test) pour exposer les binaires PHP. La situation pour les systèmes Windows dans d’autres langues que celles testées par DevCore n’est pas claire, mais rien ne s’oppose – en théorie – à une exploitation sur tout type de configuration.