NiceGUI apps are vulnerable to XSS which uses `ui.sub_pages` and render arbitrary user-provided links
Summary
An unsafe implementation in the click event listener used by ui.sub_pages, combined with attacker-controlled link rendering on the page, causes an XSS when the user actively clicks on the link.
Details
-
On
click, eventuallysub_pages_navigateevent is emitted. https://github.com/zauberzeug/nicegui/blob/59fa9424c470f1b12c5d368985fa36e21fda706b/nicegui/elements/sub_pages.js#L41-L63 -
SubPagesRouter (used by ui.sub_pages), lisnening on
sub_pages_navigate,_handle_navigateruns. https://github.com/zauberzeug/nicegui/blob/59fa9424c470f1b12c5d368985fa36e21fda706b/nicegui/sub_pages_router.py#L18-L22 -
_handle_navigaterunsrun_javascriptwith f-string substitutingself.current_pathwhich is simply surrounded by double-quotes. The string context can be broken out easily.
PoC
The minimal PoC boils down to this:
from nicegui import ui
ui.sub_pages({'/': lambda: ui.link('Go to XSS', '/"+alert(1)+"')})
ui.run()
However, it is more likely that the attack takes place with attacker-controlled input, for which this shows it:
from nicegui import app, ui
ui.sub_pages({'/': lambda: ui.label('Hello, World!')})
ui.textarea('Markdown content').bind_value(app.storage.general, 'markdown_content')
ui.markdown().bind_content_from(app.storage.general, 'markdown_content')
ui.run()
Vulnerable input is [XSS LINK](/"+alert(document.domain)+") (causes double payload execution, though)
Both cases require someone to click on the link.
<img width="1428" height="254" alt="image" src="https://github.com/user-attachments/assets/8be4f345-c0cf-4df2-9917-677a2ea72626" />Impact
Any page which uses ui.sub_pages and renders arbitrary links on screen (common case of ui.markdown) is affected.
The impact is low since a click is always required from the user, who can on-hover to discover the sketchy content of the link and stop if well-trained.
Appendix
AI is used safely to judge the CVSS scoring (input is not even provided, just the impact statement).
Please find the results in https://poe.com/s/y5DvyqgtszDGLUuHin1O
Scoring update after manual review
- Scope Changed is more inline with other posted XSS vulnerabilities
- Availability None: No DDoS is possible with this. Site remains performant as ever.
Affected software
Click a technology to see all vulnerabilities affecting it.
| Platform | Package | Vulnerable versions | Fixed in |
|---|---|---|---|
| Python (PyPI) | nicegui | >= 2.22.0, < 3.5.0 | 3.5.0 |
References
- https://github.com/zauberzeug/nicegui/security/advisories/GHSA-m7j5-rq9j-6jj9
- https://nvd.nist.gov/vuln/detail/CVE-2026-21872
- https://github.com/zauberzeug/nicegui
- https://github.com/zauberzeug/nicegui/releases/tag/v3.5.0
- https://pypi.org/project/nicegui
- https://github.com/advisories/GHSA-m7j5-rq9j-6jj9
- CVSS vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N- Weakness (CWE)
CWE-79- Platform
- Python (PyPI)
- Package
nicegui- Disclosed
- 08.01.2026
- Updated
- 11.10.2026 13:19
Sources and licenses
OSV / GitHub Advisory Database - PYSEC-2026-1701 - PyPA Advisory Database; CC BY 4.0
OSV / GitHub Advisory Database - GHSA-m7j5-rq9j-6jj9 - CC BY 4.0
Vulnerability history: nicegui
All published vulnerabilities of this package (Python (PyPI)), newest first. Shows whether this is a one-off slip or a package that needs watching.
- Total entries
- 17
- First → latest
- 04.2024 05.2026
- Without a fix
- 0
- Exploited in attacks
- 0
Severity breakdown
- High 6
- Medium 11
Disclosures per year
- 2024: 1
- 2025: 5
- 2026: 11
-
NiceGUI apps are vulnerable to XSS which uses `ui.sub_pages` and render arbitrary user-provided links this entry
Know which vulnerabilities affect your application
With the DockRay integration and software inventory enabled, DockRay checks reported component versions against known vulnerabilities and notifies you about confirmed matches. Coverage depends on the supported technology and available advisory data.