CVE-2026-25527: changedetection.io vulnerable to unauthenticated static path traversal
Summary The /static/<group>/<filename> route accepts group="..", which causes sendfromdirectory("static/..", filename) to execute. This moves the base directory up to /app/changedetectionio, enabling unauthenticated local file read of application source files (e.g., flaskapp.py). Severity is low information disclosure (C:L).
Details The vulnerable code is in changedetectionio/flaskapp.py inside staticcontent():
group = re.sub(r'[^\w.-]+', '', group.lower()) filename = re.sub(r'[^\w.-]+', '', filename.lower()) ... return sendfromdirectory(f"static/{group}", path=filename)
The group sanitization allows dots, so group=".." passes validation. This results in sendfromdirectory("static/..", filename), effectively shifting the base directory to /app/changedetectionio and allowing reads of files in that directory. The route is unauthenticated, so any user can retrieve source files without logging in.
> Limitation: the route only matches /static/<group>/<filename> and rejects slashes inside filename, so it cannot traverse further to arbitrary system paths like /etc/passwd. It is limited to files inside the application package directory.
PoC 1) Start an instance (example: Docker on port 5050) docker run -d --name cdio -p 127.0.0.1:5050:5000 -v cdio-data:/datastore cdio-local
2) Reproduce (URL-encoded traversal) curl -i http://127.0.0.1:5050/static/%2e%2e/flaskapp.py
(curl path passthrough) curl --path-as-is -i http://127.0.0.1:5050/static/../flaskapp.py
3) Observe that the response body contains Python source code from flaskapp.py.
Impact - Vulnerability type: Directory Traversal / Local File Read - Affected users: Anyone with network access (no authentication required) - Scope: Source files under /app/changedetectionio - Security impact: Internal logic exposure can aid further exploitation (Confidentiality: Low)
Other sources
changedetection.io is a free open source web page change detection tool. In versions prior to 0.53.2, the /static/<group>/<filename> route accepts group="..", which causes sendfromdirectory("static/..", filename) to execute. This moves the base directory up to /app/changedetectionio, enabling unauthenticated local file read of application source files (e.g., flaskapp.py). Version 0.53.2 fixes the issue.
— NVD
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
pip/changedetection.ioto a version that resolves this vulnerability.Fixed in 0.53.2 - Upgrade
Upgrade
changedetectionioto a version that resolves this vulnerability.Fixed in 0.53.2 - Configuration
Adjust the /static/<group>/<filename> route so that the `group` value can no longer be `..` (the route currently allows dots via `re.sub(r'[^\w.-]+', '', group.lower())`, which enables base-directory shifting through `send_from_directory(f"static/{group}", path=filename)`).
changedetectionio Flask route /static/<group>/<filename> (static_content) group sanitization (re.sub pattern allowing dots) = re.sub(r'[^\w.-]+', '', group.lower())
Event History
Frequently Asked Questions
What is the severity of CVE-2026-25527?
CVE-2026-25527 is considered a medium severity vulnerability due to its potential for unauthorized file access.
How do I fix CVE-2026-25527?
To fix CVE-2026-25527, upgrade changedetection.io to version 0.53.2 or later.
What impact does CVE-2026-25527 have on my system?
CVE-2026-25527 allows unauthenticated users to perform static path traversal, accessing sensitive files on the server.
Which versions of changedetection.io are affected by CVE-2026-25527?
CVE-2026-25527 affects all versions of changedetection.io prior to 0.53.2.
Is authentication required to exploit CVE-2026-25527?
No, CVE-2026-25527 can be exploited by unauthenticated users, making it particularly concerning.