Vitrée brisée

Pas d’échappement, pas de pot

Une faille critique dans PHP pour les serveurs Windows

Vitrée brisée

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.

Commentaires (19)


PHP + Windows, c'est pas ce genre de combo de l'enfer où tu te dis que t'as dû faire une sacrée connerie dans une ancienne vie pour mériter ça ?
J'avais ce genre d'installation à l'époque, sur mon premier PC… car je ne connaissais rien de plus que ce à quoi l'école m'avait exposé, et c'était donc… du Microsoft.
C'est encore pire dans l'Éducation aujourd'hui.

Cela permettait de programmer dans un langage interprété (un "compilateur" ? Mais qu'est-ce donc que cette chose imbuvable ?) et d'avoir un site Web local dynamique.

Si je m'étais fait trouer à l'époque, et que le PC s'était transformé en robot dans un réseau, j'aurais eu mon premier serveur avant l'heure. :D
Après, une fois lancé, quelle différence entre un Windows et un Linux? En plus, de mémoire, PHP est lançable en Windows Core, pas ASP.Net :)

Wosgien

Après, une fois lancé, quelle différence entre un Windows et un Linux? En plus, de mémoire, PHP est lançable en Windows Core, pas ASP.Net :)
Best fit est une fonction de Windows, je suis pas sur que les gnu aient ça comme ça. PHP est un exécutable, pas une bibliothèque de .NET, et il me semble qu'il tourne dans l'espace utilisateur, pas le noyau Windows ; du coup je veux bien que tu éclaires ma lanterne au sujet de Windows Core (ca fait quelques année que j'ai plus cet OS, je perds le fil)

Thoscellen

Best fit est une fonction de Windows, je suis pas sur que les gnu aient ça comme ça. PHP est un exécutable, pas une bibliothèque de .NET, et il me semble qu'il tourne dans l'espace utilisateur, pas le noyau Windows ; du coup je veux bien que tu éclaires ma lanterne au sujet de Windows Core (ca fait quelques année que j'ai plus cet OS, je perds le fil)
Windows Core n'a rien à voir avec .Net. Windows Core est juste une version minimaliste de Windows, sans interface graphique.

Après, je suis étonné qu'une application ASP.Net ne puisse pas fonctionner sur Windows Core, car c'était justement le genre de chose qu'il était sensé pouvoir faire ! C'était vrai au tout début quand le framework .Net n'était pas disponible, mais ce n'est plus le cas maintenant depuis de nombreuses années (au moins plus de 10 ans).

fdorin

Windows Core n'a rien à voir avec .Net. Windows Core est juste une version minimaliste de Windows, sans interface graphique.

Après, je suis étonné qu'une application ASP.Net ne puisse pas fonctionner sur Windows Core, car c'était justement le genre de chose qu'il était sensé pouvoir faire ! C'était vrai au tout début quand le framework .Net n'était pas disponible, mais ce n'est plus le cas maintenant depuis de nombreuses années (au moins plus de 10 ans).
C'était il y a longtemps maintenant :) De mémoire, car je ne retrouve pas les infos sur le net: ASP.Net de fonctionnait pas tout à fait. IIS, oui, mais .Net Framework n'avait pas de package de mise à jour compatible Server Core.
Maintenant, j'imagine que c'est réglé :) - mais je ne mets plus les mains là-dedans.

Thoscellen

Best fit est une fonction de Windows, je suis pas sur que les gnu aient ça comme ça. PHP est un exécutable, pas une bibliothèque de .NET, et il me semble qu'il tourne dans l'espace utilisateur, pas le noyau Windows ; du coup je veux bien que tu éclaires ma lanterne au sujet de Windows Core (ca fait quelques année que j'ai plus cet OS, je perds le fil)
Windows Server Core est un type d'installation de Windows Server depuis 2008-2012. Pas de GUI, 512Mo de RAM mini.
Moins de composants -> 2/3 de mises à jour en moins. On le manage à distance avec powershell ou les outils Windows.
Très très très utile en environnement Microsoft avec des VM.
Pas forcément.
PHP + Windows 10 (avec XAMPP) permet de tester des soft sur ton poste (par exemple un logiciel de comptabilité qui fonctionne en mode Web).
J'ai une centaine de serveurs en Apache + PHP sous Windows Server ça fonctionne très bien avec sur chacun des centaines, voir des milliers d'utilisateurs par jour !
Modifié le 12/06/2024 à 21h32

Historique des modifications :

Posté le 12/06/2024 à 21h27


J'ai une centaine de serveur en Apache + PHP sous Windows Server ça fonctionne très bien avec sur chacun des centaines, voir desmilliers d'utilisateurs par jour !

Quel idée de publier la faille un vendredi. Non mais sérieux.
Bon après il faut être un sacré aventurier pour proder un Windows serveur PHP
Ben ça permet aux particuliers avec ce genre de serveur exotique de passer le week-end à corriger leur installation exotique.
Si une entreprise exploite ça, elle mérite de mourir durant le week-end.

Berbe

Ben ça permet aux particuliers avec ce genre de serveur exotique de passer le week-end à corriger leur installation exotique.
Si une entreprise exploite ça, elle mérite de mourir durant le week-end.
Pas mort.
j'en connais dans ma boite qui parle d'un desktop mac comme d'un "serveur" tout ça pour faire tourner cette saloperie de 4D en pensant que c'est la panassé pour un truc à la ramasse depuis plus de 20 ans (simple j'ai attendu que ces guignols fassent du json durant....10 ans, et cette année tada, la POO n'est plus un gros mot pour eux et ils s'y mettent enfin, je parle meme pas de leur implémentation plus que merdique du serveur rest, il font le serveur, pas le client).
En gros, tu es dev PHP, tu en as marre de te mettre à la page (et on peut pas dire que les release PHP soient aussi fréquente que sur du node) et bien passe à la maison de retraite 4D
Bon après il faut être un sacré aventurier pour proder un Windows serveur PHP


Des fois, ya pas le choix...
Quand une appli web doit tourner sur un serveur windows existant d'un client, il faut s'adapter au client. Si tu n'installes pas php en mode dev (xamp, wamp et autres) mais comme une vraie prod et que tu suis les maj, ya pas de souci. C'est juste plus ch*ant parce qu'administrer Windows c'est pas aussi pratique qu'administrer un Linux mais ça se fait bien quand même.
Modifié le 11/06/2024 à 10h41

Historique des modifications :

Posté le 11/06/2024 à 10h40


Des fois, ya pas le choix...
Quand une appli web doit tourner sur un serveur windows existant d'un client, il faut s'adapter au client. Si tu n'installes pas php en mode dev (xamp, wamp et autres) mais comme une vraie prod et que tu suis les maj, ya pas de souci. C'est juste plus ch*ant parce qu'administrer Windows c'est pas aussi pratique qu'administrer un Linux mais ça se fait bien quand même.

En fait, c'est tout simple et ça ne change pas grand-chose. FreeBSD, Windows, Linux et j'ai même failli l'installer sous OpenVMS une fois :)

Au final, qu'est-ce qui change? Là où on trouve les paquets, la config du web server (et encore, si on est sur apache partout, c'est pareil), un peu la gestion des certificats (si on veut faire propre, sous Windows, on centralise).

La gestion des logs sous Windows est sympa avec l'observateur d'évènements, et si on suit la règle du "on installe par copie via des zip, pas via des outils d'install", c'est bien.

Remarque: mes dernières aventures avec PHP sous Linux avaient TRES mal fini: pas de paquet officiel PHP pour ma distro, obligé de monter la version de distro -> impossible car pas les pilotes fiber channel, donc recompilation PHP -> impossible en l'état car GCC plus compatible sur la distro -> tentative de recompilation GCC .. 17 serveurs en load balancing + NFS + de la prod, de la vente en ligne ... gros gros doute -> abandon du matos (enfin non: réinstall de Windows et réaffectation des serveurs - des blades IBM à l'époque)

Wosgien

En fait, c'est tout simple et ça ne change pas grand-chose. FreeBSD, Windows, Linux et j'ai même failli l'installer sous OpenVMS une fois :)

Au final, qu'est-ce qui change? Là où on trouve les paquets, la config du web server (et encore, si on est sur apache partout, c'est pareil), un peu la gestion des certificats (si on veut faire propre, sous Windows, on centralise).

La gestion des logs sous Windows est sympa avec l'observateur d'évènements, et si on suit la règle du "on installe par copie via des zip, pas via des outils d'install", c'est bien.

Remarque: mes dernières aventures avec PHP sous Linux avaient TRES mal fini: pas de paquet officiel PHP pour ma distro, obligé de monter la version de distro -> impossible car pas les pilotes fiber channel, donc recompilation PHP -> impossible en l'état car GCC plus compatible sur la distro -> tentative de recompilation GCC .. 17 serveurs en load balancing + NFS + de la prod, de la vente en ligne ... gros gros doute -> abandon du matos (enfin non: réinstall de Windows et réaffectation des serveurs - des blades IBM à l'époque)
Arf, il y a bien des moyens d'avoir plusieurs versions différentes de PHP sur un même serveur (la plus simple et connue https://deb.sury.org/).
La compil je l'utilise seulement quand le client à un besoin très particulier (PHP 4.4) et là, effectivement, c'est une autre histoire...

gg40

Arf, il y a bien des moyens d'avoir plusieurs versions différentes de PHP sur un même serveur (la plus simple et connue https://deb.sury.org/).
La compil je l'utilise seulement quand le client à un besoin très particulier (PHP 4.4) et là, effectivement, c'est une autre histoire...
PHP 4.4

:eeek2::eeek2::eeek2:

vexal

PHP 4.4

:eeek2::eeek2::eeek2:
les joies du progiciel qui a coûté une blinde, code historique qui coûterai trop cher à refaire.

Bon après :
- Accessible uniquement via un VPN
- Je n'ai encore jamais vue une appli piraté grâce à une faille PHP

gg40

les joies du progiciel qui a coûté une blinde, code historique qui coûterai trop cher à refaire.

Bon après :
- Accessible uniquement via un VPN
- Je n'ai encore jamais vue une appli piraté grâce à une faille PHP
C'est pas parce que l'a jamais vu que ça n'existe pas.
Juste que t'as eu de la chance.
Après c'est souvent une combo : framework connu -> langage. T'as les failles connues du framework + le langage.
Fermer