Guida alla validazione difensiva in laboratorio e alla rilevazione SOC per CVE-2026-48907 in Joomla JCE <= 2.9.99.4, inclusi telemetria Apache/Joomla/auditd, artefatti webshell, regole Sigma, mapping MITRE ATT&CK e raccomandazioni di mitigazione.
Rapporto di validazione difensiva e note di rilevamento orientate al SOC per CVE-2026-48907 che interessa Joomla Content Editor (JCE) versioni fino alla 2.9.99.4.
Questo repository documenta una validazione di laboratorio controllata di CVE-2026-48907 in Joomla JCE e si concentra sull'ingegneria pratica del rilevamento per i team SOC.
L'obiettivo non è fornire indicazioni sullo sfruttamento. L'obiettivo è mostrare quali fonti di telemetria sono state utili durante la validazione, quali artefatti sono stati creati e come i difensori possono rilevare e rispondere a questa attività.
| Area | Riscontro |
|---|---|
| Vulnerabilità | CVE-2026-48907 in Joomla Content Editor (JCE); flusso di creazione/importazione di profili non autenticato che può portare al caricamento di PHP e all'esecuzione di codice. |
| Versione testata | JCE 2.9.99.4. Il pannello di amministrazione di Joomla mostrava un aggiornamento disponibile alla 2.9.99.7. |
| Risultato del laboratorio | La validazione pubblica del PoC ha confermato RCE e creato una webshell PHP in Joomla /tmp come jce*.xml.php. I comandi sono stati eseguiti come www-data. |
| Telemetria più preziosa | Apache access.log, Apache/PHP error.log, telemetria auditd execve e artefatti del filesystem in joomla_html/tmp. |
| Log di Joomla | Utili come contesto di supporto, ma insufficienti da soli. I log dell'applicazione Joomla non hanno ricostruito l'intera catena: exploit → webshell → esecuzione comandi. |
| Priorità SOC | Critica per istanze Joomla esposte su Internet o istanze Joomla raggiungibili da reti interne meno fidate. |
| Parametro | Valore |
|---|---|
| URL applicazione | http://172.20.10.3:9999 |
| Contenitore Joomla | joomla-jce-lab, immagine joomla:5-apache |
| Contenitore database | joomla-jce-db, immagine mariadb:11 |
| Mapping porta | 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 |
| Sorgente test | Windows 11, IP 172.20.10.2 |
| Registrazione | Log accesso/errori Apache, log Joomla, auditd, log Docker, artefatti filesystem |







Un risultato operativo chiave è che i log dell'applicazione Joomla non sono stati sufficienti.
Durante il test di laboratorio, i log Joomla hanno registrato informazioni a livello di applicazione come un evento joomlafailure, ma non hanno mostrato l'intera catena di sfruttamento. La catena utile era visibile principalmente in:
access.logerror.logexecvejoomla_html/tmpPer il monitoraggio SOC, i log Joomla dovrebbero essere trattati come telemetria di supporto, non come fonte di rilevamento primaria per questa vulnerabilità.
Catena di alto livello osservata durante il test controllato:
Scoperta versione JCE
↓
POST al componente Joomla JCE
↓
Webshell PHP scritta in /tmp di Joomla
↓
Richiesta HTTP a /tmp/jce*.xml.php
↓
Esecuzione comandi tramite webshell
↓
auditd conferma /usr/bin/dash e comandi eseguiti come www-data
L'evidenza più chiara era presente 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
Il log degli errori Apache/PHP conteneva tracce preziose relative al parser:
simplexml_load_string()
administrator/components/com_jce/helpers/profiles.php
RXST
RXEND
I marcatori RXST e RXEND erano indicatori particolarmente utili per questa specifica famiglia di PoC perché apparivano nel percorso di gestione del payload.
I log di Joomla hanno confermato che la registrazione dell'applicazione era attiva, ma non hanno ricostruito lo sfruttamento:
#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.
Ciò significa che raccogliere solo i log di Joomla potrebbe far perdere l'evidenza più importante dello sfruttamento di CVE-2026-48907.
Il test ha creato file webshell PHP in Joomla tmp:
/var/www/html/tmp/jce624jdcfx.xml.php
/var/www/html/tmp/jceolxtshs3.xml.php
Percorsi lato host nel laboratorio:
/home/user/joomla-jce-lab/joomla_html/tmp/jce624jdcfx.xml.php
/home/user/joomla-jce-lab/joomla_html/tmp/jceolxtshs3.xml.php
Hash SHA256 osservati:
b6fa303daef8aa8cb39566c73d2cb4a458efb2b1fba48052dd039d45c3beb0aa jce624jdcfx.xml.php
f8bcc802ab56b845c968ed6727228f200f8f4bcd332b8ce82c6980d93ac228fd jceolxtshs3.xml.php
Il rilevamento basato su hash dovrebbe essere considerato a bassa resilienza perché i nomi dei file e i payload possono variare. Il percorso, l'estensione, la proprietà e la correlazione comportamentale sono più utili.
auditd ha confermato che l'utente del server web ha eseguito comandi dalla directory tmp di 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
Questa è la conferma più forte che l'attività non era solo scansione, ma effettiva esecuzione remota di codice.
Il rilevamento più forte è basato sulla correlazione:
GET /plugins/editors/jce/jce.xml
seguito da
POST /index.php?option=com_jce
seguito da
GET /tmp/jce*.xml.php
seguito da
GET /tmp/jce*.xml.php?c=
e/o
auditd: www-data esegue /usr/bin/dash da /var/www/html/tmp
| Severità | Condizione | Azione SOC |
|---|---|---|
| Bassa | GET /plugins/editors/jce/jce.xml da una fonte insolita | Trattare come ricognizione e correlare con richieste successive. |
| Media | POST /index.php?option=com_jce senza un referer amministratore o da un IP sconosciuto | Avvisare e rivedere le richieste successive a /tmp. |
| Alta | POST com_jce seguita da GET /tmp/*.php o /tmp/*.xml.php | Verificare immediatamente gli artefatti del filesystem e i log degli errori PHP. |
| Critica | GET /tmp/jce*.xml.php?c= o auditd mostra www-data che lancia shell/comandi di sistema | Trattare come RCE/webshell confermato, isolare o limitare l'host e preservare le prove. |
/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 contiene "c="
joomla_html/tmp/jce*.xml.php
/var/www/html/tmp/jce*.xml.php
RXST
RXEND
shell_exec
system
passthru
exec
$_GET['c']
Usali solo su sistemi di tua proprietà o per i quali sei autorizzato a investigare.
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"
File di regole Sigma separati sono disponibili in rules/sigma:
| Passo | Azione | Obiettivo |
|---|---|---|
| 1 | Verificare se l'istanza esegue JCE <= 2.9.99.4 o mostra un aggiornamento JCE disponibile. | Confermare lo stato vulnerabile. |
| 2 | Cercare nei log di accesso/errori com_jce, profiles.import, /tmp/*.php, jce*.xml.php. | Identificare tentativi di sfruttamento riusciti o tentati. |
| 3 | Ispezionare tmp, images e media per file PHP/PHTML/PHAR e nomi insoliti. | Rilevare webshell o backdoor. |
| 4 | Rivedere auditd/EDR per www-data che genera shell o utilità di sistema. | Confermare l'esecuzione di codice. |
| 5 | Se webshell/RCE è confermato, isolare l'host o limitare il traffico verso l'applicazione. | Fermare ulteriori attività. |
| 6 | Preservare gli artefatti, rimuovere le webshell, rivedere profili JCE, account Joomla, cron job e file modificati. | Triage ed eradicazione. |
| 7 | Aggiornare JCE all'ultima versione supportata e rivedere altre istanze Joomla. | Mitigazione e riduzione del rischio. |
| Priorità | Raccomandazione | Motivazione |
|---|---|---|
| P1 | Aggiornare JCE all'ultima versione supportata per il ramo Joomla/PHP. | JCE 2.9.99.4 era vulnerabile in laboratorio e Joomla mostrava un aggiornamento alla 2.9.99.7. |
| P1 | Dopo la patch, verificare la presenza di webshell e profili JCE sospetti. | L'aggiornamento chiude il punto di ingresso ma non rimuove gli artefatti lasciati prima della patch. |
| P1 | Bloccare l'esecuzione di PHP in tmp, images, media, cache e directory di upload. | Anche se il caricamento riesce, il blocco dell'esecuzione PHP interrompe la catena RCE. |
| P2 | Aggiungere WAF o filtraggio delle richieste per option=com_jce e task=profiles.import. | Aiuta a rilevare e bloccare i tentativi di sfruttamento prima che raggiungano PHP. |
| P2 | Ingestire centralmente i log di accesso Apache, i log degli errori PHP e la telemetria auditd/EDR. | I soli log dell'applicazione Joomla sono stati insufficienti. |
| P2 | Implementare inventario periodico delle estensioni Joomla e controlli dello stato degli aggiornamenti. | Il pannello Joomla esponeva il segnale di aggiornamento JCE; questo dovrebbe alimentare i flussi di lavoro VM/SOC. |
| P3 | Mantenere una baseline dei file e avvisare su nuovi file PHP al di fuori delle directory controllate. | Aiuta a rilevare webshell e persistenza dopo un compromesso. |
La configurazione esatta dipende dal modello di distribuzione Apache/PHP. L'obiettivo è impedire l'esecuzione di PHP in directory che non dovrebbero mai eseguire script.
<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>
| Tecnica | Nome | Motivazione |
|---|---|---|
| T1190 | Sfruttamento di Applicazione Esposta a Internet | Sfruttamento HTTP dell'endpoint Joomla/JCE senza autenticazione. |
| T1505.003 | Componente Software del Server: Web Shell | Webshell PHP creata come /tmp/jce*.xml.php. |
| T1059.004 | Interprete di Comandi e Scripting: Shell Unix | /usr/bin/dash eseguito da www-data. |
| T1033 | Scoperta di Proprietario/Utente del Sistema | whoami e id eseguiti tramite la webshell. |
| T1082 | Scoperta di Informazioni di Sistema | hostname eseguito tramite la webshell. |
| T1083 | Scoperta di File e Directory | pwd e attività in /var/www/html/tmp. |
Il laboratorio ha confermato lo sfruttamento pratico contro JCE 2.9.99.4. L'autenticazione a Joomla non era richiesta nel flusso osservato e il PoC pubblico automatizzava il rilevamento della versione e la creazione della webshell.
Per ambienti reali, il rischio è da alto a critico quando Joomla è esposto su Internet o raggiungibile da reti interne meno fidate. Un attacco riuscito può lasciare una webshell persistente, quindi l'applicazione della patch senza ispezione degli artefatti non è sufficiente dopo una sospetta esposizione.
Questo repository è destinato alla ricerca difensiva, all'ingegneria del rilevamento SOC e alla gestione delle vulnerabilità. Non contiene codice di exploit. Qualsiasi test deve essere eseguito solo su sistemi di tua proprietà o per i quali hai esplicita autorizzazione.