lundi 22 février 2010
Vulnérabilités critiques dans le moteur PHP
Par Fabien PERIGAUD, lundi 22 février 2010 à 15:18 :: General
Lors de la conférence de sécurité BlackHat 2009, Stefan Esser, chercheur réputé pour ses nombreuses découvertes concernant le moteur PHP, a rendu publiques deux vulnérabilités "0-day" dans le moteur PHP :
- Une vulnérabilité de type fuite d'information dans la fonction explode(), pouvant être exploitée afin de lire certaines structures internes du moteur
(Réf. Lexsi 12585) ; - Une vulnérabilité de type corruption de la mémoire dans la fonction "usort()"
(Réf. Lexsi 12304).
Ces deux vulnérabilités font partie d'une classe de vulnérabilités que Stefan Esser nomme "Vulnérabilités d'interruption", consistant à stopper l'exécution d'une fonction interne de PHP afin d'en modifier les arguments, avant de rendre la main à la fonction. Ceci permet par exemple de modifier le type d'une variable, de "string" en "array", afin de pouvoir lire la structure représentant le tableau du point de vue du moteur PHP.
La combinaison de ces deux vulnérabilités permet d'obtenir un accès complet à la mémoire du processus en cours, par le biais suivant :
- On créé en mémoire une fausse structure représentant une chaîne de caractères commençant à l'adresse 0 et de taille 0x7fffffff ;
- On récupère l'adresse en mémoire de cette fausse structure grâce à la première vulnérabilité ;
- On corrompt l'une des entrées d'un tableau en insérant notre fausse structure grâce à la seconde vulnérabilité.
Nous nous retrouvons donc alors avec une entrée de tableau représentant une chaîne de caractères commençant à l'adresse 0 et de taille 0x7fffffff, ce qui nous procure un accès complet au 2 premiers Go de la mémoire du processus.
Une exploitation plus détaillée de ces vulnérabilités est disponible sur le blog Sécurité Offensive.
Si ces vulnérabilités ne permettent pas directement de compromettre un serveur web, elles deviennent particulièrement critiques dans le cas où il est possible pour un tiers d'exécuter du code PHP arbitraire, tel que dans les environnements d'hébergement mutualisé.
En effet, un accès complet à la mémoire du processus permet à un attaquant de reconfigurer complètement le moteur PHP, rendant inutiles les protections telles que safe_mode, open_basedir ou les disable_functions, voire même d'exécuter directement du code arbitraire avec les privilèges du serveur web.
Ces vulnérabilités ont été corrigées silencieusement (aucune apparition dans le ChangeLog) dans les versions suivantes de PHP :
- vulnérabilité explode() : version 5.3.1 (la branche 5.2.x n'a actuellement pas de correctif) ;
- vulnérabilité usort() : versions 5.2.11 et 5.3.1.
La réponse de Stefan Esser n'a pas tardé, et celui-ci a présenté peu de temps après une façon simple de contourner la protection contre l'exploitation de la vulnérabilité dans usort() grâce à la variable $_SESSION.
Cette nouvelle vulnérabilité a été corrigée dans la version 5.2.12 de PHP
(Réf. Lexsi 12689) en modifiant certaines propriétés de la variable, et était cette fois-ci présente dans le ChangeLog.
Malheureusement, les corrections silencieuses de vulnérabilités posent des problèmes aux mainteneurs de paquets des principales distributions GNU/Linux, qui ne voient pas de mise à jour de sécurité à backporter dans leurs paquets. En effet, les versions de base de ces paquets sont généralement anciennes (version 5.2.6 dans Debian, par exemple), et les correctifs de sécurité doivent être intégrés à ces anciennes versions, sans pour autant y intégrer les autres modifications. Ces vulnérabilités, corrigées dans le moteur PHP depuis la mi-décembre 2009, ne sont pas corrigées dans la plupart des distributions Linux faisant office de serveurs Web :
- Red Hat Enterprise Linux : aucune mention des vulnérabilités dans explode() et usort(), seule la correction concernant la variable $_SESSION est abordée, mais le verdict est sans appel :
This flaw can be used by PHP script author to bypass restrictions such as safe_mode or open_basedir Red Hat does not treat such issue as security flaws
- Mandriva Enterprise Server : aucune mention des vulnérabilité dans explode() et usort() ;
- Debian Lenny : la vulnérabilité concernant la variable $_SESSION vient d'être corrigée. Toutefois, les deux autres vulnérabilités n'ayant pas été corrigée, le risque est toujours autant présent ;
- Ubuntu : les correctifs sécurité d'Ubuntu se basant sur ceux de Debian, les vulnérabilités ne sont pas non plus corrigées.
Certaines distributions intégrant les versions 5.2.12 ou 5.3.1 de PHP sont quand à elles protégées de facto (OpenSuSE 11.2, Mandriva Linux 2010, Fedora 11/12 ...). Malheureusement, celles-ci sont beaucoup plus rares dans le domaine de l'hébergement, où l'on retrouve surtout des Red Hat Enterprise Server et des Debian.
Following the recent 0-day in Internet Explorer 
Adobe recently released versions 8.2 and 9.3 of Acrobat/Reader, patching several critical vulnerabilities including the recent "newPlayer()" 0-day 


More and more companies choose to use strong authentication to ensure security, which is no more assured by a simple password. It is indeed easy to find by an attacker, either through social engineering, keylogging, brute force cracking or rainbow table ...
Reading one of the last 


Fervent utilisateur de Facebook depuis quelques semaines, j’ai très vite succombé à ses charmes, et ai également vite pu constater l’ampleur des dégâts en matière de sécurité. Et au fond, je crois qu’il ne faudra jamais attendre de Facebook (ou de tout autre réseau social personnel) qu’il développe chez ses utilisateurs une quelconque culture de la sécurité face aux risques qu’il porte : la sécurité est tout simplement antinomique de Facebook, pour des raisons intrinsèques au réseau.