Severity by source
AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N
Network-accessible endpoint requires no authentication or user interaction; impact is schema-only disclosure, so C:L with I:N and A:N is appropriate.
Primary rating from Vendor (TuranSec).
CVSS VectorVendor: TuranSec
Lifecycle Timeline
1DescriptionCVE.org
changedetection.io's REST API resources are protected by an @auth.check_token decorator validating the caller's x-api-key header, except the Spec resource registered at /api/v1/full-spec (changedetectionio/api/Spec.py), whose get() method carries neither @auth.check_token nor @validate_openapi_request. An unauthenticated client can retrieve the full merged OpenAPI schema (all endpoint paths, parameters, and registered processor plugins) even when API access control is enabled and every sibling /api/v1/* route correctly requires the key.
AnalysisAI
Unauthenticated retrieval of the full OpenAPI schema is possible in changedetection.io because the /api/v1/full-spec endpoint in changedetectionio/api/Spec.py lacks the @auth.check_token decorator that protects every other /api/v1/* route. Any network-reachable attacker can issue a plain GET request to this path and receive the complete merged schema - all endpoint paths, accepted parameters, and registered processor plugins - even when API key enforcement is active across all sibling routes. No active exploitation has been confirmed (not in CISA KEV) and no public exploit code has been identified, though the attack requires zero prerequisites beyond network access, making opportunistic reconnaissance trivially achievable.
Technical ContextAI
changedetection.io is an open-source, self-hosted web-change monitoring application written in Python (Flask). Its REST API uses a decorator pattern - @auth.check_token - to enforce x-api-key header validation on each registered resource. The Spec resource, defined in changedetectionio/api/Spec.py and mounted at /api/v1/full-spec, exposes the merged OpenAPI/Swagger schema for the entire API surface. Its get() method omits both @auth.check_token and @validate_openapi_request, deviating from the uniform protection applied to every sibling route. The root cause maps to CWE-306 (Missing Authentication for Critical Function): a discrete, operationally significant endpoint was excluded from the access-control mechanism that governs the rest of the API, creating an inconsistency exploitable without any credentials. The CPE wildcard cpe:2.3:a:dgtlmoon:changedetection.io:*:*:*:*:*:*:*:* indicates no version was exempt from this oversight.
RemediationAI
The definitive fix is to add the @auth.check_token decorator to the get() method of the Spec resource in changedetectionio/api/Spec.py, bringing it in line with all other /api/v1/* routes. Monitor the upstream GitHub repository at https://github.com/dgtlmoon/changedetection.io for a tagged release that includes this change; no exact patched version number was available at time of analysis. As an immediate compensating control, restrict network access to the changedetection.io instance using firewall rules or reverse-proxy IP allowlisting so that only trusted hosts can reach any /api/v1/ path - this eliminates the network attack vector with no application-level side effects. Alternatively, configure a reverse proxy (nginx, Caddy, Traefik) to return 401 or 403 on requests to /api/v1/full-spec specifically, as a targeted path-level block; note this blocks legitimate schema browsing tools but does not affect API functionality. If the instance does not need to be internet-facing, binding it to localhost or a private interface is the simplest and most effective mitigation.
More in Changedetection Io
View allArbitrary local file disclosure in ChangeDetection.io versions before 0.54.7 allows authenticated attackers to read sens
Unrestricted brute-force against changedetection.io's /login endpoint allows a remote unauthenticated attacker to system
Authentication bypass in changedetection.io's /settings endpoint silently disables REST API key enforcement when a privi
Same technique Authentication Bypass
View allShare
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-53200
GHSA-9vx6-gpfr-5qq7