Validación defensiva en laboratorio y guía de detección para el SOC para CVE-2026-48907 en Joomla JCE <= 2.9.99.4, incluyendo telemetría de Apache/Joomla/auditd, artefactos de webshell, reglas Sigma, mapeo MITRE ATT&CK y recomendaciones de mitigación.
Informe de validación defensiva y notas de detección orientadas a SOC para CVE-2026-48907 que afecta a Joomla Content Editor (JCE) versiones hasta 2.9.99.4.
Este repositorio documenta una validación de laboratorio controlada de CVE-2026-48907 en Joomla JCE y se centra en la ingeniería de detección práctica para equipos SOC.
El objetivo no es proporcionar guías de explotación. El objetivo es mostrar qué fuentes de telemetría fueron útiles durante la validación, qué artefactos se crearon y cómo los defensores pueden detectar y responder a esta actividad.
| Área | Hallazgo |
|---|---|
| Vulnerabilidad | CVE-2026-48907 en Joomla Content Editor (JCE); flujo de creación/importación de perfiles no autenticado que puede llevar a la subida de PHP y ejecución de código. |
| Versión probada | JCE 2.9.99.4. El panel de administración de Joomla mostró una actualización disponible a 2.9.99.7. |
| Resultado del laboratorio | La validación pública de PoC confirmó RCE y creó un webshell PHP en /tmp de Joomla como jce*.xml.php. Los comandos se ejecutaron como www-data. |
| Telemetría más valiosa | Apache access.log, Apache/PHP error.log, telemetría execve de auditd y artefactos del sistema de archivos en joomla_html/tmp. |
| Registros de Joomla | Útiles como contexto de apoyo, pero insuficientes por sí solos. Los registros de la aplicación Joomla no reconstruyeron la cadena completa: exploit → webshell → ejecución de comandos. |
| Prioridad SOC | Crítica para instancias de Joomla expuestas a Internet o instancias de Joomla accesibles desde redes internas menos confiables. |
| Parámetro | Valor |
|---|---|
| URL de la aplicación | http://172.20.10.3:9999 |
| Contenedor Joomla | joomla-jce-lab, imagen joomla:5-apache |
| Contenedor de base de datos | joomla-jce-db, imagen mariadb:11 |
| Mapeo de puertos | 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 |
| Origen de prueba | Windows 11, IP 172.20.10.2 |
| Registro | Logs de acceso/error de Apache, logs de Joomla, auditd, logs de Docker, artefactos del sistema de archivos |







Un hallazgo operativo clave es que los registros de la aplicación Joomla no fueron suficientes.
Durante la prueba de laboratorio, los registros de Joomla registraron contexto a nivel de aplicación, como un evento joomlafailure, pero no mostraron la cadena completa de explotación. La cadena útil fue visible principalmente en:
access.logerror.logexecve de auditdjoomla_html/tmpPara la monitorización del SOC, los registros de Joomla deben tratarse como telemetría de apoyo, no como la fuente principal de detección para esta vulnerabilidad.
Cadena de alto nivel observada durante la prueba controlada:
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
La evidencia más clara estaba presente en 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
El registro de errores de Apache/PHP contenía trazas valiosas relacionadas con el analizador:
simplexml_load_string()
administrator/components/com_jce/helpers/profiles.php
RXST
RXEND
Los marcadores RXST y RXEND fueron indicadores particularmente útiles para esta familia específica de PoC porque aparecieron en la ruta de manejo del payload.
Los registros de Joomla confirmaron que el registro de la aplicación estaba activo, pero no reconstruyeron la explotación:
#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.
Esto significa que recolectar solo los registros de Joomla puede perder la evidencia más importante de la explotación de CVE-2026-48907.
La prueba creó archivos de webshell PHP en tmp de Joomla:
/var/www/html/tmp/jce624jdcfx.xml.php
/var/www/html/tmp/jceolxtshs3.xml.php
Rutas del lado del host en el laboratorio:
/home/user/joomla-jce-lab/joomla_html/tmp/jce624jdcfx.xml.php
/home/user/joomla-jce-lab/joomla_html/tmp/jceolxtshs3.xml.php
Hashes SHA256 observados:
b6fa303daef8aa8cb39566c73d2cb4a458efb2b1fba48052dd039d45c3beb0aa jce624jdcfx.xml.php
f8bcc802ab56b845c968ed6727228f200f8f4bcd332b8ce82c6980d93ac228fd jceolxtshs3.xml.php
La detección basada en hash debe tratarse como de baja resiliencia porque los nombres de archivo y los payloads pueden variar. La ruta, extensión, propiedad y correlación de comportamiento son más útiles.
auditd confirmó que el usuario del servidor web ejecutó comandos desde el directorio 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
Esta es la confirmación más sólida de que la actividad no fue solo escaneo, sino una ejecución remota de código real.
La detección más sólida se basa en la correlación:
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
| Gravedad | Condición | Acción del SOC |
|---|---|---|
| Baja | GET /plugins/editors/jce/jce.xml desde una fuente inusual | Tratar como reconocimiento y correlacionar con solicitudes posteriores. |
| Media | POST /index.php?option=com_jce sin referer de administrador o desde una IP desconocida | Alertar y revisar solicitudes posteriores a /tmp. |
| Alta | POST com_jce seguido de GET /tmp/*.php o /tmp/*.xml.php | Verificar inmediatamente los artefactos del sistema de archivos y los registros de errores de PHP. |
| Crítica | GET /tmp/jce*.xml.php?c= o auditd mostrando www-data lanzando comandos de shell/sistema | Tratar como RCE/webshell confirmado, aislar o restringir el host y preservar la evidencia. |
/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']
Utilice estos solo en sistemas que posea o esté autorizado a investigar.
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"
Archivos de reglas Sigma separados están disponibles en rules/sigma:
| Paso | Acción | Objetivo |
|---|---|---|
| 1 | Verificar si la instancia ejecuta JCE <= 2.9.99.4 o muestra una actualización de JCE disponible. | Confirmar estado vulnerable. |
| 2 | Buscar en registros de acceso/error com_jce, profiles.import, /tmp/*.php, jce*.xml.php. | Identificar intentos o explotación exitosa. |
| 3 | Inspeccionar tmp, images y media en busca de archivos PHP/PHTML/PHAR y nombres inusuales. | Detectar webshells o backdoors. |
| 4 | Revisar auditd/EDR en busca de www-data generando shells o utilidades del sistema. | Confirmar ejecución de código. |
| 5 | Si se confirma webshell/RCE, aislar el host o restringir el tráfico a la aplicación. | Detener actividad adicional. |
| 6 | Preservar artefactos, eliminar webshells, revisar perfiles JCE, cuentas de Joomla, tareas cron y archivos modificados. | Triaje y erradicación. |
| 7 | Actualizar JCE a la última versión compatible y revisar otras instancias de Joomla. | Mitigación y reducción de riesgos. |
| Prioridad | Recomendación | Justificación |
|---|---|---|
| P1 | Actualizar JCE a la última versión compatible para la rama Joomla/PHP. | JCE 2.9.99.4 era vulnerable en el laboratorio y Joomla mostró una actualización a 2.9.99.7. |
| P1 | Después de parchar, verificar webshells y perfiles JCE sospechosos. | La actualización cierra el punto de entrada pero no elimina los artefactos dejados antes del parche. |
| P1 | Bloquear la ejecución de PHP en los directorios tmp, images, media, cache y de carga. | Incluso si la subida tiene éxito, bloquear la ejecución de PHP rompe la cadena de RCE. |
| P2 | Agregar filtrado WAF o de solicitudes para option=com_jce y task=profiles.import. | Ayuda a detectar y bloquear intentos de explotación antes de que lleguen a PHP. |
| P2 | Ingerir centralmente los registros de acceso de Apache, registros de errores de PHP y telemetría de auditd/EDR. | Los registros de la aplicación Joomla por sí solos fueron insuficientes. |
| P2 | Implementar inventario periódico de extensiones de Joomla y verificación del estado de actualización. | El panel de Joomla expuso la señal de actualización de JCE; esto debería alimentar los flujos de trabajo de VM/SOC. |
| P3 | Mantener una línea base de archivos y alertar sobre nuevos archivos PHP fuera de los directorios controlados. | Ayuda a detectar webshells y persistencia después de un compromiso. |
La configuración exacta depende del modelo de implementación de Apache/PHP. El objetivo es evitar la ejecución de PHP en directorios que nunca deberían ejecutar 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>
| Técnica | Nombre | Justificación |
|---|---|---|
| T1190 | Explotar aplicación expuesta al público | Explotación HTTP del endpoint Joomla/JCE sin autenticación. |
| T1505.003 | Componente de software de servidor: Web Shell | Webshell PHP creado como /tmp/jce*.xml.php. |
| T1059.004 | Intérprete de comandos y scripts: Shell Unix | /usr/bin/dash ejecutado por www-data. |
| T1033 | Descubrimiento de propietario/usuario del sistema | whoami e id ejecutados a través del webshell. |
| T1082 | Descubrimiento de información del sistema | hostname ejecutado a través del webshell. |
| T1083 | Descubrimiento de archivos y directorios | pwd y actividad en /var/www/html/tmp. |
El laboratorio confirmó la explotación práctica contra JCE 2.9.99.4. No se requirió autenticación en Joomla en el flujo observado, y el PoC público automatizó la detección de versión y la creación de webshell.
Para entornos reales, el riesgo es alto a crítico cuando Joomla está expuesto a Internet o es accesible desde redes internas menos confiables. Un ataque exitoso puede dejar un webshell persistente, por lo que parchar sin inspección de artefactos no es suficiente después de una posible exposición.
Este repositorio está destinado a la investigación defensiva, la ingeniería de detección de SOC y la gestión de vulnerabilidades. No contiene código de explotación. Cualquier prueba debe realizarse únicamente en sistemas que posea o que esté explícitamente autorizado a evaluar.