Defensive lab validation and SOC detection guidance for CVE-2026-48907 in Joomla JCE <= 2.9.99.4, including Apache/Joomla/auditd telemetry, webshell artifacts, Sigma rules, MITRE ATT&CK mapping and mitigation recommendations.
Defensive validation report and SOC-oriented detection notes for CVE-2026-48907 affecting Joomla Content Editor (JCE) versions up to 2.9.99.4.
This repository documents a controlled laboratory validation of CVE-2026-48907 in Joomla JCE and focuses on practical detection engineering for SOC teams.
The goal is not to provide exploitation guidance. The goal is to show which telemetry sources were useful during validation, which artifacts were created, and how defenders can detect and respond to this activity.
| Area | Finding |
|---|---|
| Vulnerability | CVE-2026-48907 in Joomla Content Editor (JCE); unauthenticated profile creation/import workflow that may lead to PHP upload and code execution. |
| Tested version | JCE 2.9.99.4. The Joomla administrator panel showed an available update to 2.9.99.7. |
| Lab result | Public PoC validation confirmed RCE and created a PHP webshell in Joomla /tmp as jce*.xml.php. Commands were executed as www-data. |
| Most valuable telemetry | Apache access.log, Apache/PHP error.log, auditd execve telemetry and filesystem artifacts in joomla_html/tmp. |
| Joomla logs | Useful as supporting context, but insufficient on their own. Joomla application logs did not reconstruct the full chain: exploit → webshell → command execution. |
| SOC priority | Critical for internet-facing Joomla instances or Joomla instances reachable from less trusted internal networks. |
| Parameter | Value |
|---|---|
| Application URL | http://172.20.10.3:9999 |
| Joomla container | joomla-jce-lab, image joomla:5-apache |
| Database container | joomla-jce-db, image mariadb:11 |
| Port mapping | 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 |
| Test source | Windows 11, IP 172.20.10.2 |
| Logging | Apache access/error logs, Joomla logs, auditd, Docker logs, filesystem artifacts |







A key operational finding is that Joomla application logs were not enough.
During the lab test, Joomla logs recorded application-level context such as a joomlafailure event, but they did not show the full exploitation chain. The useful chain was visible mainly in:
access.logerror.logexecve recordsjoomla_html/tmpFor SOC monitoring, Joomla logs should be treated as supporting telemetry, not as the primary detection source for this vulnerability.
High-level chain observed during the controlled test:
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
The clearest evidence was present in 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
The Apache/PHP error log contained valuable parser-related traces:
simplexml_load_string()
administrator/components/com_jce/helpers/profiles.php
RXST
RXEND
The RXST and RXEND markers were particularly useful indicators for this specific PoC family because they appeared in the payload handling path.
Joomla logs confirmed application logging was active, but they did not reconstruct 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.
This means that collecting only Joomla logs may miss the most important evidence of CVE-2026-48907 exploitation.
The test created PHP webshell files in Joomla tmp:
/var/www/html/tmp/jce624jdcfx.xml.php
/var/www/html/tmp/jceolxtshs3.xml.php
Host-side paths in the lab:
/home/user/joomla-jce-lab/joomla_html/tmp/jce624jdcfx.xml.php
/home/user/joomla-jce-lab/joomla_html/tmp/jceolxtshs3.xml.php
Observed SHA256 hashes:
b6fa303daef8aa8cb39566c73d2cb4a458efb2b1fba48052dd039d45c3beb0aa jce624jdcfx.xml.php
f8bcc802ab56b845c968ed6727228f200f8f4bcd332b8ce82c6980d93ac228fd jceolxtshs3.xml.php
Hash-based detection should be treated as low-resilience because file names and payloads may vary. Path, extension, ownership and behavioral correlation are more useful.
auditd confirmed that the web server user executed commands from the Joomla tmp directory:
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
This is the strongest confirmation that the activity was not only scanning, but actual remote code execution.
The strongest detection is correlation-based:
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
| Severity | Condition | SOC action |
|---|---|---|
| Low | GET /plugins/editors/jce/jce.xml from an unusual source | Treat as reconnaissance and correlate with later requests. |
| Medium | POST /index.php?option=com_jce without an administrator referer or from an unknown IP | Alert and review subsequent /tmp requests. |
| High | POST com_jce followed by GET /tmp/*.php or /tmp/*.xml.php | Verify filesystem artifacts and PHP error logs immediately. |
| Critical | GET /tmp/jce*.xml.php?c= or auditd showing www-data launching shell/system commands | Treat as confirmed RCE/webshell, isolate or restrict the host and preserve evidence. |
/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 these only on systems you own or are authorized to investigate.
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"
Separate Sigma rule files are available in rules/sigma:
| Step | Action | Goal |
|---|---|---|
| 1 | Check whether the instance runs JCE <= 2.9.99.4 or shows an available JCE update. | Confirm vulnerable state. |
| 2 | Search access/error logs for com_jce, profiles.import, /tmp/*.php, jce*.xml.php. | Identify attempted or successful exploitation. |
| 3 | Inspect tmp, images, and media for PHP/PHTML/PHAR files and unusual names. | Detect webshells or backdoors. |
| 4 | Review auditd/EDR for www-data spawning shells or system utilities. | Confirm code execution. |
| 5 | If webshell/RCE is confirmed, isolate the host or restrict traffic to the application. | Stop further activity. |
| 6 | Preserve artifacts, remove webshells, review JCE profiles, Joomla accounts, cron jobs and modified files. | Triage and eradication. |
| 7 | Update JCE to the latest supported version and review other Joomla instances. | Mitigation and risk reduction. |
| Priority | Recommendation | Rationale |
|---|---|---|
| P1 | Update JCE to the latest supported version for the Joomla/PHP branch. | JCE 2.9.99.4 was vulnerable in the lab and Joomla showed an update to 2.9.99.7. |
| P1 | After patching, check for webshells and suspicious JCE profiles. | Updating closes the entry point but does not remove artifacts left before patching. |
| P1 | Block PHP execution in tmp, images, media, cache, and upload directories. | Even if upload succeeds, PHP execution blocking breaks the RCE chain. |
| P2 | Add WAF or request filtering for option=com_jce and task=profiles.import. | Helps detect and block exploitation attempts before they reach PHP. |
| P2 | Centrally ingest Apache access logs, PHP error logs and auditd/EDR telemetry. | Joomla application logs alone were insufficient. |
| P2 | Implement periodic Joomla extension inventory and update-state checks. | The Joomla panel exposed the JCE update signal; this should feed VM/SOC workflows. |
| P3 | Maintain a file baseline and alert on new PHP files outside controlled directories. | Helps detect webshells and persistence after compromise. |
The exact configuration depends on Apache/PHP deployment model. The goal is to prevent PHP execution in directories that should never execute 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 | Name | Rationale |
|---|---|---|
| T1190 | Exploit Public-Facing Application | HTTP exploitation of the Joomla/JCE endpoint without authentication. |
| T1505.003 | Server Software Component: Web Shell | PHP webshell created as /tmp/jce*.xml.php. |
| T1059.004 | Command and Scripting Interpreter: Unix Shell | /usr/bin/dash executed by www-data. |
| T1033 | System Owner/User Discovery | whoami and id executed through the webshell. |
| T1082 | System Information Discovery | hostname executed through the webshell. |
| T1083 | File and Directory Discovery | pwd and activity in /var/www/html/tmp. |
The lab confirmed practical exploitation against JCE 2.9.99.4. Authentication to Joomla was not required in the observed flow, and the public PoC automated version detection and webshell creation.
For real environments, the risk is high to critical when Joomla is internet-facing or reachable from less trusted internal networks. A successful attack may leave a persistent webshell, so patching without artifact inspection is not sufficient after suspected exposure.
This repository is intended for defensive research, SOC detection engineering and vulnerability management. It does not contain exploit code. Any testing must be performed only in systems you own or are explicitly authorized to assess.