Skip to content
KitploitKITPLOIT
أدواتعمليات الاستغلالالمدونة
Log in
إرسال
أدواتعمليات الاستغلالالمدونة
إرسال

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
NanoMQ-Memory-Leak-Research — إعلان أمني عام وتحليل فني لثغرة CVE-2026-36590، وهي ثغرة حجب الخدمة في NanoMQ v0.24.9. | Kitploit
أدوات/GitHubGitHub/moxie25/nanomq-memory-leak-research
التحليل الثابتالتحليل الديناميكي (عزل)أمان إنترنت الأشياءتحليل الذاكرة الجنائيتحليل الثغرات الأمنيةالاستغلالاختبار الاختراق
GitHubmoxie25/nanomq-memory-leak-research

الأكثر شعبية

عرض الكل →

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

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

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

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

NanoMQ-Memory-Leak-Research

إعلان أمني عام وتحليل فني لثغرة CVE-2026-36590، وهي ثغرة حجب الخدمة في NanoMQ v0.24.9.

عرض المستودع
11منذ 3 أشهرلم تتم المراجعة بعد
مشاركة

CVE-2026-36590: حرمان من الخدمة في EMQ NanoMQ v0.24.9

يحتوي هذا المستودع على الإشعار الأمني العام والتحليل الفني للثغرة CVE-2026-36590، وهي ثغرة حرمان من الخدمة تؤثر على EMQ NanoMQ v0.24.9.

ملاحظة المراجعة

هذا المستودع عام لتوفير مرجع فني يسهل الوصول إليه لمراجعة CVE. سيتم تحديد التصنيف النهائي لـ CVE-2026-36590 من قِبل فريق CVE أو الـ CNA المعني.

فريق NanoMQ اعترض على هذا الأمر ويعتبره مرتبطًا بالإعدادات. يركز هذا المستودع على الأدلة الفنية، بما في ذلك مواد إعادة الإنتاج، ونتائج ASAN، وسجلات وقت التشغيل، وتحليل الكود المصدري.

معلومات الإشعار

  • معرّف CVE: CVE-2026-36590
  • البائع/المشروع: EMQ / NanoMQ
  • المنتج: NanoMQ
  • الإصدار المتأثر: v0.24.9
  • نوع الثغرة: حرمان من الخدمة / استنزاف الموارد
  • المكوّن المتأثر: /nanomq/nng/src/supplemental/mqtt/mqtt_qos_db_api.c / nni_qos_db_set
  • CWE: CWE-772, CWE-400
  • تاريخ الكشف العام: 2026-06-17

الملخص

عند بناء NanoMQ v0.24.9 بدون دعم SQLite بينما يتم ضبط sqlite.enable على true، قد يظل مؤشر قاعدة بيانات QoS NULL. أثناء معالجة رسائل MQTT QoS، قد يُرجع nni_qos_db_set مبكرًا دون تحرير مرجع رسالة مستنسخة. قد تتسبب رسائل MQTT PUBLISH المتكررة ذات QoS > 0 في استهلاك مستمر للذاكرة، مما يؤدي في النهاية إلى حرمان من الخدمة.

لماذا لا يزال هذا الأمر يتطلب مراجعة

تعتمد المشكلة على إعداد وقت تشغيل غير افتراضي، لكن الحقائق التالية تُظهر سبب استمرار حاجتها إلى مزيد من المراجعة:

  1. يقبل NanoMQ إعداد وقت التشغيل ويواصل العمل، بدلًا من الإبلاغ عن عدم توفر دعم SQLite في البناء الحالي.

  2. يمكن أن يحدث هذا التناقض في الإعدادات عمليًا. قد يقوم المستخدم ببناء NanoMQ بأمر البناء العادي، لكنه لاحقًا ينسخ أو يفعل قسم استمرارية SQLite من ملف إعدادات مثال.

  3. مسار الكود المتأثر لا يتحقق بشكل كامل من هذه الحالة غير المتسقة. عندما يعامل إعداد وقت التشغيل SQLite كمفعّل بينما يكون مؤشر قاعدة البيانات NULL، يُرجع nni_qos_db_set() مبكرًا دون تحرير كائن الرسالة المُمرَّر.

  4. بعد قبول هذا الإعداد، يمكن تشغيل المشكلة عبر حركة مرور MQTT عن بُعد. يمكن لرسائل PUBLISH المتكررة ذات QoS > 0 الدخول إلى المسار المتأثر والتسبب في تسربات ذاكرة متراكمة.

  5. أظهرت اختبارات ASAN مع 1 و50 و500 دورة إعادة إنتاج أن البايتات والتخصيصات المتسربة تزداد مع عدد محاولات التشغيل. يشير هذا إلى أن المشكلة تعتمد على عدد المدخلات، وليست تسربًا صغيرًا لمرة واحدة.

التخفيف

يجب على المستخدمين تقييد الوصول إلى مثيلات NanoMQ، وتجنب تعريض خدمات MQTT لعملاء غير موثوقين، وتجنب تفعيل استمرارية SQLite في البنيات التي لا تدعم SQLite. يجب على البائع إضافة تحقق عند بدء التشغيل لإعداد SQLite وتحرير مرجع الرسالة في فرع db == NULL داخل nni_qos_db_set.

NanoMQ-Memory-Leak-Research

المرفقات

  1. Analysis_Report.md: التحليل الكامل والمفصّل، بما في ذلك مخططات دورة الحياة وسجلات تتبع مفصّلة.
  2. 249exploit_leak.py: سكربت PoC بلغة بايثون لإعادة إنتاج التسرب.
  3. nanomq.conf: ملف الإعدادات المستخدم لتشغيل التناقض.
  4. runtime_logs.log: سجلات القياس التي توضح شذوذ عدد المراجع.
  5. Docker/: بيئة إعادة إنتاج حاوية تُستخدم لتشغيل الثغرة والتحقق منها بشكل موثوق في ظل ظروف محكومة.
    تعليمات البناء المفصّلة وخطوات إعداد البيئة متوفرة في:
    Docker/Docker_Reproduction_Guide.md
  6. 249asan_log.txt: سجل وقت تشغيل AddressSanitizer (ASAN) الملتقط من NanoMQ v0.24.9، ويوضح تسرب الذاكرة وسلوك الذاكرة غير الطبيعي المرتبط به.

ملخص التحليل الفني

الملخص يحتوي هذا المستودع على إثبات المفهوم (PoC) والتحليل المفصّل لثغرة تسرب ذاكرة تم اكتشافها في NanoMQ. تسمح المشكلة للمهاجمين عن بُعد بالتسبب في حرمان من الخدمة (DoS) عبر استنزاف ذاكرة النظام باستخدام رسائل MQTT ذات QoS محددة.

لقد أجريت تحليلًا متعمقًا لظاهرة تسرب الذاكرة في Nanomq. من خلال القياس الديناميكي ومراجعة الكود، حددت مسار تسرب موارد حرجًا يُفعَّل عندما يفعّل إعداد وقت التشغيل SQLite (sqlite.enable=true) بينما يُبنى الملف الثنائي دون دعم SQLite (NNG_SUPP_SQLITE غير معرّف).

لإبقاء هذا الأمر موجزًا، قمت بتلخيص النتائج الرئيسية أدناه. للحصول على التحليل الفني الكامل (بما في ذلك تتبعات ASAN التفصيلية، ومخططات دورة الحياة، وسجلات القياس)، يُرجى الرجوع إلى المرفق Analysis_Report.md.


عملية التحليل

1. الاكتشاف الأولي (تحليل ASAN)

باستخدام AddressSanitizer، حددت مصدر الذاكرة المتسربة إلى nni_msg_alloc داخل tcptran_pipe_recv_cb (nng/src/sp/transport/mqtt/broker_tcp.c). تم تخصيص الذاكرة ولكن لم يتم تحريرها بالكامل أبدًا.

2. نمذجة دورة الحياة (خط الأساس "3 استنساخات مقابل 3 تحريرات")

حللت آلية عد المراجع الخاصة بـ nni_msg. يجب أن تشمل دورة حياة رسالة QoS 1 العادية ما يلي:

  • تخصيص (+1): استقبال الشبكة.
  • استنساخ 1 (+1): إرسال طبقة التطبيق.
  • استنساخ 2 (+1): منطق الاستمرارية/إعادة الإرسال.
  • إجمالي المراجع: 3 -> التحريرات المطلوبة: 3.

3. التتبع الديناميكي والتحقق

نظرًا لأن GDB لم يكن عمليًا في هذا السيناريو عالي التزامن، استخدمت القياس الديناميكي لتتبع دورة حياة كائنات ذاكرة محددة (مثل 0x60e00002ffa0). الاكتشاف: أكدت السجلات عدم تطابق في دورة الحياة:

  • التخصيصات الفعلية: 3 (تخصيص + استنساخ 1 + استنساخ 2)
  • التحريرات الفعلية: 2 (تحرير 1 + تحرير 2)
  • النتيجة: بقي عدد المراجع عند 1، مما تسبب في التسرب. التحرير المفقود يقابل الاستنساخ 2 الناتج في nmq_pipe_send_start_v4.

4. تحديد السبب الجذري

كشف تتبع تدفق التنفيذ عن سبب فقدان التحرير الثالث:

  1. عدم التطابق: تم بناء الملف الثنائي دون -DNNG_SUPP_SQLITE، مما أدى إلى إزالة منطق التهيئة في nano_sock_setdb. ومع ذلك، كان nanomq.conf يحتوي على sqlite.enable = true. تسبب هذا في بقاء مؤشر db على NULL.
  2. المنطق المعيب ("الإرجاع المبكر"): عندما تدخل الرسالة (المرجع = 3) إلى nni_qos_db_set للتخزين، يتحقق الدالة من المؤشر الفارغ:
// File: /nanomq/nng/src/supplemental/mqtt/mqtt_qos_db_api.c
void nni_qos_db_set(..., void *db, ..., nng_msg *msg) {
    if (db == NULL) {
        // CRITICAL FLAW:
        // Early return triggers because db is NULL.
        // The function holds ownership of 'msg' (Ref++) but fails to release it.
        return; 
    }
    // ...
}

تُرجع الدالة بصمت دون استدعاء nni_msg_free(msg). يؤدي هذا إلى فقدان مؤشر الرسالة بشكل لا يمكن استرجاعه، ما يُيتم كتلة الذاكرة فعليًا.


الخلاصة والأثر

  • السبب الجذري: نقص في البرمجة الدفاعية داخل nni_qos_db_set. فهي لا تتعامل مع ملكية مؤشر msg عند تنفيذ إرجاع مبكر بسبب حالة قاعدة بيانات غير صالحة.
  • الأثر: يؤدي هذا إلى حرمان صامت من الخدمة. رسائل QoS > 0 المستمرة — سواء من حركة مرور عملاء عادية أو من جهة خبيثة — سوف تستنزف ذاكرة النظام تدريجيًا (OOM)، مما يؤدي في النهاية إلى تعطّل الوسيط (broker).

التوصيات:

  1. الفشل السريع (فحص بدء التشغيل): أضف منطق تحقق خلال مرحلة بدء تشغيل النظام (nano_sock_setdb أو الدالة main) للتأكد من أن SQLite يعمل بشكل صحيح. إذا تم اكتشاف conf->sqlite.enable == true بينما ماكرو NNG_SUPP_SQLITE غير معرّف أو أن SQLite غير طبيعي، فيجب أن يخرج النظام مع رسالة خطأ أو يضبط enable قسريًا على false ويطبع تحذيرًا.
  2. سلامة الموارد (فشل آمن): أضف منطق تحرير الموارد في فرع الإرجاع المبكر للدالة nni_qos_db_set. إذا كان db == NULL، يجب استدعاء nni_msg_free(msg) لموازنة عدد المراجع ومنع تسرب الذاكرة.
تنزيل الأداة