PT-2026-59386 · Pypi · Open-Webui

Published

2026-07-13

·

Updated

2026-07-13

CVSS v3.1

7.3

High

VectorAV:N/AC:L/PR:L/UI:R/S:U/C:H/I:H/A:N

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](https://git.sheetjs.com/sheetjs/sheetjs/src/commit/66cf8d2117d271f89e4f47b5fed35a3e1ea93f67/bits/79 html.js#L127) 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:
python
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. image This same process can be triggered in shared chats, allowing the payload to be distributed to victims. image

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.

Fix

Found an issue in the description? Have something to add? Feel free to write us 👾

Related Identifiers

PYSEC-2026-2744

Affected Products

Open-Webui