
PoC: changedetection.io सेटिंग्स blind-merge mass assignment (CVE-2026-71204, मध्यम 6.3)
उत्पाद: dgtlmoon/changedetection.io — v0.55.7
फ़ाइलें: changedetectionio/blueprint/settings/__init__.py, changedetectionio/forms.py
CWE: CWE-284 — अनुचित एक्सेस नियंत्रण
CVSS 3.1: AV:N/AC:H/PR:H/UI:N/S:U/C:H/I:H/A:L — 6.3 (मध्यम)
CNA: Turan Security · CVE रिकॉर्ड
changedetection.io का /settings सेव हैंडलर form.data['application'] से एक अपडेट dict बनाता है और
उसे .update() के माध्यम से संग्रहीत एप्लिकेशन सेटिंग्स में ब्लाइंड-मर्ज करता है।
क्योंकि HTML चेकबॉक्स केवल सबमिट किए गए फ़ॉर्म डेटा में तब दिखाई देते हैं जब वे चेक किए जाते हैं, एक
क्राफ्टेड POST जो केवल छोड़ देता है एक सुरक्षा-प्रासंगिक चेकबॉक्स फ़ील्ड (जैसे API key आवश्यकता
लागू करने वाला) को हैंडलर स्तर पर उस स्थिति से अप्रभेद्य होता है जब उपयोगकर्ता ने UI में उसे अनचेक किया हो —
ब्लाइंड .update() उस सेटिंग को मौन रूप से बंद कर देता है।
एक अनुरोध जो कभी भी api_access_token_enabled (या समतुल्य) को स्पष्ट रूप से false नहीं सेट करता है —
वह केवल फ़ील्ड को POST बॉडी से बाहर छोड़ देता है — परिणामस्वरूप एप्लिकेशन सेटिंग्स को उस सुरक्षा के प्रभावी रूप से
अक्षम किए जाने के साथ मर्ज कर दिया जाता है, बिना किसी स्पष्ट पुष्टिकरण चरण या ऑडिट संकेत के जो
"उपयोगकर्ता ने इसे अनचेक किया" और "फ़ील्ड नहीं भेजी गई" के बीच अंतर कर सके।
/settings पृष्ठ पर सामान्य रूप से प्रमाणित करें।/settings पर एक POST सबमिट करें जिसमें
api_access_token_enabled फ़ील्ड (या जो भी सुरक्षित बूलियन सेटिंग परीक्षण की जा रही है)
बॉडी से पूरी तरह हटा दी गई हो, केवल असंबंधित फ़ील्ड शामिल करते हुए:
POST /settings HTTP/1.1
Content-Type: application/x-www-form-urlencoded
application-some_other_field=value
form.data['application'] → .update() मर्ज लापता फ़ील्ड को
स्पष्ट "बंद," के समान मानता है, सुरक्षा को मौन रूप से अक्षम करता है, बिना उपयोगकर्ता (या अनुरोध की
समीक्षा करने वाले ऑडिटर) को एक स्पष्ट टॉगल-ऑफ़ संकेत दिखे।कच्चे फ़ॉर्म डेटा से ब्लाइंड dict .update() उपयोग चेकबॉक्स-आधारित सेटिंग्स के लिए "POST से अनुपस्थित फ़ील्ड" को
"स्पष्ट रूप से false पर सेट फ़ील्ड" के साथ एक मान लेता है — HTML फ़ॉर्म कभी भी अनचेक किए गए चेकबॉक्स को
सबमिट नहीं करते, इसलिए यह पैटर्न सुरक्षा निहितार्थ वाले किसी भी सेटिंग फ़ील्ड के लिए
असुरक्षित है।
अपेक्षित बूलियन सेटिंग फ़ील्ड्स को स्पष्ट रूप से सूचीबद्ध करें और अनुपस्थित फ़ील्ड्स को उनके
वर्तमान संग्रहीत मान पर डिफ़ॉल्ट करें (False नहीं), या एक फ़ॉर्म लाइब्रेरी का उपयोग करें जो "सबमिट नहीं किया गया"
को "अनचेक के रूप में सबमिट किया गया" से अलग करती है और सुरक्षा-प्रासंगिक टॉगल्स को ब्लाइंड dict मर्ज के बजाय
स्पष्ट रूप से मान्य करती है।