PHP2Shell pour exécuter du code arbitraire, Fragnesia pour le faire avec les privilèges root. Une opération possiblement d’origine chinoise a exploité ce tandem pour cibler des firewalls. L’un d’entre eux a permis de remonter jusqu’à un annuaire Active Directory dans un environnement appartenant vraisemblablement à une organisation affiliée au gouvernement américain.

La faille Fragnesia, utilisée pour détourner un module d’authentification Révélée en mai, Fragnesia (CVE-2026-46300) est une faille locale d’élévation de privilèges dans le noyau Linux. Elle découle d’un bug dans un sous-système qui encapsule le trafic IPsec à l’intérieur de flux TCP. Dans les grandes lignes, le kernel « oublie » qu’un fragment mémoire est partagé avec d’autres structures système et le traite comme une zone tampon réinscriptible sans lever les protections d’accès habituelles.

On peut ainsi écrire des octets arbitraires dans le page cache et d’obtenir un shell root. Lire aussi : PHP2Shell tourne à la course à l'échalote L’opération en question a ciblé le fichier qui configure le module d’authentification PAM utilisé par la commande su. L’attaquant a fait en sorte que les règles d’authentification pointent vers un autre module, conçu pour renvoyer systématiquement un code de succès sans jamais solliciter ni vérifier de mot de passe.

En basculant ainsi depuis l’espace utilisateur, l’attaquant est sorti de la sandbox dans laquelle SELinux le contenait – l’exploitation de PHP2Shell lui avait donné une empreinte locale, mais sous l’identité nobody. PHP2Shell exploité à travers les sessions de téléversement L’attaque a ciblé une marque de firewalls dont l’interface d’administration utilise PHP. La première étape a consisté à conditionner la mémoire pour rendre déterministes les futures allocations d’objets.

Vecteur : le mécanisme de suivi des téléversements, qui a l’avantage d’initialiser une session avant toute exécution de code applicatif. L’attaquant a bombardé le serveur de requêtes POST massives jusqu’à saturer la mémoire. Le tas était alors dans un état structuré, prévisible.

La deuxième étape a impliqué une lecture hors limites pour contourner l’ASLR. Lorsque Zend - le moteur de PHP - manipule une chaîne telle qu'un identifiant de session, il se fie à un champ len pour savoir combien d'octets lire ou copier. En cas d'interruption d'une session, les structures internes ne sont que partiellement nettoyées.

L'attaquant en a profité pour envoyer une requête contenant un identifiant de session conçu pour réutiliser l'emplacement mémoire précédent. En raison de la gestion d'erreur incomplète lors d'un épuisement de mémoire, le champ len conserve une valeur artificielle plus grande que la taille réelle du contenu du tampon. Lorsque le serveur traite la requête en question, il doit renvoyer l'identifiant de session via l'en-tête Set-Cookie.

Comme len dépasse la fin réelle du tampon, le pointeur de lecture continue d'avancer et lit les octets bruts situés dans la mémoire adjacente sur le tas. L'attaquant peut convertir ces octets en une adresse. Sachant quelle structure résidait à cet endroit, il son décalage par rapport au début de libphp.so (déterminé au préalable par rétro-ingénierie sur le binaire de PHP).

Il peut ainsi calculer l'adresse de base de cette bibliothèque et neutraliser l'ASLR. Lire aussi : Dans l'ombre de PHP2Shell, une autre faille mémoire fait parler Une référence orpheline pour une fausse table de hachage Un deuxième épuisement de mémoire laisse la variable globale http_session_vars active, mais vide les métadonnées internes associées. Cela crée un pointeur rémanent.

Le système pense que la structure existe encore, alors que la mémoire sous-jacente est libérée. Une ultime requête, dont les données viennent occuper cet espace mémoire, fabrique une fausse table de hachage interne. Dans Zend, chaque table de hachage possède un pointeur de fonction qui nettoie les éléments quand la table est détruite.

L'attaquant le configure pour qu'il pointe directement sur le symbole C interne de la fonction native system(). Et fait pointer la charge de données sur une commande shell. Lorsque PHP termine la requête et nettoie sa mémoire, il exécute automatiquement le destructeur sur le système hôte, avec les privilèges du processus serveur web (nobody, donc).

240 firewalls ciblés, 24 rootés L'exploit exige des agencements mémoire précis qui diffèrent entre versions d'OS. Dans les traces de l'opération, on a trouvé 11 profils. Des « provisoires » (offsets calculés par rétro-ingénierie statique) et « calibrés » (validés en laboratoire).

La phase de découverte globale a reposé sur FOFA, un moteur chinois similaire à Shodan. Elle a permis d'identifier environ 19 000 firewalls dont l'interface d'administration était exposée à Internet. Environ 5000 ont renvoyé des infos de version.

L'attaquant en a conservé 240, localisés aux États-Unis, au Japon, à Taïwan et en Corée du Sud, et qui correspondaient à leurs profils. L'exploitation a été automatisée par lots de 5 firewalls, avec un timeout de 30 minutes par cible. Elle a permis d'implanter un webshell dans un dossier publiquement accessible, sur 24 firewalls.

Un annuaire Active Directory généreusement consulté Sur 22 de ces firewalls, l'attaquant n'a réalisé aucune autre action. Les deux autres étaient semble-t-il associés à la même organisation, affiliée, donc, au gouvernement américain. Le fichier de configuration du premier paraît en témoigner, notamment au vu de l'authentification (Common Access Card) et de la convention de nommage des assets.

Lire aussi : Failles PHP : après l'électrochoc, la crainte du « killer PoC » Ce fichier contenait toute la topologie du réseau. Il a convaincu l'attaquant de lancer une campagne distincte, centrée sur l'autre firewall compromis. Ayant créé un tunnel SSH persistant, ils est remonté vers le serveur central de gestion des firewalls.

Puis vers l'Active Directory, qui y était connecté (nécessaire pour authentifier les utilisateurs du VPN). Ayant l'accès root, il a pu déchiffrer le mot de passe du compte de service LDAP. Il a également énuméré les utilisateurs et les groupes.

Puis tenté la force brute, le domaine ne limitant pas les tentatives de saisie de mot de passe. Les résultats de cette tentative sont restés sur le système de fichiers local du serveur de gestion des firewalls. La réussite n'est donc pas certaine.

Même chose pour les actions ayant visé à créer des comptes backdoor (humain et machine), à extraire la clé de signature SAML depuis la configuration Keycloak (sécurité faible : validate-idp-certificate: no) et à analyser les chaînes ACL pour détecter des chemins d'escalade de privilèges. La « nationalité » des firewalls ciblés laisse penser à une opération d'origine chinoise. Comme les outils exploités (au-delà de FOFA, il y a l'utilitaire de tunneling iox).

Autre indice : l'utilisation de la plate-forme de sécurité offensive aiscan configurée avec des modèles Kimi et DeepSeek. L'horloge de l'infrastructure d'attaque était par ailleurs réglée sur UTC+8 (heure de Pékin). Et les logs d'aiscan contiennent des messages utilisateur en chinois.

Illustration générée par IA