Validação em laboratório defensivo e orientações de detecção para SOC da CVE-2026-48907 no Joomla JCE <= 2.9.99.4, incluindo telemetria Apache/Joomla/auditd, artefatos de webshell, regras Sigma, mapeamento MITRE ATT&CK e recomendações de mitigação.
Relatório de validação defensiva e notas de detecção orientadas a SOC para a CVE-2026-48907, que afeta o Joomla Content Editor (JCE) até a versão 2.9.99.4.
Este repositório documenta uma validação controlada em laboratório da CVE-2026-48907 no Joomla JCE e tem foco em engenharia de detecção prática para equipes de SOC.
O objetivo não é fornecer orientação de exploração. O objetivo é mostrar quais fontes de telemetria foram úteis durante a validação, quais artefatos foram criados e como os defensores podem detectar e responder a essa atividade.
| Área | Resultado |
|---|---|
| Vulnerabilidade | CVE-2026-48907 no Joomla Content Editor (JCE); fluxo não autenticado de criação/importação de perfis que pode levar ao upload de PHP e à execução de código. |
| Versão testada | JCE 2.9.99.4. O painel administrativo do Joomla exibiu uma atualização disponível para 2.9.99.7. |
| Resultado no laboratório | A validação do PoC público confirmou RCE e criou um webshell PHP no /tmp do Joomla como jce*.xml.php. Os comandos foram executados como www-data. |
| Telemetria mais valiosa | access.log do Apache, error.log do Apache/PHP, telemetria execve do auditd e artefatos do sistema de arquivos em joomla_html/tmp. |
| Logs do Joomla | Úteis como contexto complementar, mas insuficientes por si só. Os logs de aplicação do Joomla não reconstruíram a cadeia completa: exploração → webshell → execução de comandos. |
| Prioridade para SOC | Crítica para instâncias do Joomla expostas à internet ou instâncias do Joomla acessíveis a partir de redes internas menos confiáveis. |
| Parâmetro | Valor |
|---|---|
| URL da aplicação | http://172.20.10.3:9999 |
| Contêiner do Joomla | joomla-jce-lab, imagem joomla:5-apache |
| Contêiner do banco de dados | joomla-jce-db, imagem mariadb:11 |
| Mapeamento de portas | 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 |
| Origem do teste | Windows 11, IP 172.20.10.2 |
| Registro de logs | Logs de acesso/erro do Apache, logs do Joomla, auditd, logs do Docker, artefatos do sistema de arquivos |







Uma constatação operacional importante é que os logs de aplicação do Joomla não foram suficientes.
Durante o teste de laboratório, os logs do Joomla registraram contexto no nível da aplicação, como um evento joomlafailure, mas não mostraram a cadeia completa de exploração. A cadeia útil era visível principalmente em:
access.log do Apacheerror.log do Apache/PHPexecve do auditdjoomla_html/tmpPara o monitoramento por SOC, os logs do Joomla devem ser tratados como telemetria complementar, e não como a principal fonte de detecção para esta vulnerabilidade.
Cadeia de alto nível observada durante o teste controlado:
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
A evidência mais clara estava presente no access.log do Apache:
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
O log de erros do Apache/PHP continha rastros valiosos relacionados ao parser:
simplexml_load_string()
administrator/components/com_jce/helpers/profiles.php
RXST
RXEND
Os marcadores RXST e RXEND foram indicadores particularmente úteis para esta família específica de PoC, pois apareceram no caminho de manipulação do payload.
Os logs do Joomla confirmaram que o registro de aplicação estava ativo, mas não reconstruíram a exploração:
#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.
Isso significa que coletar apenas os logs do Joomla pode deixar de lado a evidência mais importante da exploração da CVE-2026-48907.
O teste criou arquivos de webshell PHP no tmp do Joomla:
/var/www/html/tmp/jce624jdcfx.xml.php
/var/www/html/tmp/jceolxtshs3.xml.php
Caminhos no lado do host, no laboratório:
/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
A detecção baseada em hash deve ser tratada como de baixa resiliência, pois nomes de arquivo e payloads podem variar. A correlação por caminho, extensão, propriedade e comportamento é mais útil.
O auditd confirmou que o usuário do servidor web executou comandos a partir do diretório tmp do 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 é a confirmação mais forte de que a atividade não era apenas varredura, mas execução remota de código de fato.
A detecção mais forte é baseada em correlação:
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
| Gravidade | Condição | Ação do SOC |
|---|---|---|
| Baixa | GET /plugins/editors/jce/jce.xml de uma fonte incomum | Trate como reconhecimento e correlacione com solicitações posteriores. |
| Média | POST /index.php?option=com_jce sem referer de administrador ou a partir de um IP desconhecido | Alerte e revise solicitações subsequentes para /tmp. |
| Alta | POST com_jce seguido de GET /tmp/*.php ou /tmp/*.xml.php | Verifique imediatamente os artefatos do sistema de arquivos e os logs de erros do PHP. |
| Crítica | GET /tmp/jce*.xml.php?c= ou auditd mostrando www-data iniciando comandos de shell/sistema | Trate como RCE/webshell confirmado, isole ou restrinja o host e preserve as evidências. |
/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']
Use estes somente em sistemas que você possui ou para os quais 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"
Arquivos separados de regras Sigma estão disponíveis em rules/sigma:
| Etapa | Ação | Objetivo |
|---|---|---|
| 1 | Verifique se a instância executa JCE <= 2.9.99.4 ou exibe uma atualização do JCE disponível. | Confirmar o estado vulnerável. |
| 2 | Pesquise nos logs de acesso/erro por com_jce, profiles.import, /tmp/*.php, jce*.xml.php. | Identificar exploração tentada ou bem-sucedida. |
| 3 | Inspecione tmp, images e media em busca de arquivos PHP/PHTML/PHAR e nomes incomuns. | Detectar webshells ou backdoors. |
| 4 | Revise o auditd/EDR em busca de www-data gerando shells ou utilitários do sistema. | Confirmar execução de código. |
| 5 | Se webshell/RCE for confirmado, isole o host ou restrinja o tráfego para a aplicação. | Interromper atividades adicionais. |
| 6 | Preserve os artefatos, remova os webshells, revise perfis JCE, contas do Joomla, tarefas cron e arquivos modificados. | Triagem e erradicação. |
| 7 | Atualize o JCE para a versão suportada mais recente e revise outras instâncias do Joomla. | Mitigação e redução de risco. |
| Prioridade | Recomendação | Justificativa |
|---|---|---|
| P1 | Atualize o JCE para a versão suportada mais recente do ramo Joomla/PHP. | O JCE 2.9.99.4 estava vulnerável no laboratório e o Joomla exibiu uma atualização para 2.9.99.7. |
| P1 | Após o patch, verifique a existência de webshells e perfis JCE suspeitos. | A atualização fecha o ponto de entrada, mas não remove artefatos deixados antes do patch. |
| P1 | Bloqueie a execução de PHP em tmp, images, media, cache e diretórios de upload. | Mesmo que o upload seja bem-sucedido, o bloqueio da execução de PHP interrompe a cadeia de RCE. |
| P2 | Adicione WAF ou filtragem de solicitações para option=com_jce e task=profiles.import. | Ajuda a detectar e bloquear tentativas de exploração antes que cheguem ao PHP. |
| P2 | Ingira de forma centralizada os logs de acesso do Apache, os logs de erros do PHP e a telemetria de auditd/EDR. | Os logs da aplicação Joomla sozinhos foram insuficientes. |
| P2 | Implemente inventário periódico das extensões do Joomla e verificações do estado de atualização. | O painel do Joomla expôs o sinal de atualização do JCE; isso deve alimentar os fluxos de trabalho de VM/SOC. |
| P3 | Mantenha uma linha de base de arquivos e alerte sobre novos arquivos PHP fora dos diretórios controlados. | Ajuda a detectar webshells e persistência após o comprometimento. |
A configuração exata depende do modelo de implantação do Apache/PHP. O objetivo é impedir a execução de PHP em diretórios que nunca devem executar 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 | Nome | Justificativa |
|---|---|---|
| T1190 | Exploração de aplicação exposta à internet | Exploração via HTTP do endpoint Joomla/JCE sem autenticação. |
| T1505.003 | Componente de Software de Servidor: Web Shell | Webshell PHP criado como /tmp/jce*.xml.php. |
| T1059.004 | Interpretador de Comandos e Scripts: Shell Unix | /usr/bin/dash executado por www-data. |
| T1033 | Descoberta de proprietário/usuário do sistema | whoami e id executados por meio do webshell. |
| T1082 | Descoberta de informações do sistema | hostname executado por meio do webshell. |
| T1083 | Descoberta de arquivos e diretórios | pwd e atividade em /var/www/html/tmp. |
O laboratório confirmou a exploração prática contra o JCE 2.9.99.4. A autenticação no Joomla não foi necessária no fluxo observado, e o PoC público automatizou a detecção de versão e a criação de webshell.
Para ambientes reais, o risco é alto a crítico quando o Joomla está exposto à internet ou é acessível a partir de redes internas menos confiáveis. Um ataque bem-sucedido pode deixar um webshell persistente; portanto, aplicar o patch sem inspecionar os artefatos não é suficiente após uma suspeita de exposição.
Este repositório destina-se à pesquisa defensiva, à engenharia de detecção para SOC e ao gerenciamento de vulnerabilidades. Ele não contém código de exploração. Qualquer teste deve ser realizado somente em sistemas que você possui ou para os quais possui autorização explícita para avaliar.