Blog 6 min de lecture

Les récentes vulnérabilités de PHP prouvent que les règles MISRA s'appliquent au C/C++ d'entreprise (pas seulement à l'embarqué)

Share this article
Les récentes vulnérabilités de PHP prouvent que les règles MISRA s'appliquent au C/C++ d'entreprise (pas seulement à l'embarqué)

Quand les développeurs pensent aux directives MISRA C ou MISRA C++, ils imaginent immédiatement des systèmes embarqués : ECU automobiles, logiciels de commandes de vol, matériel médical et rovers robotiques. L'idée reçue est que ces règles — qui bannissent les pièges de la mémoire dynamique, restreignent l'arithmétique des pointeurs et interdisent les sauts de contrôle abrupts — sont réservées aux systèmes où un plantage logiciel peut causer des dommages physiques.

De récents événements de sécurité très médiatisés pulvérisent cette hypothèse.

La découverte des vulnérabilités critiques d'exécution de code à distance « PHP2Shell » (CVE-2026-109618 et CVE-2026-109619) dans le moteur PHP démontre comment des défaillances bas niveau de gestion de la mémoire et du flux de contrôle en C peuvent compromettre des applications web de haut niveau à l'échelle mondiale.

En regardant de près pourquoi ces vulnérabilités sont apparues, on réalise qu'il s'agit de violations typiques de principes de sécurité fondamentaux que les standards MISRA interdisent depuis des décennies. Voici pourquoi la philosophie de la conformité MISRA importe à tout ingénieur logiciel, qu'il construise des microcontrôleurs ou des runtimes web.

L'illusion de l'isolation : langage de haut niveau, moteur bas niveau

PHP est un langage de script interprété de haut niveau sur lequel reposent des millions d'applications web et de systèmes de gestion de contenu. Les développeurs web écrivent du code propre et expressif, en faisant confiance à l'environnement d'exécution pour gérer la mémoire, la sécurité des types et le nettoyage en coulisses.

Or, le moteur sous-jacent de PHP (le Zend Engine) est entièrement écrit en C.

Quand une vulnérabilité existe dans le noyau C, les mécanismes de sécurité au niveau applicatif deviennent totalement sans objet. Un attaquant non authentifié n'a pas besoin d'une faille dans la logique de votre script PHP ; il peut exploiter le moteur d'exécution sous-jacent pour obtenir une exécution de code à distance (RCE) complète.

PHP2Shell : les cauchemars de sécurité embarquée qui l'ont causé

L'avis PHP2Shell met en lumière deux vulnérabilités critiques entièrement enracinées dans des constructions de programmation C dangereuses :

1. CVE-2026-109618 : corruption d'état lors d'un Out-of-Memory (OOM)

Ce qui s'est passé : quand une requête entrante déclenche une erreur Out-of-Memory, PHP s'appuie sur le mécanisme C standard longjmp() pour abandonner brutalement le contexte d'exécution courant et sauter ailleurs.

Le défaut C : parce que longjmp() saute le déroulement normal de la pile, des structures de données en cours de construction restent partiellement initialisées. Quand la routine de nettoyage de la requête s'exécute ensuite, elle traite cette mémoire invalide et bancale comme des données valides — un vecteur de corruption mémoire menant à une RCE.

2. CVE-2026-109619 : état global périmé et use-after-free

Ce qui s'est passé : les processus worker haute performance (comme PHP-FPM) traitent des milliers de requêtes séquentiellement, en réutilisant le même pool mémoire du processus.

Le défaut C : des pointeurs d'état global pointant temporairement vers la mémoire d'une requête n'ont pas été correctement réinitialisés à la sortie. Une fois la mémoire libérée, le pointeur global a survécu — une condition d'use-after-free où une requête ultérieure traitée par le même worker lit et branche sur des états mémoire périmés et pendants.

Quel rapport avec MISRA ?

Si l'on vérifie les règles posées par MISRA C et MISRA C++, on découvre que ces schémas précis sont explicitement interdits dans les environnements critiques :

  • L'interdiction de setjmp et longjmp (règle MISRA C 21.4 / règle MISRA C++ 17-0-5) : MISRA bannit totalement les sauts non locaux parce qu'ils contournent le nettoyage structurel standard, laissant des ressources orphelines et la mémoire dans des états indéterminés. Le recours de PHP à des abandons de type longjmp() pour gérer les erreurs fatales est précisément l'anti-pattern que MISRA prévient.
  • Gestion déterministe de l'état : les règles MISRA imposent un suivi strict du cycle de vie des variables et de la mémoire. Variables non initialisées, pointeurs pendants et réutilisation d'états globaux périmés entre boucles ou routines déclenchent des avertissements obligatoires d'analyse statique.

En résumé, les vulnérabilités qui ont secoué l'écosystème PHP sont exactement ce qu'un outil d'analyse statique rigoureux conforme à MISRA signalerait immédiatement.

La leçon : le codage défensif s'applique partout

Nous avons tendance à diviser l'ingénierie logicielle en silos :

  • Embarqué / critique : exige une analyse statique stricte, la conformité MISRA, une tolérance zéro pour les bogues mémoire et la vérification formelle.
  • Entreprise / Web / Cloud : s'appuie sur des itérations rapides, le ramasse-miettes automatique et la sécurité des langages de haut niveau.

PHP2Shell prouve que cette frontière est un mirage. L'infrastructure web d'entreprise n'est sûre qu'à hauteur des runtimes, compilateurs et dépendances C/C++ bas niveau et non gérés sur lesquels elle s'exécute.

Alors que les équipes intègrent de plus en plus des agents IA et des outils automatisés (comme CppDepend) dans leurs workflows pour gouverner la dette technique, la complexité cyclomatique et l'intégrité structurelle, le mandat reste clair : les standards de codage sûr ne devraient pas être réservés aux voitures et aux pacemakers. Appliquer la discipline rigoureuse de la gouvernance structurelle du code, la gestion stricte du cycle de vie des ressources et l'analyse statique automatisée à toutes les couches logicielles est la seule façon d'isoler les stacks modernes des failles systémiques bas niveau.

Share this article