
PoC : affectation de masse par fusion aveugle des paramètres de changedetection.io (CVE-2026-71204, Moyenne 6.3)
Produit : dgtlmoon/changedetection.io — v0.55.7
Fichiers : changedetectionio/blueprint/settings/__init__.py, changedetectionio/forms.py
CWE : CWE-284 — Contrôle d'accès inapproprié
CVSS 3.1 : AV:N/AC:H/PR:H/UI:N/S:U/C:H/I:H/A:L — 6.3 (Moyen)
CNA : Turan Security · Fiche CVE
Le gestionnaire d'enregistrement /settings de changedetection.io construit un dictionnaire de mise à jour à partir de form.data['application'] et le fusionne aveuglément dans les paramètres applicatifs stockés via .update(). Comme les cases à cocher HTML n'apparaissent dans les données de formulaire soumises que lorsqu'elles sont cochées, une requête POST spécialement conçue qui omet simplement un champ de case à cocher lié à la sécurité (comme celui qui impose l'exigence de clé API) est indiscernable, au niveau du gestionnaire, d'un utilisateur qui l'aurait décochée dans l'interface — le .update() aveugle désactive silencieusement ce paramètre.
Une requête qui ne définit jamais explicitement api_access_token_enabled (ou équivalent) à false — elle omet simplement le champ du corps de la requête POST — aboutit à une fusion des paramètres applicatifs avec cette protection effectivement désactivée, sans étape de confirmation explicite ni signal d'audit distinguant « l'utilisateur a décoché ce champ » de « le champ n'a pas été envoyé ».
/settings./settings en omettant entièrement le champ api_access_token_enabled (ou tout autre paramètre booléen protégé testé) du corps de la requête, tout en incluant uniquement des champs sans rapport :
POST /settings HTTP/1.1
Content-Type: application/x-www-form-urlencoded
application-some_other_field=value
form.data['application'] → .update() dans le gestionnaire d'enregistrement des paramètres traite le champ manquant de la même manière qu'un « off » explicite, désactivant silencieusement la protection sans que l'utilisateur (ni un auditeur examinant la requête) ne voie de signal explicite de désactivation.L'utilisation d'un .update() aveugle de dictionnaire à partir des données brutes du formulaire confond « champ absent de la requête POST » avec « champ explicitement défini à false » pour les paramètres basés sur des cases à cocher — les formulaires HTML ne soumettent jamais les cases non cochées, ce motif est donc dangereux pour tout paramètre ayant des implications en matière de sécurité.
Énumérez explicitement les champs de paramètres booléens attendus et attribuez aux champs absents leur valeur stockée actuelle (pas False), ou utilisez une bibliothèque de formulaires qui distingue « non soumis » de « soumis comme décoché » et valide explicitement les paramètres booléens liés à la sécurité plutôt qu'une fusion aveugle de dictionnaire.