Open WebUI CVE-2026-44549
HIGHSeverity by source
AV:N/AC:L/PR:L/UI:R/S:U/C:H/I:H/A:N
Network-delivered stored XSS needing a low-priv authenticated uploader (PR:L) and victim preview interaction (UI:R); token theft and admin-RCE chaining justify C:H/I:H, no availability impact.
Primary rating from GitHub Advisory.
CVSS VectorGitHub Advisory
Lifecycle Timeline
3DescriptionGitHub Advisory
Summary
Excel file attachments are previewed in an unsafe way. A crafted XLSX file payload can be used to cause the sheetjs function sheet_to_html to embed an XSS payload into the generated HTML. This is subsequently added to the DOM unsanitized via @html causing the payload to trigger.
Details
The function used to convert XLSX documents to HTML for preview does not perform any input validation or sanitisation for the generated HTML https://github.com/open-webui/open-webui/blob/a7271532f8a38da46785afcaa7e65f9a45e7d753/src/lib/components/common/FileItemModal.svelte#L120-L133 XLSX attachments are processed by this function, converted to HTML with XLSX.utils.sheet_to_html before ultimately being assigned to the variable excelHtml. Later there is logic that causes this to be assigned directly to the DOM when the preview tab is selected. https://github.com/open-webui/open-webui/blob/a7271532f8a38da46785afcaa7e65f9a45e7d753/src/lib/components/common/FileItemModal.svelte#L358-L400
PoC
A python script to generate a payload file is as follows:
import xlsxwriter
payload = '<img src=x onerror="alert(\'XSS Triggered by XLSX file\')">'
workbook = xlsxwriter.Workbook('xss_payload.xlsx')
worksheet = workbook.add_worksheet()
payload_format = workbook.add_format()
worksheet.write_rich_string('A1',
'This cell contains a hidden payload: ',
payload_format, payload
)
worksheet.write('A2', 'This is a safe cell.')
worksheet.write('B1', 'Column B')
workbook.close()Upload the generated file as an attachment to a chat, open the file modal, and click preview. Observe the XSS triggers. <img width="2444" height="1386" alt="image" src="https://github.com/user-attachments/assets/8400efb0-ea6f-4878-abdb-4c2fe529241f" /> This same process can be triggered in shared chats, allowing the payload to be distributed to victims. <img width="2386" height="1646" alt="image" src="https://github.com/user-attachments/assets/d0eda49c-8fcf-4fc4-bbb0-c8951b0369c3" />
Impact
Any user can create a weaponised chat that can be shared and subsequently used to target other users.
Low privilege users are at risk of having their session taken over by a payload that reads their token from local storage and exfiltrates it to an attacker controlled server.
Admins are at risk of exposing the server to RCE via same chain described in GHSA-w7xj-8fx7-wfch.
Caveats
The file attachment in the shared chat must be opened and previewed to trigger the vulnerability.
Recommendation
Sanitise the generated HTML with DOMPurify before assigning it to the DOM.
AnalysisAI
Stored cross-site scripting in Open WebUI (pip package open-webui, versions ≤ 0.7.2) lets a low-privileged user weaponize a crafted XLSX attachment so that when another user opens and previews it, attacker-controlled markup executes in the victim's browser. The flaw stems from the Excel-to-HTML preview path, which converts spreadsheet cells to HTML and injects the result into the DOM without sanitization. Publicly available exploit code exists (PoC in the advisory); EPSS is very low (0.03%) and it is not on CISA KEV, so exploitation is possible but not observed at scale.
Technical ContextAI
Open WebUI is a Svelte-based front end for self-hosted LLM interfaces. Its FileItemModal component uses the SheetJS library's XLSX.utils.sheet_to_html() to render Excel attachments as an HTML preview. SheetJS's sheet_to_html emits cell contents into an HTML table without HTML-encoding, so markup embedded in a cell (e.g., via a rich-string) survives into the generated string. Open WebUI then binds that string to the DOM using Svelte's {@html} directive, which performs no escaping by design. This is a classic CWE-79 (Improper Neutralization of Input During Web Page Generation) stored/persistent XSS: untrusted file content flows through a rendering sink that trusts it as markup.
RemediationAI
Vendor-released patch: upgrade to Open WebUI 0.8.0, which is the first fixed release (versions ≤ 0.7.2 are vulnerable). The upstream recommendation is to sanitize the generated preview HTML with DOMPurify before assigning it to the DOM, which is incorporated in the fix. If you cannot upgrade immediately, compensating controls include disabling or restricting the Excel/XLSX file-preview feature in FileItemModal so untrusted spreadsheets are never rendered via {@html} (trade-off: users lose in-app spreadsheet previews), and tightening chat-sharing so untrusted or low-privilege users cannot distribute attachments to others (trade-off: reduced collaboration). A restrictive Content-Security-Policy that blocks inline script and constrains outbound connections can reduce token-exfiltration impact but will not fully stop DOM-based XSS such as img/onerror handlers. See the advisory at https://github.com/open-webui/open-webui/security/advisories/GHSA-jwf8-pv5p-vhmc for authoritative guidance.
Wazuh SIEM platform versions 4.4.0 through 4.9.0 contain an unsafe deserialization vulnerability in the DistributedAPI t
BentoML version 1.4.2 and earlier contains an unauthenticated remote code execution vulnerability through insecure deser
pgAdmin 4 contains critical remote code execution vulnerabilities in the Query Tool download and Cloud Deployment endpoi
The renderLocalView function in render/views.py in graphite-web in Graphite 0.9.5 through 0.9.10 uses the pickle Python
BentoML is a Python library for building online serving systems optimized for AI apps and model inference. Rated critica
OpenSSL before 0.9.8za, 1.0.0 before 1.0.0m, and 1.0.1 before 1.0.1h does not properly restrict processing of ChangeCiph
pyLoad download manager version prior to 0.5.0b3.dev77 exposes the Flask SECRET_KEY through an unauthenticated endpoint.
Langflow (a visual LLM pipeline builder) contains a critical unauthenticated code execution vulnerability (CVE-2026-3301
In Mercurial before 4.1.3, "hg serve --stdio" allows remote authenticated users to launch the Python debugger, and conse
Unauthenticated remote code execution affects Kestra OSS (the open-source event-driven orchestration platform) prior to
Unauthenticated remote code execution in Marimo ≤0.20.4 allows attackers to execute arbitrary system commands via the `/
pyLoad is the free and open-source Download Manager written in pure Python. Rated medium severity (CVSS 5.3), this vulne
Same weakness CWE-79 – Cross-site Scripting (XSS)
View allShare
External POC / Exploit Code
Leaving vuln.today
GHSA-jwf8-pv5p-vhmc