أدى غياب فحص أمني في نقطة نهاية مجموعة GET إلى السماح لأي شخص يمتلك حساب CoopCycle أساسي بسحب دفتر العناوين الكامل لكل متجر في نسخة مشتركة، مما كشف عن الأسماء وعناوين الشوارع والرموز البريدية لعدد لا يحصى من العملاء. تم إصلاح الثغرة في غضون يومين، ويُنصح المستخدمون بالترقية إلى أحدث إصدار تم إصداره.

كيف حدث التسريب

تُعرف CoopCycle – وهي منصة لوجستية مفتوحة المصدر تستخدمها تعاونيات توصيل الطعام – واجهة برمجة التطبيقات (API) الخاصة بها باستخدام إطار عمل PHP المسمى API Platform. في هذا الإطار، يجب إقران كل عملية (POST، GET، إلخ) بتعبير أمني؛ وإذا تم حذف التعبير، يقوم إطار العمل بتشغيل الكود دون أي فحص للصلاحيات.

قام المطورون بحماية طلب POST الذي ينشئ أو يحدّث قائمة عناوين المتجر باستخدام التعبير القياسي is_granted('edit', object). وهذا يعمل لأن الطلب يستهدف كيان متجر واحد، مما يمنح إطار العمل "كائناً" (object) ملموساً لتقييمه.

أما طلب GET الذي يقرأ نفس المورد، فإنه يستهدف مجموعة: /api/stores/{id}/addresses. لا تمتلك المجموعة كائناً واحداً، لذا لا يمكن تطبيق نفس التعبير is_granted('edit', object). ولأن المطورين أغفلوا سطر الأمان، قام إطار العمل بتقديم بيانات العناوين لأي مستخدم مسجل، بغض النظر عن تبعيته (tenancy).

في نسخة CoopCycle مشتركة، كان بإمكان مستخدم خبيث ببساطة التكرار عبر معرفات المتاجر، وإرسال طلبات GET إلى نقطة النهاية، وسحب العناوين المنزلية لكل عميل مخزن في النظام. لم تكن هناك حاجة لامتيازات إضافية تتجاوز الحساب العادي.

لماذا استمرت الثغرة

لم تكن المشكلة مجرد سهو بسيط. يفتقر نموذج الأمان التصريحي في API Platform إلى طريقة مباشرة للتعبير عن "يجب أن ينتمي المستخدم إلى نفس المستأجر (tenant) الخاص بكل كائن في المجموعة". لقد وُضع سطر الكود المفقود تماماً في المكان الذي جعل فيه إطار العمل عملية التصريح مرهقة.

ومما زاد الأمر سوءاً، أن مجموعة الاختبارات الخاصة بالمشروع كانت تؤكد في الواقع أن استجابة GET التي تحتوي على جميع العناوين هي السلوك المتوقع. بعبارة أخرى، اجتازت الاختبارات الآلية لأن البيانات التجريبية (fixtures) المستخدمة في الاختبار سمحت بالوصول عبر المستأجرين، مما أدى فعلياً إلى إخفاء الثغرة. في هذه الحالة، أعطت مجموعة الاختبارات الناجحة (green test suite) شعوراً زائفاً بالأمان.

من الرابح ومن الخاسر

  • العملاء: تعرضت معلومات تحديد الهوية الشخصية (PII) الخاصة بهم – الأسماء الكاملة والعناوين المنزلية – للكشف لأي شخص على المنصة. وعلى الرغم من أن البيانات لم تُنشر علناً، إلا أن الاختراق انتهك الخصوصية عبر تعاونيات متعددة.
  • التعاونيات التي تستخدم CoopCycle: اهتزت الثقة في قدرة المنصة على حماية بيانات المستأجرين. واجهت أي تعاونية لم تقم بالترقية بعد خطر استمرار التعرض للاختراق.
  • القائمون على صيانة CoopCycle: حدت استجابتهم السريعة – عبر إصدار رقعة برمجية في غضون يومين وإضافة اختبارات تراجع (regression tests) – من نافذة الاستغلال وأظهرت إشرافاً مسؤولاً على المصادر المفتوحة. ومع ذلك، يسلط الحادث الضوء على الحاجة إلى عمليات مراجعة أمنية أكثر صرامة، خاصة فيما يتعلق بالإعدادات الافتراضية التي يفرضها إطار العمل.

ما يجب على المطورين والمدققين البحث عنه

  • عدم التماثل في العمليات (Operation asymmetry): إذا كان طلب POST (أو أي عملية تغيير) على مسار معين محمياً، بينما كان طلب GET المقابل مفتوحاً، فإن هذا التباين يعد علامة تحذير. يكشف طلب POST عن نية المطورين في حماية المورد.
  • نقاط نهاية المجموعات (Collection endpoints): أي شيء يعيد قائمة بدلاً من عنصر واحد غالباً ما يقع خارج أنماط الأمان المعتادة. تحقق من إضافة فحوصات التصريح صراحةً لعمليات القراءة الجماعية.
  • واقعية مجموعة الاختبارات: تأكد من أن البيانات التجريبية (fixtures) تعكس حدود المستأجرين الحقيقية. الاختبار الناجح الذي يثبت تسرب البيانات عبر المستأجرين هو علامة تحذير، وليس ضوءاً أخضر.

الإصلاح والخطوات التالية

بعد الإبلاغ عن الثغرة، أضاف الفريق الأساسي لـ CoopCycle التعبير الأمني المفقود لعملية مجموعة GET وقدم اختبارات تراجع تفرض عزل المستأجرين لكل من نقاط نهاية العنصر الواحد والمجموعات. تم إرسال الإصلاح في إصدار لاحق من البرنامج.

يجب على مستخدمي CoopCycle:

  1. التحقق من أنهم يستخدمون إصداراً حديثاً من البرنامج.
  2. مراجعة أي إضافات أو ملحقات مخصصة قد تتسبب في فجوات مماثلة على مستوى المجموعة.
  3. إعادة تشغيل عمليات فحص الأمان مع التركيز على عدم التماثل بين القراءة والكتابة عبر جميع مسارات API.

الخلاصة

الأطر البرمجية التي تجعل الأمن تصريحياً قد تخفي ثغرات خطيرة عندما يعتمد المطورون على أنماط لا تعمل إلا مع الكائنات الفردية. فحص بسيط — هل يمتلك جانب القراءة في نقطة النهاية نفس الحماية الموجودة في جانب الكتابة؟ — يمكن أن يكشف عن فئة من تسريبات البيانات عبر المستأجرين التي كانت ستظل مخفية وراء مجموعات اختبار ناجحة.