
Backdoor User-Agentt PHP 8.1.0-dev - Exécution de code à distance (RCE)
User-Agentt Backdoor d'exécution de code à distance (RCE)Sévérité : Critique (équivalent CVSS : 10.0)
Type de vulnérabilité : Backdoor de chaîne d'approvisionnement / Exécution de code à distance (RCE)
Logiciel affecté : PHP 8.1.0-dev (Build de développement uniquement)
Vecteur d'attaque : À distance (non authentifié)
Authentification requise : Non
Interaction utilisateur : Aucune
Impact : Compromission totale du système
La backdoor User-Agentt de PHP 8.1.0-dev est l'une des compromissions de chaîne d'approvisionnement les plus tristement célèbres de l'histoire des logiciels open source. Contrairement aux vulnérabilités classiques qui proviennent d'erreurs de programmation, ce problème résultait de l'insertion intentionnelle de code malveillant dans le dépôt officiel du code source de PHP.
La backdoor est apparue dans les instantanés de développement de PHP 8.1.0-dev en mars 2021, après que des attaquants ont réussi à compromettre l'infrastructure Git de PHP. Les commits malveillants usurpaient l'identité de mainteneurs PHP de confiance et introduisaient un mécanisme caché capable d'exécuter du code PHP arbitraire à chaque réception d'un en-tête HTTP spécialement conçu.
Bien que la backdoor n'ait existé que brièvement avant d'être découverte et supprimée, tout serveur ayant déployé l'un des builds de développement compromis est devenu immédiatement vulnérable à une exécution de code à distance (RCE) non authentifiée.
Cet incident a fondamentalement changé le flux de travail de développement de PHP et a finalement conduit à la migration du dépôt source PHP hors de son infrastructure Git auto-hébergée. :contentReference[oaicite:0]{index=0}
La plupart des vulnérabilités d'exécution de code à distance proviennent de :
Cette vulnérabilité était différente.
Ce n'était pas un bug de code.
C'était une backdoor délibérément implantée, cachée à l'intérieur du code source légitime de PHP.
Au lieu d'exploiter une faiblesse existante, les attaquants ont modifié PHP lui-même pour exécuter du code PHP arbitraire fourni par quiconque effectuait une requête HTTP.
Cela fait de cet incident l'un des exemples les plus connus d'attaque de la chaîne d'approvisionnement logicielle.
Le 28 mars 2021, deux commits suspects sont apparus dans le dépôt Git de PHP.
Les deux commits semblaient provenir de mainteneurs PHP bien connus.
Au départ, ils semblaient inoffensifs.
Les messages de commit ressemblaient à de simples corrections de fautes de frappe.
Cependant, les chercheurs ont rapidement remarqué un code suspect ajouté à l'interpréteur PHP.
Le code inséré recherchait dans les requêtes HTTP entrantes un en-tête personnalisé :
User-Agentt
Remarquez le "t" supplémentaire.
Cette différence d'orthographe subtile a aidé à dissimuler la backdoor lors d'une revue rapide.
Si l'en-tête commençait par la chaîne de déclenchement :
zerodium
PHP exécutait immédiatement tout ce qui suivait en utilisant :
zend_eval_string()
Cela permettait en pratique à n'importe qui d'exécuter du code PHP arbitraire à distance.
Les commits malveillants ont été retirés en quelques heures après leur découverte. L'enquête a ensuite indiqué que les attaquants avaient compromis l'infrastructure Git de PHP plutôt que d'obtenir légitimement les clés de signature des mainteneurs. :contentReference[oaicite:1]{index=1}
Le code inséré effectuait approximativement la logique suivante :
Incoming HTTP Request
│
▼
Read User-Agentt Header
│
▼
Does header start with "zerodium"?
│
Yes ▼
Execute remaining text as PHP
│
▼
Attacker gains Remote Code Execution
Au lieu de traiter l'en-tête comme des métadonnées inoffensives, PHP l'évaluait directement comme du code PHP exécutable.
Normalement, une requête HTTP contient des en-têtes similaires à :
GET / HTTP/1.1
Host: example.com
User-Agent: Mozilla Firefox
La version compromise de PHP traitait en plus :
User-Agentt:
Si sa valeur commençait par :
zerodium
PHP appelait :
zend_eval_string()
Le contenu restant devenait du code PHP exécutable.
Conceptuellement :
User-Agentt:
zerodium
│
▼
zend_eval_string(payload)
│
▼
Remote Code Execution
Attacker
│
│ HTTP Request
▼
GET /
User-Agentt: zerodiumsystem("id");
│
▼
PHP 8.1.0-dev
│
▼
Backdoor Triggered
│
▼
system("id")
│
▼
Command Executed
│
▼
Output Returned
Aucune authentification.
Aucune session.
Aucun identifiant.
Une seule requête HTTP suffisait.
Les attaquants ont intentionnellement choisi
User-Agentt
au lieu de
User-Agent
parce que :
Cette minuscule faute de frappe dissimulait une backdoor complète d'exécution de code à distance.
Uniquement :
PHP 8.1.0-dev
Plus précisément, les instantanés de développement compromis publiés lors de l'incident de mars 2021.
Les versions stables telles que :
n'ont jamais été affectées.
L'attaquant n'avait besoin que de :
Aucune authentification.
Aucune force brute.
Aucune connexion.
Aucun accès préalable.
Une exploitation réussie permet aux attaquants de :
En pratique, cette vulnérabilité entraîne une compromission totale du serveur.
Les administrateurs doivent immédiatement examiner les systèmes qui exposent :
PHP/8.1.0-dev
dans des en-têtes de réponse tels que :
X-Powered-By:
PHP/8.1.0-dev
Les journaux HTTP doivent également être consultés pour détecter les requêtes suspectes contenant :
User-Agentt
ou
zerodium
De nombreux systèmes de détection d'intrusion et produits IPS incluent désormais des signatures spécifiques à ce schéma d'attaque. :contentReference[oaicite:2]{index=2}
Les indicateurs possibles incluent :
User-Agenttzerodium| Propriété | Valeur |
|---|---|
| Authentification | Aucune |
| Interaction utilisateur | Aucune |
| Complexité | Très faible |
| Privilèges requis |
Cette vulnérabilité est considérée comme l'une des exécutions de code à distance les plus faciles à exploiter, car l'attaquant se contente d'envoyer une requête HTTP spécialement conçue.
Ne déployez jamais d'instantanés de développement de PHP sur des systèmes de production.
Si un serveur a été trouvé exécutant le build compromis :
Cet incident a démontré plusieurs leçons importantes :
La compromission a accéléré les changements apportés à l'infrastructure de développement de PHP et a mis en évidence l'importance croissante de la sécurité de la chaîne d'approvisionnement logicielle dans l'ensemble du secteur. :contentReference[oaicite:3]{index=3}
La backdoor User-Agentt de PHP 8.1.0-dev reste l'un des exemples les plus significatifs d'attaque de la chaîne d'approvisionnement logicielle touchant un projet open source majeur. Plutôt que d'exploiter une faille de programmation, les attaquants ont inséré une backdoor cachée directement dans le code source du langage, permettant une exécution à distance non authentifiée de code PHP arbitraire via un en-tête HTTP User-Agentt spécialement conçu. Bien que les instantanés de développement compromis aient été rapidement retirés et qu'aucune version stable de PHP n'ait été affectée, l'incident a souligné l'importance critique de sécuriser l'infrastructure de développement logiciel, de vérifier la provenance du code et d'éviter le déploiement de builds de développement dans les environnements de production. Aujourd'hui, cette vulnérabilité est largement étudiée comme un cas marquant de la sécurité de la chaîne d'approvisionnement et rappelle que l'intégrité du processus de compilation logicielle est tout aussi importante que la sécurité du code lui-même.
| Technique | Description |
|---|
| T1195 | Compromission de la chaîne d'approvisionnement |
| T1059 | Interpréteur de commandes et de scripts |
| T1505 | Composant logiciel serveur |
| T1105 | Transfert d'outil entrant |
| T1071 | Protocole de couche application |
| T1106 | API native |
| T1055 | Injection de processus (possible post-exploitation) |
| T1027 | Fichiers ou informations obscurcis |
| Aucun |
| À distance | Oui |