एक GET कलेक्शन एंडपॉइंट पर सुरक्षा जांच की कमी के कारण, CoopCycle के किसी भी बेसिक अकाउंट वाला व्यक्ति एक साझा इंस्टेंस (shared instance) के हर स्टोर की पूरी एड्रेस बुक निकाल सकता था, जिससे अनगिनत ग्राहकों के नाम, सड़क के पते और पोस्टकोड उजागर हो गए। इस खामी को दो दिनों के भीतर ठीक (patch) कर दिया गया है, और उपयोगकर्ताओं से नवीनतम जारी किए गए संस्करण में अपग्रेड करने का आग्रह किया गया है।

लीक कैसे हुआ

CoopCycle – जो फूड-डिलीवरी को-ऑपरेटिव्स द्वारा उपयोग किया जाने वाला एक ओपन-सोर्स लॉजिस्टिक्स प्लेटफॉर्म है – अपने API को PHP फ्रेमवर्क API Platform के साथ परिभाषित करता है। इस फ्रेमवर्क में प्रत्येक ऑपरेशन (POST, GET, आदि) को एक सुरक्षा अभिव्यक्ति (security expression) के साथ जोड़ा जाना चाहिए; यदि अभिव्यक्ति को छोड़ दिया जाता है, तो फ्रेमवर्क बिना किसी ऑथराइजेशन चेक के कोड चला देता है।

डेवलपर्स ने स्टोर की एड्रेस लिस्ट बनाने या अपडेट करने वाले POST अनुरोध को मानक अभिव्यक्ति is_granted('edit', object) के साथ सुरक्षित किया था। यह काम करता है क्योंकि अनुरोध एक सिंगल स्टोर एंटिटी को लक्षित करता है, जिससे फ्रेमवर्क को मूल्यांकन करने के लिए एक ठोस "object" मिल जाता है।

वही संसाधन पढ़ने वाला GET अनुरोध एक कलेक्शन को लक्षित करता है: /api/stores/{id}/addresses। एक कलेक्शन में कोई सिंगल ऑब्जेक्ट नहीं होता है, इसलिए उसी is_granted('edit', object) अभिव्यक्ति को लागू नहीं किया जा सकता है। क्योंकि डेवलपर्स ने सुरक्षा लाइन को छोड़ दिया था, इसलिए फ्रेमवर्क ने टेनेंसी (tenancy) की परवाह किए बिना किसी भी प्रमाणित उपयोगकर्ता को एड्रेस डेटा उपलब्ध करा दिया।

एक साझा CoopCycle इंस्टेंस पर, एक दुर्भावनापूर्ण उपयोगकर्ता (malicious user) बस स्टोर आईडी के माध्यम से इटरेशन कर सकता था, एंडपॉइंट पर GET अनुरोध भेज सकता था, और सिस्टम में संग्रहीत प्रत्येक ग्राहक के घर के पते स्क्रैप (scrape) कर सकता था। इसके लिए एक सामान्य अकाउंट के अलावा किसी अतिरिक्त विशेषाधिकार की आवश्यकता नहीं थी।

बग क्यों बना रहा

यह समस्या केवल एक साधारण चूक नहीं थी। API Platform के डिक्लेरेटिव सुरक्षा मॉडल (declarative security model) में यह व्यक्त करने का कोई सीधा तरीका नहीं है कि "उपयोगकर्ता को कलेक्शन के प्रत्येक ऑब्जेक्ट के समान टेनेंट से संबंधित होना चाहिए।" कोड की वह गायब लाइन ठीक वहीं थी जहाँ फ्रेमवर्क ऑथराइजेशन को बोझिल बना देता है।

समस्या को और बढ़ाते हुए, प्रोजेक्ट के टेस्ट सुइट ने वास्तव में यह दावा किया था कि सभी पते वाला GET रिस्पॉन्स अपेक्षित व्यवहार था। दूसरे शब्दों में, स्वचालित परीक्षण (automated tests) सफल रहे क्योंकि परीक्षण में उपयोग किए गए फिक्स्चर (fixtures) ने क्रॉस-टेनेंट एक्सेस की अनुमति दी थी, जिससे प्रभावी रूप से भेद्यता (vulnerability) छिप गई। इस मामले में, एक 'ग्रीन' टेस्ट सुइट ने सुरक्षा का झूठा अहसास कराया।

किसे फायदा हुआ और किसे नुकसान

  • ग्राहक: उनकी व्यक्तिगत रूप से पहचान योग्य जानकारी (PII) – पूर्ण नाम और घर के पते – प्लेटफॉर्म पर किसी भी व्यक्ति के लिए उजागर हो गए। भले ही डेटा सार्वजनिक रूप से पोस्ट नहीं किया गया था, लेकिन इस उल्लंघन ने कई को-ऑपरेटिव्स की गोपनीयता से समझौता किया।
  • CoopCycle का उपयोग करने वाले को-ऑपरेटिव्स: टेनेंट डेटा की सुरक्षा करने की प्लेटफॉर्म की क्षमता पर भरोसा डगमगा गया। कोई भी को-ऑपरेटिव जिसने अभी तक अपग्रेड नहीं किया था, उसे निरंतर जोखिम का सामना करना पड़ा।
  • CoopCycle के मेंटेनर: उनकी त्वरित प्रतिक्रिया – दो दिनों के भीतर पैच और जोड़े गए रिग्रेशन टेस्ट – ने शोषण की अवधि को सीमित कर दिया और जिम्मेदार ओपन-सोर्स प्रबंधन (stewardship) का प्रदर्शन किया। हालाँकि, यह घटना सुरक्षा समीक्षा प्रक्रियाओं को और कड़ा करने की आवश्यकता को रेखांकित करती है, विशेष रूप से फ्रेमवर्क-संचालित डिफॉल्ट्स के आसपास।

डेवलपर्स और ऑडिटर्स को क्या देखना चाहिए

  • ऑपरेशन एसिमेट्री (Operation asymmetry): यदि किसी पाथ पर POST (या कोई भी म्यूटेटिंग ऑपरेशन) सुरक्षित है लेकिन संबंधित GET खुला है, तो यह विसंगति एक रेड फ्लैग है। POST संसाधन की सुरक्षा करने के डेवलपर्स के इरादे को प्रकट करता है।
  • कलेक्शन एंडपॉइंट्स: कोई भी चीज़ जो सिंगल आइटम के बजाय एक सूची (list) लौटाती है, वह अक्सर सामान्य सुरक्षा पैटर्न से बाहर होती है। सत्यापित करें कि बल्क रीड्स (bulk reads) के लिए ऑथराइजेशन चेक स्पष्ट रूप से जोड़े गए हैं।
  • टेस्ट सुइट की वास्तविकता: सुनिश्चित करें कि फिक्स्चर वास्तविक टेनेंसी सीमाओं को दर्शाते हैं। एक पास होने वाला टेस्ट जो क्रॉस-टेनेंट डेटा लीकेज को मान्य करता है, वह चेतावनी का संकेत है, ग्रीन लाइट नहीं।

समाधान और अगले कदम

भेद्यता की रिपोर्ट होने के बाद, CoopCycle कोर टीम ने GET कलेक्शन ऑपरेशन में गायब सुरक्षा अभिव्यक्ति को जोड़ दिया और रिग्रेशन टेस्ट पेश किए जो सिंगल-आइटम और कलेक्शन दोनों एंडपॉइंट्स के लिए टेनेंट आइसोलेशन (tenant isolation) लागू करते हैं। पैच सॉफ़्टवेयर के बाद के संस्करण में जारी किया गया।

CoopCycle के उपयोगकर्ताओं को चाहिए कि वे:

  1. सत्यापित करें कि वे सॉफ़्टवेयर का हालिया संस्करण चला रहे हैं।
  2. किसी भी कस्टम एक्सटेंशन या प्लगइन की समीक्षा करें जो इसी तरह के कलेक्शन-लेवल गैप पैदा कर सकते हैं।
  3. सभी API रूट्स पर रीड/राइट एसिमेट्री पर ध्यान केंद्रित करते हुए सुरक्षा स्कैन फिर से चलाएं।

निष्कर्ष (Takeaway)

सुरक्षा को डिक्लेरेटिव बनाने वाले फ्रेमवर्क खतरनाक कमियों को छिपा सकते हैं जब डेवलपर्स ऐसे पैटर्न्स पर निर्भर होते हैं जो केवल सिंगल ऑब्जेक्ट्स के लिए ही काम करते हैं। एक सरल जाँच—क्या किसी एंडपॉइंट के रीड साइड में वही गार्ड है जो राइट साइड में है?—क्रॉस-टेनेंट लीक्स के एक वर्ग को उजागर कर सकती है, जो अन्यथा ग्रीन टेस्ट सूट्स के पीछे छिपे रह जाते।