خطأ في عكس القائمة البريدية مع تداعيات أمنية

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

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

تخيل أنني مشترك في قائمتين بريديتين، A و B، بعنوان بريدي Gmail. لديهما قراء مختلفون محتملون. يرسل خادم القائمة نسخة واحدة من رسالة إلى أولئك الموجودين في كلتا القائمتين البريديتين، ولكن سطر “إلى:” يشير إلى إرسال الرسالة إلى القائمتين A و B في نفس البريد الإلكتروني. تصل هذه الرسالة إلى عنوان Gmail الخاص بي، والذي يقوم بعد ذلك عبر عامل تصفية بإعادة توجيه نسخة إلى listA@mydiscourse.org.uk، مع اختيار Gmail لإحدى القائمتين في سطر “إلى:”. تم تعيين Gmail لإعادة توجيه المنشورات إلى A إلى listA@mydiscourse.org.uk وإعادة توجيه المنشورات إلى B إلى listB@mydiscourse.org.uk. تم إعداد Discourse بفئتين مع هاتين العنوانين البريديين المتعاكسين الواردين المختلفين (listA@mydiscourse.org.uk و listB@mydiscourse.org.uk).

قضية خادم القائمة و Gmail بإرسال نسخة واحدة فقط منفصلة وليست موضوع هذا الخطأ.

بعد ذلك، تنتهي نسخة البريد الإلكتروني المرسلة إلي على حساب Gmail الخاص بي في العرض في الفئة المرتبطة بعنوان البريد الإلكتروني الوارد listA@mydiscourse.org.uk بعد إعادة توجيه Gmail لها.

كل شيء على ما يرام حتى الآن (بصرف النظر عن حقيقة أن بريدًا إلكترونيًا واحدًا فقط جاء من خادم القائمة في المقام الأول).

الآن، يقوم مستخدم منفصل، وهو موجود فقط في القائمة البريدية B، بالرد على هذا البريد الإلكتروني إلى خادم القائمة. يرسل خادم القائمة هذه الرسالة إلى كل شخص في القائمة البريدية B. تصل هذه الرسالة إلى عنوان Gmail الخاص بي مع سطر “إلى:” يشير إلى أنها أُرسلت إلى القائمة B. يقوم Gmail بإعادة توجيهها إلى listB@mydiscourse.org.uk.

ولكن بعد ذلك يقوم Discourse بحفظها كما لو تم إرسالها بالبريد الإلكتروني إلى listA@mydiscourse.org.uk!

هذا يكشف بالتالي لأولئك الذين لديهم وصول إلى القائمة A محتويات منشور عضو في القائمة B!

أشك في أن Discourse يتجاهل المسار الذي سلكه البريد الإلكتروني للوصول إلى Discourse ويحفظه بناءً على علامات معرف الرسالة في الرؤوس، وبالتالي التحايل على المسار الداخلي.

يحتوي البريد الإلكتروني الأصلي، المرسل إلى A و B، على معرف رسالة واحد بداخله، وأشك في أن الحفظ بناءً على معرف الرسالة هذا وحده يحدث.

إذا كان مرسل البريد الإلكتروني الأصلي قد كتب بريدين إلكترونيين منفصلين إلى القائمتين A و B، فلن تحدث هذه المشكلة لأن الرسالتين سيكون لهما معرفات رسائل خاصة بهما.

الإصلاح المقترح: إذا كانت فئة تعكس قائمة بريدية وتأتي رسالة عبر العنوان العاكس الذي يبدو من الرؤوس أنه رد على منشور آخر موجود في مكان آخر على Discourse، فيجب إنشاء منشور جديد (ربما بدون أصل واضح) في الفئة المتوقعة، بدلاً من انتهاء الرد في فئة مرتبطة بقائمة بريدية مختلفة.

بالفعل، أو:

أعتقد أن هذا هو موضوع هذا الخطأ. يجب إصلاح هذا في خادم القوائم، وليس في ديسكورس.

إعجاب واحد (1)

لست متأكدًا مما إذا كنت قد أوضحت نفسي جيدًا حيث لا يمكنني فهم سبب قيام Discourse بوضع منشور في الفئة الخاطئة. يبدو الأمر كما لو أنه لا ينظر إلى المسار في (الذي يجب أن يكون له الأولوية) ولكن فقط إلى معرف الرسالة. بالنسبة لبريد إلكتروني واحد تم إرساله إلى قائمتين بريديتين في نفس الوقت، سيكون هناك معرف رسالة واحد ولكن مع قائمتين توزيع (مستقلتين)، وعنوانين “إلى:” وعنوانين “رد على:” (مع عنوان مختلف معروض على كل رسالة اعتمادًا على القائمة التي تم إرسالها إليها).

إذا كان هذا هو ما يحدث، فماذا سيحدث إذا قام شخص ما بنقل موضوع من فئة كانت مرآة لقائمة بريدية، ووضعه في مكان آخر على Discourse، ولكن بعد ذلك استمرت الردود (عبر القائمة البريدية) في الوصول؟ هل سيضيف Discourse تلك الردود إلى الفئة المرتبطة بالقائمة البريدية (على الرغم من أن المنشور الأصلي ربما تم نقله بعيدًا) أم ستنتهي جميع الردود بشكل سحري في الفئة التي تم نقل الموضوع إليها؟

هل يمكن لـ Discourse التعامل مع وجود رسالتين في فئتين في نفس الوقت لهما نفس معرف الرسالة (ولكن بعناوين “إلى:” مختلفة؟

بغض النظر عن كيفية تعامل Discourse مع هذا، يجب أن يكون Message-ID فريدًا. في رأيي، عندما يرسل خادم قائمة بريدية رسالة إلى قائمة بريدية، فإنه ينشئ نسخة جديدة من تلك الرسالة وبالتالي يجب عليه إعادة كتابة معرف الرسالة.

علاوة على ذلك، أفشل في فهم كيف يمكن أن تكون الرسالة الأصلية مناسبة لكل من أعضاء القائمتين أ و ب، ولكن لا يمكن الكشف عن رد عضو القائمة ب لأعضاء القائمة أ. إذا كانت تلك الجماهير مختلفة جدًا، فلماذا يرسل المستخدم نفس الرسائل إلى كلتا القائمتين في نفس الوقت؟

ربما هناك حل تقني جيد لهذا الأمر وربما يمكن تغيير Discourse بحيث يتعامل مع هذا بشكل صحيح، ولكني أجد هذه حالة متطرفة غريبة حقًا في تكنولوجيا عمرها 36 عامًا.

يمكن القول إنه نظرًا لأن الرسالة متطابقة، فلها معرف رسالة واحد. في الواقع، بالنسبة للمثال المعني، قام المرسل الأصلي بإنشاء الرسالة في Gmail (التي قامت بتعيين معرف الرسالة) وتم إرسالها إلى عنواني قائمة بريدية على نفس الخادم. هذا ليس أمرًا غير شائع، على سبيل المثال، يمكن أن يكون بيانًا صحفيًا مشتركًا للمديرين والأطباء، وكل منهم يجلس على قوائم بريدية خاصة به. قد تكون هناك مشكلة طبية ضمن البيان الصحفي تحتاج إلى مناقشة، لذلك قد يرد الطبيب (وسيتم تعيين عنوان الرد إلى قائمة الأطباء على الرغم من أن رأس “إلى” لا يزال يحتوي على كلتا القائمتين البريديتين المذكورتين). وبالمثل، قد يرغب المديرون في مناقشة وجهة نظرهم الخاصة بشأن الأخبار. سيردون وسيتم استخدام رأس الرد المناسب لعكس قائمة المديرين. إذا استخدم أحد المرسلين عناوين “إلى” عن طريق إجراء “رد على الكل”، فسيتم إنشاء رسالة مرفوضة من القائمة التي لم يكونوا أعضاء فيها.

السلوك المذكور أعلاه ليس غير عادي ولكنه يبدو أن Discourse لا يمكنه التعامل معه بشكل صحيح إذا تم استخدامه كمرآة لقائمة بريدية والحفاظ على الردود المتفرعة منفصلة لأنها ستُربط جميعًا بمعرف الرسالة الأصلي والفئة التي ظهر فيها المنشور لأول مرة.

قد يعني هذا أن المديرين يمكنهم رؤية منشورات الأطباء على سبيل المثال، إذا كان الطبيب، ردًا على قائمة الأطباء، قد ظهر هذا المنشور في مرآة قائمة المديرين بسبب الطريقة التي تقوم بها Discourse بتخزين الرسائل.

قد يكون الحل هو التحقق من كل عنوان في رأس “إلى” للرسائل الواردة لمعرفة ما إذا كان يتطابق مع عنوان مرآة قائمة بريدية في كل من إعدادات الفئة. إذا كان الأمر كذلك، يمكن نشر نسخة من الرسالة في كل فئة متطابقة، وقد يكون هناك عدة نسخ محتملة للمنشور في فئات مختلفة. بعد ذلك، إذا جاءت أي ردود، يمكن استخدام معرف الرسالة، كما هو الحال حاليًا، ولكن فقط إذا كان سطر “إلى” يتطابق مع الفئة أيضًا.

هل يمكن أن يكون أحد الحلول هو خيار لإعادة كتابة معرف الرسالة (message-id) ليعكس المعرف الأصلي الذي أنشأه عميل البريد الخاص بالمرسل بالإضافة إلى معرف إضافي، على سبيل المثال، عنوان “إلى” (To:) الخاص بالقائمة البريدية الذي يبحث عنه Discourse بالفعل؟ هذا يعني أنه إذا وردت مشاركة من القائمة البريدية B ولكنها أشارت إلى رأس معرف الرسالة (message-id header) الذي كان موجودًا أيضًا في مشاركة من القائمة البريدية A، فسيتم تصنيفها بشكل صحيح بواسطة Discourse؟

على سبيل المثال: البريد الإلكتروني الأصلي المرسل إلى قائمتين بريديتين A و B في وقت واحد له معرف رسالة فريد “1234567890gmail”.

يتلقى Discourse نسختين تم توجيههما إلى عنوان Discourse العام الوارد. يتم حفظ الرسالة الأولى بناءً على عنوان “إلى” (To:) الخاص بالقائمة A ويتم إلحاق أحرف إضافية بمعرف الرسالة بواسطة Discourse ليصبح “1234567890gmailListA”. الرسالة الثانية لا يتم حفظها لأنها تبدو مكررة. (أعتقد أن هذا هو السلوك الحالي).

يرد شخص ما في القائمة B باستخدام عنوان “إلى” (To:) الخاص بالقائمة B. يتلقى Discourse نسخة ويكتشف أن هناك رأس “رد على” (in reply to header) يحتوي على “1234567890gmail”. يرى Discourse، نظرًا لأن البريد الإلكتروني ورد بعنوان “إلى” (To:) يعكس القائمة B، يقوم بإلحاق أحرف في النهاية لجعل رأس “رد على” (in reply to header) يبدو مثل “1234567890gmailListB”. ثم يواصل حفظها كمشاركة جديدة في الفئة الصحيحة لأنها لم تعد مرتبطة بالرسالة التي تم حفظها للقائمة A.

يمكن أن ينجح هذا النهج في نقل الأرشيفات أيضًا حيث قد يوجد نفس معرف الرسالة (message-id) في عدة قوائم بريدية إذا أرسل مستخدم الرسالة إلى عدة قوائم في نفس الوقت. عند نقطة الاستيراد، يمكن إضافة نص فريد إلى جميع حقول معرف الرسالة (message-id) و “رد على” (in reply to) مرتبط بالقائمة البريدية المسماة لمنع نوع من التداخل بين الأرشيفات عند فهرسة الرسائل.