Validation défensive en laboratoire et guide de détection SOC pour CVE-2026-48907 dans Joomla JCE <= 2.9.99.4, incluant la télémétrie Apache/Joomla/auditd, les artefacts de webshell, les règles Sigma, la cartographie MITRE ATT&CK et les recommandations d'atténuation.
Rapport de validation défensive et notes de détection orientées SOC pour CVE-2026-48907 affectant Joomla Content Editor (JCE) versions jusqu'à 2.9.99.4.
Ce dépôt documente une validation en laboratoire contrôlé de CVE-2026-48907 dans Joomla JCE et se concentre sur l'ingénierie de détection pratique pour les équipes SOC.
L'objectif n'est pas de fournir des conseils d'exploitation. L'objectif est de montrer quelles sources de télémétrie ont été utiles lors de la validation, quels artefacts ont été créés, et comment les défenseurs peuvent détecter et répondre à cette activité.
| Domaine | Constatation |
|---|---|
| Vulnérabilité | CVE-2026-48907 dans Joomla Content Editor (JCE) ; workflow non authentifié de création/import de profil pouvant conduire à un téléchargement PHP et à une exécution de code. |
| Version testée | JCE 2.9.99.4. Le panneau d'administration Joomla montrait une mise à jour disponible vers 2.9.99.7. |
| Résultat en laboratoire | La validation du PoC public a confirmé l'exécution de code à distance (RCE) et a créé un webshell PHP dans /tmp de Joomla sous la forme jce*.xml.php. Les commandes ont été exécutées en tant que www-data. |
| Télémétrie la plus précieuse | Apache access.log, Apache/PHP error.log, télémétrie auditd execve et artefacts du système de fichiers dans joomla_html/tmp. |
| Journaux Joomla | Utiles comme contexte complémentaire, mais insuffisants seuls. Les journaux d'application Joomla n'ont pas reconstruit la chaîne complète : exploit → webshell → exécution de commandes. |
| Priorité SOC | Critique pour les instances Joomla exposées sur internet ou les instances Joomla accessibles depuis des réseaux internes moins fiables. |
| Paramètre | Valeur |
|---|---|
| URL de l'application | http://172.20.10.3:9999 |
| Conteneur Joomla | joomla-jce-lab, image joomla:5-apache |
| Conteneur de base de données | joomla-jce-db, image mariadb:11 |
| Mappage de ports | 0.0.0.0:9999 -> 80/tcp |
| Apache | Apache/2.4.67 (Debian) |
| PHP | PHP 8.3.31 |
| MariaDB | 11.8.8-MariaDB |
| Joomla | Joomla 5.4.6 Stable |
| JCE | 2.9.99.4 |
| Source de test | Windows 11, IP 172.20.10.2 |
| Journalisation | Journaux d'accès/erreurs Apache, journaux Joomla, auditd, journaux Docker, artefacts du système de fichiers |







Une constatation opérationnelle clé est que les journaux d'application Joomla n'étaient pas suffisants.
Lors du test en laboratoire, les journaux Joomla ont enregistré un contexte au niveau de l'application, comme un événement joomlafailure, mais ils n'ont pas montré la chaîne d'exploitation complète. La chaîne utile était visible principalement dans :
access.logerror.logexecvejoomla_html/tmpPour la surveillance SOC, les journaux Joomla doivent être traités comme une télémétrie de soutien, et non comme la source de détection principale pour cette vulnérabilité.
Chaîne de haut niveau observée lors du test contrôlé :
JCE version discovery
↓
POST to Joomla JCE component
↓
PHP webshell written to Joomla /tmp
↓
HTTP request to /tmp/jce*.xml.php
↓
Command execution through webshell
↓
auditd confirms /usr/bin/dash and commands executed as www-data
Les preuves les plus claires étaient présentes dans Apache access.log :
GET /plugins/editors/jce/jce.xml
GET /
POST /index.php?option=com_jce
GET /tmp/jceolxtshs3.xml.php
GET /plugins/editors/jce/jce.xml
POST /index.php?option=com_jce
GET /tmp/jce624jdcfx.xml.php
GET /tmp/jce624jdcfx.xml.php?c=id%20%26%26%20hostname%20%26%26%20pwd
GET /tmp/jce624jdcfx.xml.php?c=whoami
GET /tmp/jce624jdcfx.xml.php?c=hostname
GET /tmp/jce624jdcfx.xml.php?c=id
GET /tmp/jce624jdcfx.xml.php?c=pwd
Le journal d'erreurs Apache/PHP contenait des traces précieuses liées à l'analyse syntaxique :
simplexml_load_string()
administrator/components/com_jce/helpers/profiles.php
RXST
RXEND
Les marqueurs RXST et RXEND étaient des indicateurs particulièrement utiles pour cette famille spécifique de PoC car ils apparaissaient dans le chemin de traitement des charges utiles.
Les journaux Joomla ont confirmé que la journalisation de l'application était active, mais ils n'ont pas reconstruit l'exploitation :
#Software: Joomla! 5.4.6 Stable [ Kutegemea ] 26-May-2026 16:00 GMT
#Fields: datetime priority clientip category message
2026-06-18T20:37:57+00:00 INFO 172.20.10.2 joomlafailure Username and password do not match or you do not have an account yet.
Cela signifie que la collecte des seuls journaux Joomla peut manquer les preuves les plus importantes de l'exploitation de CVE-2026-48907.
Le test a créé des fichiers webshell PHP dans tmp de Joomla :
/var/www/html/tmp/jce624jdcfx.xml.php
/var/www/html/tmp/jceolxtshs3.xml.php
Chemins côté hôte dans le laboratoire :
/home/user/joomla-jce-lab/joomla_html/tmp/jce624jdcfx.xml.php
/home/user/joomla-jce-lab/joomla_html/tmp/jceolxtshs3.xml.php
Hachages SHA256 observés :
b6fa303daef8aa8cb39566c73d2cb4a458efb2b1fba48052dd039d45c3beb0aa jce624jdcfx.xml.php
f8bcc802ab56b845c968ed6727228f200f8f4bcd332b8ce82c6980d93ac228fd jceolxtshs3.xml.php
La détection basée sur les hachages doit être traitée comme peu résiliente car les noms de fichiers et les charges utiles peuvent varier. Le chemin, l'extension, la propriété et la corrélation comportementale sont plus utiles.
auditd a confirmé que l'utilisateur du serveur web a exécuté des commandes depuis le répertoire tmp de Joomla :
CWD=/var/www/html/tmp uid=www-data comm=sh exe=/usr/bin/dash
CWD=/var/www/html/tmp uid=www-data comm=id exe=/usr/bin/id
CWD=/var/www/html/tmp uid=www-data comm=hostname exe=/usr/bin/hostname
CWD=/var/www/html/tmp uid=www-data comm=whoami exe=/usr/bin/whoami
Il s'agit de la confirmation la plus solide que l'activité n'était pas seulement du scan, mais une véritable exécution de code à distance.
La détection la plus forte est basée sur la corrélation :
GET /plugins/editors/jce/jce.xml
followed by
POST /index.php?option=com_jce
followed by
GET /tmp/jce*.xml.php
followed by
GET /tmp/jce*.xml.php?c=
and/or
auditd: www-data executes /usr/bin/dash from /var/www/html/tmp
| Sévérité | Condition | Action SOC |
|---|---|---|
| Faible | GET /plugins/editors/jce/jce.xml depuis une source inhabituelle | Traiter comme reconnaissance et corréler avec les requêtes ultérieures. |
| Moyenne | POST /index.php?option=com_jce sans referer administrateur ou depuis une IP inconnue | Alerter et examiner les requêtes ultérieures vers /tmp. |
| Élevée | POST com_jce suivi de GET /tmp/*.php ou /tmp/*.xml.php | Vérifier immédiatement les artefacts du système de fichiers et les journaux d'erreurs PHP. |
| Critique | GET /tmp/jce*.xml.php?c= ou auditd montrant www-data lançant des commandes shell/système | Traiter comme RCE/webshell confirmé, isoler ou restreindre l'hôte et préserver les preuves. |
/plugins/editors/jce/jce.xml
/index.php?option=com_jce
/tmp/jce[a-z0-9]{8}\.xml\.php
/tmp/.*\.(php|phtml|phar)(\?| )
cs-uri-query contains "c="
joomla_html/tmp/jce*.xml.php
/var/www/html/tmp/jce*.xml.php
RXST
RXEND
shell_exec
system
passthru
exec
$_GET['c']
Utilisez ces commandes uniquement sur des systèmes dont vous êtes propriétaire ou que vous êtes autorisé à examiner.
grep -RniE "com_jce|profiles\.import|task=profiles|/tmp/.*\.php|RXST|RXEND" apache_logs joomla_html/administrator/logs 2>/dev/null
find ./joomla_html/tmp ./joomla_html/images ./joomla_html/media \
-type f \( -iname "*.php" -o -iname "*.phtml" -o -iname "*.phar" -o -iname "*.xml.php" \) -ls
sudo ausearch -k wwwdata_exec -i | grep -E "uid=www-data|comm=sh|/usr/bin/dash|/var/www/html/tmp|whoami|hostname| id |pwd"
Des fichiers de règles Sigma séparés sont disponibles dans rules/sigma :
| Étape | Action | Objectif |
|---|---|---|
| 1 | Vérifier si l'instance exécute JCE <= 2.9.99.4 ou affiche une mise à jour JCE disponible. | Confirmer l'état vulnérable. |
| 2 | Rechercher dans les journaux d'accès/erreurs com_jce, profiles.import, /tmp/*.php, jce*.xml.php. | Identifier une tentative d'exploitation réussie ou non. |
| 3 | Inspecter tmp, images et media pour les fichiers PHP/PHTML/PHAR et les noms inhabituels. | Détecter les webshells ou les portes dérobées. |
| 4 | Examiner auditd/EDR pour www-data générant des shells ou des utilitaires système. | Confirmer l'exécution de code. |
| 5 | Si un webshell/RCE est confirmé, isoler l'hôte ou restreindre le trafic vers l'application. | Arrêter toute activité ultérieure. |
| 6 | Préserver les artefacts, supprimer les webshells, examiner les profils JCE, les comptes Joomla, les tâches cron et les fichiers modifiés. | Tri et éradication. |
| 7 | Mettre à jour JCE vers la dernière version prise en charge et examiner les autres instances Joomla. | Atténuation et réduction des risques. |
| Priorité | Recommandation | Justification |
|---|---|---|
| P1 | Mettre à jour JCE vers la dernière version prise en charge pour la branche Joomla/PHP. | JCE 2.9.99.4 était vulnérable en laboratoire et Joomla affichait une mise à jour vers 2.9.99.7. |
| P1 | Après le correctif, vérifier la présence de webshells et de profils JCE suspects. | La mise à jour ferme le point d'entrée mais ne supprime pas les artefacts laissés avant le correctif. |
| P1 | Bloquer l'exécution PHP dans les répertoires tmp, images, media, cache et les répertoires de téléchargement. | Même si le téléchargement réussit, le blocage de l'exécution PHP casse la chaîne RCE. |
| P2 | Ajouter un WAF ou un filtrage des requêtes pour option=com_jce et task=profiles.import. | Aide à détecter et bloquer les tentatives d'exploitation avant qu'elles n'atteignent PHP. |
| P2 | Ingérer de manière centralisée les journaux d'accès Apache, les journaux d'erreurs PHP et la télémétrie auditd/EDR. | Les seuls journaux d'application Joomla étaient insuffisants. |
| P2 | Mettre en œuvre un inventaire périodique des extensions Joomla et des vérifications de l'état des mises à jour. | Le panneau Joomla exposait le signal de mise à jour JCE ; cela devrait alimenter les workflows VM/SOC. |
| P3 | Maintenir une référence de fichiers et alerter sur les nouveaux fichiers PHP en dehors des répertoires contrôlés. | Aide à détecter les webshells et la persistance après une compromission. |
La configuration exacte dépend du modèle de déploiement Apache/PHP. L'objectif est d'empêcher l'exécution PHP dans les répertoires qui ne devraient jamais exécuter de scripts.
<Directory "/var/www/html/tmp">
php_admin_flag engine off
Options -ExecCGI
RemoveHandler .php .phtml .phar
<FilesMatch "\.(php|phtml|phar)$">
Require all denied
</FilesMatch>
</Directory>
<Directory "/var/www/html/images">
php_admin_flag engine off
Options -ExecCGI
RemoveHandler .php .phtml .phar
<FilesMatch "\.(php|phtml|phar)$">
Require all denied
</FilesMatch>
</Directory>
| Technique | Nom | Justification |
|---|---|---|
| T1190 | Exploiter une application exposée au public | Exploitation HTTP du point de terminaison Joomla/JCE sans authentification. |
| T1505.003 | Composant logiciel serveur : Web Shell | Webshell PHP créé sous /tmp/jce*.xml.php. |
| T1059.004 | Interpréteur de commandes et de scripts : Shell Unix | /usr/bin/dash exécuté par www-data. |
| T1033 | Découverte du propriétaire/utilisateur du système | whoami et id exécutés via le webshell. |
| T1082 | Découverte d'informations système | hostname exécuté via le webshell. |
| T1083 | Découverte de fichiers et de répertoires | pwd et activité dans /var/www/html/tmp. |
Le laboratoire a confirmé une exploitation pratique contre JCE 2.9.99.4. L'authentification à Joomla n'était pas requise dans le flux observé, et le PoC public a automatisé la détection de version et la création de webshell.
Pour les environnements réels, le risque est élevé à critique lorsque Joomla est exposé sur internet ou accessible depuis des réseaux internes moins fiables. Une attaque réussie peut laisser un webshell persistant, donc appliquer le correctif sans inspection des artefacts n'est pas suffisant après une exposition suspectée.
Ce dépôt est destiné à la recherche défensive, à l'ingénierie de détection SOC et à la gestion des vulnérabilités. Il ne contient pas de code d'exploitation. Tout test doit être effectué uniquement sur des systèmes dont vous êtes propriétaire ou que vous êtes explicitement autorisé à évaluer.