Kotaemon 是一个基于 RAG(检索增强生成)的开源文档问答系统,提供 Web 界面用于查询上传的 PDF、Word 和 Excel 等文件。
Kotaemon 的文档渲染管道中存在一个存储型跨站脚本(XSS)漏洞。 用户控制的内容经过 LLM 处理后,在 Markdown 到 HTML 的转换过程中未进行适当的清理,从而允许攻击者提供的 HTML 元素被持久性地注入到页面中。
当上传一份文档时,系统会自动触发一个摘要请求(例如“summary this file”),这是正常处理流程的一部分。因此,任何上传的文档都会隐式地经过 Markdown 解析和渲染管道,使得漏洞仅通过上传文档即可利用,无需用户显式交互。
以下版本的 Kotaemon 确认受影响:
kotaemon/blob/main/libs/ktem/ktem/utils/render.py
@staticmethod
def table(text: str) -> str:
"""Render table from markdown format into HTML"""
text = replace_mardown_header(text)
return markdown.markdown(
text,
extensions=[
"markdown.extensions.tables",
"markdown.extensions.fenced_code",
],
)
应用程序依赖 markdown.markdown() 函数将 LLM 生成的 Markdown 内容转换为 HTML。
然而,转换后的 HTML 输出直接在浏览器中渲染,未进行 HTML 清理或输出转义。
因此,能够生成原始 HTML 元素的 Markdown 语法(最典型的是图片语法 ![]())会被转换为可执行的 HTML(如 `` 标签),并存储在对话输出中。
"summary" means ""
能够注入持久性 HTML 元素使得攻击者可以:
/logout)利用只需上传文档,并在摘要过程中自动发生,无需用户额外交互。
由于未进行 HTML 清理,根据前端渲染上下文的不同,事件处理程序可能允许 JavaScript 执行。



本报告由 minnggyuu 编写。(Team 404 Not Found, WhiteHat School 3rd Cohort, 韩国)