
PoC: mass assignment (blind-merge) nelle impostazioni di changedetection.io (CVE-2026-71204, Media 6.3)
Prodotto: dgtlmoon/changedetection.io — v0.55.7
File: changedetectionio/blueprint/settings/__init__.py, changedetectionio/forms.py
CWE: CWE-284 — Controllo degli accessi improprio
CVSS 3.1: AV:N/AC:H/PR:H/UI:N/S:U/C:H/I:H/A:L — 6.3 (Medio)
CNA: Turan Security · record CVE
Il gestore di salvataggio di /settings di changedetection.io costruisce un dizionario di aggiornamento da
form.data['application'] e lo fonde alla cieca nelle impostazioni applicative salvate tramite
.update(). Poiché le caselle di controllo HTML compaiono nei dati del modulo inviato solo quando vengono selezionate, una
POST costruita ad arte che semplicemente omette un campo di casella di controllo rilevante per la sicurezza (come quello che
impone il requisito della chiave API) è indistinguibile, a livello del gestore, dall'utente
che l'ha deselezionata nell'interfaccia — il .update() alla cieca disattiva silenziosamente quell'impostazione.
Una richiesta che non imposta mai esplicitamente api_access_token_enabled (o equivalente) a false —
si limita a lasciare il campo fuori dal corpo della POST — comporta che le impostazioni dell'applicazione vengano
unite con quella protezione di fatto disabilitata, senza alcun passo di conferma esplicito o
segnale di audit che distingua "l'utente ha deselezionato questo" da "il campo non è stato inviato".
/settings./settings con il
campo api_access_token_enabled (o qualsiasi altra impostazione booleana protetta in fase di test)
completamente omesso dal corpo, includendo solo campi non correlati:
POST /settings HTTP/1.1
Content-Type: application/x-www-form-urlencoded
application-some_other_field=value
form.data['application'] → .update() nel gestore di salvataggio delle impostazioni
tratta il campo mancante come un esplicito "off", disabilitando silenziosamente la protezione
senza che l'utente (o un revisore che esamina la richiesta) veda un segnale esplicito di disattivazione.L'uso di un .update() di un dizionario alla cieca dai dati grezzi del modulo confonde "campo assente dalla POST" con
"campo impostato esplicitamente a false" per le impostazioni basate su caselle di controllo — i moduli HTML non inviano mai
caselle di controllo non selezionate, quindi questo schema non è sicuro per qualsiasi campo di impostazioni con implicazioni
di sicurezza.
Enumerare esplicitamente i campi di impostazioni booleani previsti e impostare quelli assenti sul loro
valore corrente memorizzato (non False), oppure utilizzare una libreria di moduli che distingua "non inviato"
da "inviato come non selezionato" e convalidi esplicitamente le opzioni rilevanti per la sicurezza invece di
una fusione alla cieca di dizionari.