Christophe CasalegnoAutoimmune warrior, Entrepreneur & Bio/Hacker

StackX PHP : maintenance et correctifs pour Debian 9, 10 et 11

StackX PHP

Tout a commencé avec PHP2Shell.

Il existe un monde fictif dans lequel toutes les applications suivent toutes les mises à jour des systèmes et des services… puis il y a le monde réel.

Ce monde, c’est celui d’une partie de nos clients chez ScalarX : un monde dans lequel une migration ne démarre ni ne se termine nécessairement dans le délai qu’impose la sortie d’une vulnérabilité, aussi critique soit-elle.

Je n’ai jamais jugé un client parce qu’il n’a pas encore migré ou mis à jour son application. Je connais la réalité opérationnelle : on lui explique les risques, on l’encourage à passer sur des versions supportées, on l’accompagne. Et pendant ce temps, on continue à chercher des solutions pour protéger ses services.

Une vieille application métier, une dépendance qui bloque, un système industriel intégré, un système médical essentiel à des milliers de patients qui dépend encore de protocoles obsolètes encodés « en dur » dans l’équipement ou, plus simplement, un projet de migration qui prend du retard… les contraintes existent, et elles sont réelles. Et notre boulot, c’est aussi de faire avec.

Avec PHP2Shell, il a donc fallu trouver des solutions rapidement, notamment pour Debian 9 Stretch et Debian 10 Buster.

J’ai donc réalisé, en m’appuyant sur mes systèmes agentiques (elora.systems), un travail de rétroportage pour ces anciennes distributions Debian, à partir, dans un premier temps, des correctifs PHP déjà réalisés par Sury pour Debian 11, 12 et 13 : adaptation des correctifs, reconstruction des paquets et des extensions, tests de mise à jour et de cohabitation de toutes les versions de PHP qui étaient supportées sur ces distributions.

À l’origine, ce travail était destiné uniquement à nos clients StackX. Mais comme pour d’autres outils et d’autres patchs bien avant, notamment Shellshock et GHOST, je sais que ces travaux peuvent servir à d’autres. Et même si cela ne sert qu’à une seule autre personne, alors cela vaut le coup de les partager 🙂

Au fil des jours, le projet a pris de l’ampleur : d’abord intégrer l’ensemble des correctifs importants parus depuis 2023 qui n’avaient jamais été intégrés dans ces versions, puis, maintenant, intégrer les derniers correctifs au fur et à mesure de leur sortie sur php.net.

StackX PHP fournit maintenant des paquets PHP maintenus pour Debian 9 Stretch, Debian 10 Buster et Debian 11 Bullseye, sur architecture amd64. Les correctifs sont adaptés aux branches réellement utilisées : les paquets sont reconstruits et testés sur des machines virtuelles locales, leurs dépendances sont vérifiées, puis ils sont distribués dans des dépôts APT signés.

Cette contribution est d’abord pour nous : elle répond prioritairement aux besoins des versions Legacy de StackX by ScalarX, pour les clients qui n’ont pas la possibilité de migrer dans les temps en raison de contraintes diverses et variées, qu’elles soient financières ou opérationnelles.

Les paquets, leurs sources, leurs versions complètes et leurs empreintes sont également mis à disposition de la communauté.

30 combinaisons PHP et Debian publiées

DistributionBranches PHP publiéesCombinaisons
Debian 9 Stretch5.6, 7.0, 7.1, 7.2, 7.3, 7.4, 8.0, 8.18
Debian 10 Buster5.6, 7.0, 7.1, 7.2, 7.3, 7.4, 8.0, 8.1, 8.2, 8.310
Debian 11 Bullseye5.6, 7.0, 7.1, 7.2, 7.3, 7.4, 8.0, 8.1, 8.2, 8.3, 8.4, 8.512

Le numéro amont ne raconte pas toute l’histoire. PHP 8.1 repose par exemple sur 8.1.7 pour Stretch, 8.1.29 pour Buster et 8.1.34 pour Bullseye. Un numéro ancien peut correspondre à un paquet ayant reçu des corrections ultérieures. L’identité utile est donc le triplet distribution, version amont et révision Debian complète. Le tableau des versions publiées en constitue la référence.

Ce qui a réellement été fait

Les sources et le conditionnement d’origine restent attribués à PHP, Debian, Sury et à leurs auteurs. L’apport StackX est l’étude de l’applicabilité, le rétroportage ou l’adaptation des changements, les corrections complémentaires, les tests, le conditionnement, l’intégration des dépendances et la distribution signée.

Pour Stretch et Buster, les travaux comprennent notamment :

  • les corrections PHP2Shell, CVE-2026-109618 et CVE-2026-109619 ;
  • les compléments relatifs au traitement multipart, aux noms de champs multioctets et aux limites de traitement, dont CVE-2023-0662 sur les branches concernées ;
  • la correction de metaphone associée à CVE-2026-7568 sur les branches concernées ;
  • des rétroportages de corrections publiées depuis 2023 dans Phar, libxml, les cookies, les contrôles de redirection CGI et les pilotes de bases de données ;
  • des adaptations dans PDO/MySQL, mysqlnd, PostgreSQL, cURL, OpenSSL, mbstring, Zend, OPcache et PHP-FPM, selon les branches.

Le périmètre est établi branche par branche. Entre PHP 5.6 et PHP 8.5, les API internes, les chaînes, les ressources, les interfaces d’extensions et les tests ont évolué. Appliquer aveuglément le même fichier partout aurait été plus simple. Cela n’aurait pas été sérieux.

Sur Bullseye, la livraison part de sources Sury récentes et ajoute le complément Phar présenté ci-dessous sur les douze branches. Les corrections déjà présentes dans ces sources ne deviennent évidemment pas des corrections StackX par magie.

Un exemple concret avec Phar

Le correctif GH-25093 concerne Phar::webPhar(). Dans un chemin de redirection des interfaces non CGI, le code utilisait la longueur du chemin complet de l’archive pour avancer dans l’URI de la requête. Le correctif utilise la longueur du nom de base de l’archive, ce qui évite de lire au-delà de l’URI.

Il provient du commit PHP 2ff2085, associé à la pull request 25102. Ce changement est intégré aux 30 combinaisons publiées. Le portage PHP 5.6 comprend aussi l’adaptation nécessaire à la durée de vie de la chaîne renvoyée par le callback de réécriture.

Paquets et dépendances

La livraison du 6 novembre, vérifiée en ligne le 7 novembre 2026, contient 2 888 fichiers DEB : 920 pour Stretch, 1 109 pour Buster et 859 pour Bullseye. Ce total comprend les paquets PHP, les extensions, les paquets de support, les dépendances et les symboles de débogage. Le chiffre important reste celui des 30 combinaisons PHP/distribution, pas une course au nombre de fichiers.

Selon la branche, les dépôts couvrent notamment PHP en ligne de commande, PHP-FPM, CGI, le module Apache, les extensions et les fichiers de développement. L’inventaire exact est publié dans PAQUETS.tsv.

Les dépendances spécifiques nécessaires aux 30 familles, y compris aux paquets de développement, sont intégrées afin de permettre leur résolution sans dépôt Sury externe. Les dépôts système correspondant à la version de Debian restent nécessaires. StackX PHP est autonome vis-à-vis de Sury pour ce périmètre PHP, ce n’est pas une copie complète de Debian.

Ce qui a été vérifié

Les contrôles portent sur les sources réellement utilisées, les versions complètes, les paquets construits et les binaires installés. Ils comprennent des essais fonctionnels en environnements isolés, des tests de régression adaptés aux changements et des vérifications de dépendances.

  • Les 18 familles Stretch et Buster ont été qualifiées sur les interfaces CLI, CGI et FPM, avec les tests ciblés et les contrôles mémoire retenus pour les correctifs.
  • Le complément Phar de Bullseye a été qualifié séparément sur ses douze branches.
  • La résolution des dépendances a été vérifiée pour les 30 familles, pour l’exécution comme pour l’ensemble des paquets PHP publiés.
  • Les sources et les empreintes permettent de relier les corrections aux fichiers distribués.

Les campagnes PHP précédemment livrées ont été déployées chez nos clients sur des centaines de machines. J’ai également vu que des centaines de machines sur Internet avaient utilisé ces dépôts. Je n’ai eu que quelques retours, accompagnés de remerciements : pour l’instant, aucun problème n’a encore été signalé. C’est un retour d’exploitation, pas une promesse universelle appliquée rétroactivement à chaque révision future.

Dépôts signés et ajout de la source APT

Chaque distribution dispose d’un dépôt signé avec InRelease et Release.gpg. La clé est limitée à cette source APT par signed-by.

AF97 ED98 AACE 4CE1 29A0 3B6E 2C97 36B5 93BA BF7F

Le script public d’ajout du dépôt peut et doit être lu avant exécution. Il détecte Debian 9, 10 ou 11, vérifie l’empreinte de la clé et la signature du dépôt correspondant, installe une source limitée par signed-by et conserve toute configuration existante qu’il ne reconnaît pas. Il n’installe aucun paquet, ne lance aucune mise à jour et ne redémarre aucun service.

Périmètre et limites

Cette maintenance ne transforme pas une ancienne Debian en distribution intégralement maintenue. Elle porte sur les composants PHP distribués ici. Elle ne constitue ni une couverture exhaustive de toutes les vulnérabilités de PHP, ni le support de sécurité de l’ensemble du système.

Les observations mémoire réalisées pour certains correctifs ne constituent pas une certification générale d’absence de fuite mémoire. La couverture varie selon les branches et chaque correction citée ne concerne pas automatiquement les 30 combinaisons. Enfin, ces dépôts répondent à un besoin de continuité pour des systèmes existants. Ils ne sont pas une recommandation de démarrer aujourd’hui un nouveau projet sur une ancienne plateforme.

Ressources

Les sources et les composants conservent leurs licences et leurs attributions d’origine.

—
Christophe Casalegno (retrouvez tous mes réseaux sur : all.bo)

Christophe Casalegno Brain 0verride

Soyez simple
et direct !