Présentation

PHP2Shell désigne une famille de vulnérabilités de sécurité mémoire découvertes dans le noyau du moteur PHP. Elles se déclinent en deux classes distinctes, répertoriées sous les identifiants CVE-2026-109618 et CVE-2026-109619, toutes deux notées 9.2 sur l’échelle CVSS. La recherche indique que les failles touchent toutes les versions de PHP depuis 5.4, soit près de 70 % des sites web qui s’appuient sur ce langage, y compris les plateformes majeures comme WordPress, Drupal ou Joomla.

Mécanismes des vulnérabilités

La première classe exploite une corruption de mémoire déclenchée par la gestion d’un dépassement de capacité (out‑of‑memory). Lorsque PHP atteint la limite memory_limit, le code de nettoyage libère des structures de données de façon non atomique, laissant des pointeurs dangling qui peuvent être réutilisés par un attaquant. La seconde classe repose sur un état global persistant entre deux requêtes (stale global state). Après une requête, certaines variables restent en mémoire et sont réexposées lors de la requête suivante, même si le processus PHP‑FPM a été recyclé. Ces deux vecteurs permettent soit l’exécution de code à distance (RCE) sans authentification, soit la divulgation de zones mémoire contenant mots de passe, jetons d’API ou certificats.

Impacts et scénarios d’exploitation

Les chercheurs ont démontré des attaques RCE pré‑authentifiées sur les images officielles de WordPress, Drupal et Joomla, montrant que l’exploitation ne dépend pas du code applicatif. En parallèle, ils ont réalisé une fuite de mémoire capable de récupérer des secrets stockés dans d’autres processus PHP. La combinaison de RCE et de divulgation rend la détection difficile : un attaquant peut d’abord extraire des informations d’identification, puis les réutiliser pour installer un back‑door persistant. Les mesures de mitigation temporaires, comme memory_limit = -1, déplacent simplement la responsabilité de la gestion d’épuisement de mémoire vers le système d’exploitation, augmentant le risque de terminaisons de processus et d’indisponibilité.

# Exemple de configuration php.ini limitant les vecteurs d'attaque
memory_limit = 256M
post_max_size = 8M
max_input_nesting_level = 64
session.upload_progress.enabled = 0
display_errors = 0

Mesures de mitigation et mise à jour

Le correctif officiel, publié par l’équipe PHP, modifie le traitement des erreurs critiques et introduit une nouvelle limite de mémoire « hard limit » qui termine immédiatement le processus en cas d’épuisement, empêchant l’exécution de handlers de shutdown vulnérables. La seule remediation complète consiste à installer la version corrigée de PHP et à redémarrer Apache, PHP‑FPM et tout worker persistant. Les configurations alternatives (baisser post_max_size, réduire max_input_nesting_level, désactiver session.upload_progress) peuvent réduire la surface d’attaque, mais ne couvrent pas tous les chemins d’exploitation. L’usage de SELinux ou AppArmor ajoute une couche de confinement, mais ne doit pas être considéré comme une protection absolue. Après la mise à jour, il est recommandé de réévaluer les limites de mémoire, de désactiver expose_php pour masquer la version du moteur, et de surveiller les logs pour détecter d’éventuelles tentatives d’exploitation résiduelles.