Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2026-34828 — استمرار الجلسة في listmonk بعد إعادة تعيين كلمة المرور وتغييرها | Kitploit
أدوات/GitHubGitHub/0xmrma/cve-2026-34828
تحليل الثغرات الأمنيةالاستغلالأمن الويباختبار الاختراقالمصادقة
GitHub0xmrma/cve-2026-34828

CVE-2026-34828

استمرار الجلسة في listmonk بعد إعادة تعيين كلمة المرور وتغييرها

عرض المستودع
1منذ 4 أشهرلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

CVE-2026-34828

استمرارية جلسات listmonk بعد إعادة تعيين كلمة المرور وتغييرها

مقدمة

اكتشفت هذه المشكلة أثناء مراجعة listmonk، وهو مدير نشرات إخبارية وقوائم بريدية مفتوح المصدر، وكان في ذهني سؤال أمني بسيط:

عندما يغيّر المستخدم كلمة المرور أو يعيد تعيينها، هل يقوم التطبيق فعليًا بإنهاء الجلسات الصادرة مسبقًا؟

في هذه الحالة، كانت الإجابة لا.

ظلت الجلسات المصادق عليها الصادرة مسبقًا صالحة بعد كل من:

  • إعادة تعيين كلمة المرور
  • تغيير كلمة المرور

هذا يعني أن كوكي جلسة مسروقة يمكن أن تبقى قادرة على الصمود في وجه الأحداث الأمنية نفسها التي يعتمد عليها المستخدمون لاسترداد حساباتهم.

تم قبول المشكلة وتخصيص CVE-2026-34828 لها.

المشروع: listmonk على GitHub
CVE: CVE-2026-34828

أثرت هذه المشكلة على listmonk، وهو مشروع واسع الانتشار مع 5M+ من عمليات سحب Docker.

photo0

سلسلة الهجوم

جلسة مصادق عليها مسروقة → الضحية يعيد تعيين كلمة المرور أو يغيّرها → تبقى الجلسة القديمة صالحة → يحتفظ المهاجم بالوصول إلى الحساب بعد استرداد بيانات الاعتماد


ماذا يفعل listmonk

listmonk هو مدير قوائم بريدية ونشرات إخبارية مستضاف ذاتيًا.

يوفر:

  • مصادقة المسؤول
  • إدارة المستخدمين
  • إنشاء الحملات
  • إدارة المشتركين
  • إعدادات SMTP والإعدادات التشغيلية
  • إدارة قائمة على المتصفح

هذا يعني أن نموذج الجلسات الخاص به يشكّل حدًا أمنيًا حقيقيًا.

السؤال المهم هنا لم يكن ما إذا كان listmonk يدعم إعادة تعيين كلمة المرور.

السؤال الحقيقي كان:

هل تؤدي إعادة تعيين كلمة المرور أو تغييرها إلى إلغاء استمرارية وصول المهاجم فعليًا إذا كانت الجلسة قد سُرقت بالفعل؟

في هذه الحالة، لم يحدث ذلك.


لماذا كانت هذه الثغرة جديرة بالفحص

الكثير من المراجعات الأمنية تركّز بشكل ضيق جدًا على تجاوزات تسجيل الدخول وتصعيد الامتيازات الواضح.

وهذا يغفل فئة مهمة من نقاط الضعف:

فشل الاسترداد

إذا غيّر المستخدم كلمة المرور أو أعاد تعيينها، فمن المفترض أن يكون لهذا الإجراء معنى. من المفترض أن يقلل الثقة في بيانات الاعتماد الأقدم وحالة المصادقة القديمة.

إذا كان المهاجم يمتلك بالفعل جلسة صالحة ونجت تلك الجلسة من حدث الاسترداد، فإن الضحية لم يسترد الحساب بالكامل فعليًا.

كانت هذه هي المشكلة هنا.

لم تكن هذه ثغرة في التحقق من تسجيل الدخول. لم تكن مشكلة تشفير. لم تكن فشلًا في تجزئة كلمات المرور.

بل كانت فشلًا في دورة حياة الجلسة:

  • تغيّرت حالة كلمة المرور،
  • وحدث استرداد للحساب،
  • لكن الجلسات القديمة كانت لا تزال موثوقة.

وهذا كافٍ لإنشاء ثغرة حقيقية.


الحدود التي ركّزت عليها

لم أتعامل مع listmonk عبر مهاجمة النقاط الطرفية بشكل عشوائي وأمل أن تسقط إحداها.

المسار الأقوى كان تحديد حد الثقة الأعلى قيمة أولًا.

بالنسبة للبرمجيات المعتمدة بشدة على المصادقة، فإن أحد أفضل الحدود لاختبارها هو:

هل تلغي تغييرات الحساب الحساسة أمنيًا الجلسات الموثوقة سابقًا؟

عادةً ما يصبح هذا السؤال مثيرًا للاهتمام حول:

  • إعادة تعيين كلمة المرور
  • تغيير كلمة المرور
  • تغييرات المصادقة الثنائية
  • مسارات استرداد الحساب

في listmonk، جاءت أقوى الإشارات من الأولين.

هناك أصبحت المشكلة واضحة.


السبب الجذري

لم تكن الثغرة أن تغييرات كلمة المرور تفشل.

كانت الثغرة أن الجلسات عاشت لفترة أطول منها.

من مراجعة المصدر، مسار إعادة تعيين كلمة المرور:

  • يولّد رمز إعادة تعيين لمرة واحدة ويتحقق منه،
  • يحدّث كلمة المرور،
  • وينشئ جلسة جديدة،

لكن لم يكن هناك إلغاء مرئي للجلسات الأقدم.

ظهر النمط نفسه في مسار تغيير كلمة المرور المصادق عليه:

  • تم تحديث كلمة المرور،
  • لكن الجلسات الأقدم الصادرة مسبقًا لم يتم إبطالها.

طابق هذا السلوك النتائج الفعلية تمامًا.

مناطق الكود ذات الصلة التي راجعتها كانت:

  • cmd/auth.go لسلوك النسيان/إعادة التعيين
  • cmd/users.go لتحديثات الملف الشخصي المصادق عليها
  • internal/core/users.go لمعالجة تحديث كلمة المرور

لماذا هذا قابل للاستغلال

لأن سرقة الجلسة شرط هجوم حقيقي.

بمجرد أن يحصل المهاجم على كوكي جلسة مصادق عليها صالحة بأي وسيلة مثل:

  • اختراق المتصفح
  • البرمجيات الخبيثة
  • الوصول إلى محطة عمل مشتركة
  • XSS في مكوّن آخر
  • تسريب عبر بروكسي أو تصحيح الأخطاء
  • الكشف العرضي لكوكي

يجب أن يكون بمقدور الضحية إنهاء استمرارية وصول المهاجم عن طريق تغيير كلمة المرور أو إعادة تعيينها.

هنا، لم يستطيعوا ذلك.

كانت سلسلة الهجوم مباشرة:

  • المهاجم يمتلك كوكي جلسة صالحة
  • الضحية ينفّذ إعادة تعيين كلمة المرور أو تغييرها
  • كلمة المرور القديمة تصبح غير صالحة
  • كلمة المرور الجديدة تعمل
  • جلسة المهاجم القديمة ما تزال تصادق بنجاح

تلك هي الثغرة بأكملها.


ما الذي يجعل هذه مشكلة أمنية وليس مجرد سلوك تطبيق

التمييز المهم هو الاستمرارية بعد الاسترداد.

الكثير من التطبيقات تتعامل مع تغيير كلمة المرور كحدث على مستوى بيانات الاعتماد فقط. وهذا ليس كافيًا.

السؤال الحقيقي ليس:

«هل تغيّرت قيمة كلمة المرور في التخزين؟»

السؤال الحقيقي هو:

«هل تم إلغاء علاقة الثقة المرتبطة بالجلسات الأقدم؟»

في listmonk، لم يحدث ذلك.

هذا يحوّل ما كان يمكن أن يكون صيانة حساب عادية إلى استرداد أمني غير مكتمل.

هذا هو الفرق بين:

  • استمرارية الجلسة العادية
  • ونقطة ضعف أمنية حقيقية

إثبات المفهوم

تحققت من المشكلة في مسارين منفصلين.

الحالة 1: إعادة تعيين كلمة المرور لا تلغي الجلسات القائمة

أولًا، أنشأت مستخدم اختبار عاديًا وسجّلت الدخول، محتفظًا بكوكي الجلسة المصادق عليها.

ثم قمت بتشغيل مسار «نسيت كلمة المرور»، والتقطت رابط إعادة التعيين، وأعدت تعيين كلمة المرور.

بعد إعادة التعيين:

  • لم تعد كلمة المرور القديمة تعمل
  • عملت كلمة المرور الجديدة
  • لكن كوكي الجلسة القديمة قبل إعادة التعيين ما زالت تصادق بنجاح

كان طلب تحقق تمثيلي بالشكل التالي:

root@kitploit:~
GET /api/profile HTTP/1.1
Host: 127.0.0.1:9000
Cookie: session=<old_pre_reset_session>

وما زال الخادم يعيد:

root@kitploit:~
HTTP/1.1 200 OK
Content-Type: application/json

مع الملف الشخصي المصادق عليه.

أثبت ذلك الادعاء الأساسي:

  • اكتمل الاسترداد،
  • وتغيّرت بيانات الاعتماد،
  • لكن ثقة الجلسة القائمة ظلت سليمة.

الحالة 2: تغيير كلمة المرور لا يلغي الجلسات النشطة المتوازية

ثم تحققت من الفئة نفسها من الثغرات في مسار تغيير كلمة المرور المصادق عليه.

سجّلت الدخول مرتين بنفس المستخدم وحفظت جلستين مصادق عليهما صالحتين:

  • الجلسة A
  • الجلسة B

باستخدام الجلسة A، غيّرت كلمة المرور من خلال نقطة تحديث الملف الشخصي.

مثال على الطلب:

root@kitploit:~
PUT /api/profile HTTP/1.1
Host: 127.0.0.1:9000
Cookie: session=<session_A>
Content-Type: application/json

{
  "name":"victim1",
  "email":"[email protected]",
  "password":"VictimChanged123"
}

بعد ذلك:

  • لم تعد كلمة المرور القديمة تعمل
  • عملت كلمة المرور الجديدة
  • لكن الجلسة B ظلت صالحة

طلب متابعة باستخدام الجلسة B ما زال يعيد بيانات مصادق عليها من /api/profile.

أثبت ذلك أن المشكلة لم تقتصر على مسار النسيان/إعادة التعيين. بل أثرت أيضًا على تغييرات كلمة المرور العادية المصادق عليها.


لماذا تهم عمليتا إعادة الإنتاج

كانت إعادة إنتاج واحدة كافية لإظهار وجود مشكلة.

لكن التحقق من المسارين معًا كان مهمًا لسببين.

أولًا

أظهر أن الثغرة لم تكن معزولة في مسار استرداد واحد لحالة حافة.

نفس الخاصية الأمنية فشلت في:

  • إعادة تعيين كلمة المرور غير المصادق عليها والمدفوعة بالاسترداد
  • تغيير كلمة المرور المصادق عليه داخل الجلسة

ثانيًا

جعل من الصعب تجاهل المشكلة باعتبارها منطق أعمال عرضيًا.

كانت هذه بوضوح نقطة ضعف أوسع في إدارة الجلسات:

  • تغيّرت حالة كلمة المرور،
  • لكن الجلسات القائمة ظلت موثوقة.

أعطى ذلك المشكلة وزنًا أمنيًا أقوى بكثير.


التحقق من TOTP

اختبرت أيضًا مسار إعادة التعيين على حساب مفعّل بـ TOTP لأنني أردت معرفة ما إذا كانت إعادة تعيين كلمة المرور ستُضعف أو تتجاوز توقعات المصادقة الثنائية بصمت.

ما أكدته هو:

  • ما زالت إعادة تعيين كلمة المرور تنجح
  • ظل TOTP مفعّلًا
  • إعادة تسجيل دخول جديدة بكلمة المرور الجديدة ما زالت تعيد التوجيه إلى خطوة المصادقة الثنائية
  • لذلك لم يكن هذا تجاوزًا مباشرًا للمصادقة الثنائية

كان ذلك فحصًا مفيدًا للحدود.

ضيّق المشكلة بشكل صحيح.

لم تكن الثغرة:

  • «إعادة تعيين كلمة المرور تعطّل TOTP»
  • أو «إعادة تعيين كلمة المرور تتجاوز TOTP»

المشكلة الحقيقية بقيت:

  • الجلسات الصادرة مسبقًا ما زالت تنجو من تغييرات أمنية حساسة في الحساب

هذه نتيجة أنظف وأكثر قابلية للدفاع عنها.


الخطورة والتصنيف

صُنّفت هذه المشكلة بشكل معقول على أنها عالية الخطورة.

التأثير الرئيسي هنا هو الوصول غير المصرح به المستمر بعد إجراءات استرداد أمان الحساب.

كان تصنيف النشرة:

  • CWE-613: انتهاء صلاحية الجلسة غير كافٍ
  • CVSS: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:N

هذا منطقي.

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

تلك ثغرة حقيقية وقابلة للدفاع عنها في إدارة الجلسات.


لماذا كان الإبلاغ عن هذا ما يزال يستحق العناء

بعض الناس يقللون من شأن ثغرات استمرارية الجلسة لأنهم يفترضون أن سرقة الجلسة تعني بالفعل «انتهت اللعبة».

هذا تبسيط مفرط.

السؤال الحقيقي هو ما الذي يحدث بعد أن يلاحظ الضحية أن هناك خطأ ما ويتخذ إجراءً.

إذا:

  • أعاد الضحية تعيين كلمة المرور،
  • أو غيّرها يدويًا،
  • وما زال المهاجم يحتفظ بجلساته المسروقة،

عندها يكون استرداد الحساب غير مكتمل.

هذا ليس مجرد سلوك محرج. بل هو فشل أمني في نموذج الاسترداد.

خاصة في منصة موجهة للمسؤولين، فهذه مشكلة ذات تأثير كبير على السرية.


تحليل الإصلاح

أصلح المُطوّر المشكلة في الالتزام:

root@kitploit:~
db82035

اتجاه الإصلاح الأساسي هو بالضبط ما كانت تحتاجه هذه الثغرة:

  • إبطال الجلسات الأقدم بعد إعادة تعيين كلمة المرور
  • إبطال الجلسات الأقدم بعد تغيير كلمة المرور

هذا هو العلاج الصحيح لأنه يستهدف الخاصية الأمنية الحقيقية التي فشلت:

يجب أن تموت الثقة الأقدم عندما تتغير بيانات الاعتماد

الإصلاح الجيد لهذه الفئة من الثغرات لا يتعلق بتغيير التحقق من كلمة المرور. بل يتعلق بإلغاء حالة الجلسة النشطة سابقًا المرتبطة بالحساب. ذلك هو الجزء الذي يعيد الاسترداد الفعلي.


الإفصاح

تم الإبلاغ عن هذه المشكلة بشكل خاص عبر مسار الإبلاغ الأمني في GitHub.

قام المُطوّر:

  • بمراجعة التقرير
  • وقبوله كمشكلة أمنية
  • وإصلاح السلوك
  • وتم تخصيص المشكلة:

CVE-2026-34828

أحد الأمور التي ظهرت أثناء معالجة النشرة كان النطاق.

تضمن التقرير الأصلي كلا من:

  • استمرارية الجلسة بعد إعادة تعيين كلمة المرور
  • استمرارية الجلسة بعد تغيير كلمة المرور

تعامل GitHub في البداية مع هاتين المشكلتين على أنهما قابلتان للإصلاح بشكل مستقل لأغراض تخصيص CVE. هذا تذكير مفيد بأن نطاق النشرة مهم حتى عندما تكون نقطة الضعف الأساسية متشابهة من الناحية المفاهيمية.

كانت النتيجة النهائية CVE-2026-34828.


ما الذي تعلّمه هذه الثغرة فعليًا

الدرس الرئيسي هنا بسيط:

تغيير بيانات الاعتماد ليس كافيًا إذا كانت الثقة المصادق عليها القديمة ما تزال حية.

الكثير من المطورين يفكرون من منظور:

  • صحة كلمة المرور
  • صحة الرمز
  • نجاح تسجيل الدخول
  • صلاحية رمز إعادة التعيين

تلك الأمور مهمة.

لكن الحد الأمني الحقيقي أوسع:

عندما يحدث حدث حساب عالي الخطورة، ما هي الحالة الموثوقة سابقًا التي يجب أن تتوقف عن كونها موثوقة؟

في هذه الحالة، كان ينبغي أن يكون الجواب:

  • الجلسات القديمة

وكان listmonk لا يفعل ذلك.

هذه هي الخلاصة الحقيقية.


النقاط الرئيسية

  • إلغاء الجلسة جزء من أمان استرداد الحساب
  • لا ينبغي أن تترك إعادة تعيين كلمة المرور الجلسات الصادرة مسبقًا حية
  • لا ينبغي أن يترك تغيير كلمة المرور جلسات نشطة متوازية حية
  • تظل سرقة الجلسة ذات معنى إذا لم تلغِ أحداث الاسترداد الثقة
  • اختبار مسارات متعددة ذات صلة يجعل التقرير أقوى
  • الابتعاد عن المسارات الخاطئة مثل تجاوز المصادقة الثنائية يساعد في إبقاء النتيجة نظيفة

كلمات أخيرة

لم تكن هذه الثغرة حول حمولات برمجية متقنة أو حيل ذكية في المحللات.

بل كانت حول طرح السؤال الصحيح حول حدود الثقة.

في listmonk، تغيّرت كلمة المرور. اكتمل إجراء الاسترداد. لكن جلسة المهاجم القديمة ما زالت حية.

لهذا أصبحت هذه CVE-2026-34828.

photo0
تنزيل الأداة