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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2026-32722 — ثغرة XSS مخزنة في Bloomberg Memray عبر بيانات وصفية لسطر الأوامر غير مُهرَّبة | Kitploit
أدوات/GitHubGitHub/0xmrma/cve-2026-32722
تحليل الشفرة الثابت (SAST)تحليل الثغرات الأمنيةاستغلال تطبيقات الويباختبار الاختراقالأوراق والأبحاثالتعلم والتعليم
GitHub0xmrma/cve-2026-32722

CVE-2026-32722

ثغرة XSS مخزنة في Bloomberg Memray عبر بيانات وصفية لسطر الأوامر غير مُهرَّبة

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

الأكثر شعبية

عرض الكل →

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

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

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

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

CVE-2026-32722

ثغرة XSS مخزنة في Bloomberg Memray عبر بيانات سطر أوامر غير مُهرَّبة

مقدمة

اكتشفت هذه الثغرة أثناء مراجعتي لـ Memray، أداة بلومبيرغ لتوصيف الذاكرة في Python، مع سؤال بسيط في ذهني:

هل يمكن لبيانات وقت التشغيل التي يتحكم بها المهاجم أن تعبر إلى مخرجات التقرير المعروضة في المتصفح بطريقة غير آمنة؟

في هذه الحالة، كان الجواب نعم.

كان الخلل في مسار توليد تقارير HTML في Memray، حيث كانت بيانات سطر الأوامر تُعرض في تقرير يُفتح في المتصفح دون تهريب. حوّل هذا حقلاً تشغيلياً إلى نقطة استقبال HTML قابلة للتنفيذ، وأصبح في النهاية CVE-2026-32722.

المشروع: Memray على GitHub
النشرة الأمنية: GHSA-r5pr-887v-m2w9 /CVE-2026-32722

photo0

سلسلة الهجوم

attacker-controlled argv → metadata.command_line → HTML template sink without escaping → raw markup in generated report → browser-side JavaScript execution


ما الذي يفعله Memray

Memray هي أداة لتوصيف الذاكرة في Python.

تضيف أدوات قياس إلى عملية Python، وتسجل سلوك تخصيص الذاكرة، وتنتج تقارير تساعد المطورين على فهم:

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

بعض هذه التقارير تُصدر بصيغة HTML وتُفتح في أحد المتصفحات.

وهذا يجعل توليد التقارير حداً أمنياً حقيقياً.

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

في هذه الحالة، كان ذلك ممكناً.


لماذا استحق هذا الخلل النظر فيه

كثير من الناس يقللون من شأن أدوات المطورين.

وهذا خطأ.

بمجرد أن تقوم أداة بـ:

  • تسجيل بيانات وقت التشغيل،
  • تخزين قيم متأثرة بالمهاجم،
  • ثم عرضها لاحقاً في HTML،

فإنها تتحمل مخاطر ترميز المخرجات نفسها التي تتحملها تطبيقات الويب.

كان هذا جوهر المشكلة هنا.

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

بل كان فشلاً كلاسيكياً في حدود الثقة:

  • بيانات وصفية غير موثوقة دخلت النظام،
  • عبرت إلى نقطة استقبال HTML،
  • وعُرضت دون تهريب.

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


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

لم أتعامل مع Memray بالفازينغ العشوائي لخيارات سطر الأوامر أو بمطاردة الأعطال.

كان النهج الأقوى هو تحديد السطح الأمني الأعلى احتمالاً أولاً.

بالنسبة إلى Memray، كان ذلك توليد تقارير HTML.

لماذا؟

لأن مخرجات HTML تُدخل نقطة استقبال في المتصفح، ونقاط استقبال المتصفح تحوّل أخطاء البيانات الوصفية العادية إلى مشاكل أمنية إذا:

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

هذا بالضبط ما حدث هنا.


السبب الجذري

يمكن اختزال الخلل في سطرين.

في:

root@kitploit:~
def get_render_environment() -> jinja2.Environment:
    loader = jinja2.PackageLoader("memray.reporters")
    env = jinja2.Environment(loader=loader)

يتم إنشاء بيئة Jinja دون تهريب تلقائي (autoescape).

ثم في:

root@kitploit:~
Command line: <code>{{ metadata.command_line }}</code><br>

يُعرض metadata.command_line مباشرة داخل HTML.

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

لماذا يمكن استغلال ذلك

لأن metadata.command_line متأثر بالمهاجم.

يسجل Memray سطر الأوامر المستخدم لتشغيل البرنامج الذي يخضع للتوصيف. وهذا يعني أن القيم التي يتحكم بها المستخدم من argv تُحفظ كبيانات وصفية وتُدرج لاحقاً في التقرير.

لذا فإن سلسلة الاستغلال واضحة ومباشرة:

  • يتحكم المهاجم في محتوى سطر الأوامر
  • يخزنه Memray في metadata.command_line
  • يُخرجه القالب داخل HTML
  • لا تقوم البيئة بتهريبه تلقائياً
  • يفسره المتصفح على أنه ترميز نشِط

وهذا يحوّل البيانات الوصفية إلى محتوى قابل للتنفيذ في المتصفح.


ما الذي يجعل هذه مشكلة أمنية وليس مجرد عرض سيئ

التمييز المهم هو التنفيذ.

العديد من الأخطاء تُنتج HTML غير سليم. وهذا وحده لا يكفي.

هنا، لم يكن المحتوى الذي يتحكم به المهاجم مجرد شيء ظاهر في مصدر الصفحة. بل فسّره المتصفح على أنه HTML نشِط ونفّذه كـ JavaScript.

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

  • تلف التنسيق
  • ونقطة استقبال XSS حقيقية

لذا لم يكن السؤال:

«هل يمكن أن يظهر HTML في التقرير؟»

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

«هل يمكن أن يصبح HTML الذي يتحكم به المهاجم قابلاً للتنفيذ عند فتح التقرير؟»

وكان الجواب نعم.


PoC

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

root@kitploit:~
cat > victim.py <<'PY'
x = [b"A" * 1024 for _ in range(1000)]
print("done")
PY

python -m memray run -o poc.bin victim.py ''
python -m memray flamegraph -o poc.html poc.bin

احتوى HTML المُولَّد على ترميز خام يتحكم به المهاجم:

root@kitploit:~
Command line: <code>~/memray/src/memray/__main__.py run -o poc.bin victim.py </code><br>

أدى فتح التقرير المُولَّد أو تحديثه إلى تنفيذ JavaScript.

أثبت ذلك الادعاء الجوهري:

  • كانت القيمة غير مهربة،
  • فسرها المتصفح على أنها ترميز،
  • وكانت نقطة الاستقبال قابلة للتنفيذ.

لاحقاً، أثناء الإفصاح المنسق، بسّط مشرف المشروع أداة إعادة الإنتاج أكثر:

root@kitploit:~
python -m memray run -o poc.bin -c '# '

هذه النسخة أفضل لأنها تعزل الحد القابل للاختراق بشكل أكثر مباشرة:

  • لا ملف إضافي
  • لا منطق تطبيق إضافي
  • فقط محتوى سطر أوامر يتحكم به المهاجم يدخل إلى خط إنتاج التقرير

لماذا جرى اختيار الحمولة

كانت الحمولة بسيطة عن قصد:

root@kitploit:~

الأمر لا يتعلق بحمولات مبهرجة.

إنها مسبار تنفيذ نظيف لأن:

  • لا تتطلب بنية تحتية خارجية
  • واضحة في HTML المعروض
  • تثبت تفسير HTML فوراً
  • تثبت التنفيذ في جانب المتصفح دون الاعتماد على محتوى بعيد

بالنسبة إلى هذه الفئة من الأخطاء، هذا كافٍ.


التحقق من النطاق

كان سيكفي نوع تقرير واحد لتبرير الإبلاغ عن المشكلة.

لكنني أردت معرفة ما إذا كان هذا الخلل معزولاً أم بنيوياً.

أكدت السلوك نفسه في:

  • تقارير flamegraph
  • التقارير الجدولية
  • تقارير flamegraph المُولَّدة باستخدام --no-web

كان ذلك مهماً لسببين.

أولاً

أظهر أن نقطة الاستقبال القابلة للاختراق أُعيد استخدامها عبر مخرجات HTML متعددة.

ثانياً

أثبت أن الخلل لا يعتمد على موارد خارجية مستضافة عبر CDN.

ما زال --no-web يعيد إنتاج المشكلة، مما يعني أن المشكلة كانت في HTML المُولَّد ومعالجة القوالب داخل Memray نفسه، وليس في سلوك JS البعيد. وهذا جعل الحالة أقوى بكثير.


لماذا صُنّفت هذه الثغرة على أنها منخفضة الخطورة

كان الشاغل الرئيسي لمشرف المشروع هو التحكم العملي للمهاجم.

وهذا عادل.

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

شرط الاستغلال أضيق:

  • يؤثر المهاجم على إدخال سطر الأوامر
  • يفتح ضحية لاحقاً التقرير المُولَّد في المتصفح

لذا كان التصنيف الواقعي هو خطورة منخفضة.

وهذا لا يجعله خللاً ضعيفاً.

الخطورة تتعلق بشروط الاستغلال والتأثير المحتمل. أما الصحة فتتعلق بما إذا كانت المشكلة حقيقية.

كانت هذه المشكلة حقيقية بوضوح:

  • مصدر يتحكم به المهاجم
  • نقطة استقبال HTML
  • تهريب مفقود
  • تنفيذ JavaScript فعلي
  • إصلاح حتمي

ولهذا السبب حصلت على CVE في النهاية.


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

كان الإصلاح في حده الأدنى وصحيحاً.

غيّر مشرف المشروع:

root@kitploit:~
{{ metadata.command_line }}

إلى:

root@kitploit:~
{{ metadata.command_line|e }}

هذا هو الإصلاح الصحيح لأنه يعالج نقطة الاستقبال القابلة للاختراق مباشرة.

بدلاً من إخراج ترميز خام مثل:

root@kitploit:~

يُخرج القالب الآن نصاً مهرباً:

root@kitploit:~
&lt;img src=x onerror=alert(1)&gt;

يحافظ هذا على القيمة المعلوماتية لحقل سطر الأوامر مع إزالة مسار التنفيذ في المتصفح.

كما راجع مشرف المشروع بقية سياق القالب وخلص إلى أن:

  • عدة حقول كانت رقمية
  • بعض السلاسل النصية كانت خاضعة بالكامل لتحكم Memray
  • القيم المرتبطة بالسكربت كانت تُعرض باستخدام |tojson

لذا حُصرت المشكلة بشكل صحيح في metadata.command_line.

هذا بالضبط نوع مراجعة الإصلاح الذي تريده في إفصاح حقيقي.


الإفصاح

تم الإبلاغ عن هذه الثغرة بشكل خاص عبر GitHub Security Advisories.

مشرفو المشروع:

  • تحققوا من صحة المشكلة
  • وافقوا على أن الخلل يقع على عاتقهم لإصلاحه
  • بسّطوا أداة إعادة الإنتاج
  • صحّحوا نقطة الاستقبال القابلة للاختراق
  • أصدروا الإصلاح في 1.19.2
  • طلبوا CVE
  • نشروا النشرة الأمنية

تم تخصيص المعرف التالي للمشكلة: CVE-2026-32722


ما الذي يعلّمه هذا الخلل فعلاً

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

البيانات الوصفية ليست موثوقة تلقائياً لمجرد أنها تبدو تشغيلية.

  • سطر الأوامر يبدو غير ضار.
  • نافذة التقرير تبدو غير ضارة.
  • ملف HTML محلي يبدو غير ضار.

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

في اللحظة التي يُصدر فيها أي أداة HTML، يجب التعامل معها كتطبيق ينتج HTML.

هذا هو الاستنتاج الحقيقي.


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

  • مولّدات تقارير HTML هي أسطح أمنية
  • أدوات المطورين ما زالت بحاجة إلى انضباط في ترميز المخرجات
  • نواتج التقارير المحلية يمكن أن تحتوي على نقاط استقبال XSS حقيقية
  • غياب التهريب في القوالب كافٍ عندما تصل البيانات الوصفية التي يتحكم بها المهاجم إلى نقطة الاستقبال
  • الخطورة المنخفضة لا تعني جودة منخفضة
  • العقلية الصحيحة هنا كانت تحليل حدود الثقة، وليس الفازينغ الأعمى

الكلمات الأخيرة

لم تكن هذه الثغرة حول حمولة ذكية.

كانت حول تحديد الحد الصحيح.

أخذ Memray بيانات وصفية لسطر الأوامر متأثرة بالمهاجم وعرضها في HTML مُولَّد دون تهريبها. وقام المتصفح بالباقي.

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

أُصلحت في Memray 1.19.2.

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