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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
servu-cve-2026-28318-poc — SolarWinds Serv-U CVE-2026-28318: انهيار غير مصادق عليه لـ Content-Encoding: deflate. تحليل السبب الجذري (تحرير غير صحيح لمؤشر داخلي -> تلف الكومة) + إثبات مفهوم (PoC) يقتصر على رفض الخدمة (DoS). تم الإصلاح في 15.5.4 Hotfix 1. | Kitploit
أدوات/GitHubGitHub/eaea0001/servu-cve-2026-28318-poc
تحليل الذاكرة الجنائيتحليل الثغرات الأمنيةالاستغلالاختبار الاختراقتحليل الملفات الثنائية
GitHubeaea0001/servu-cve-2026-28318-poc

servu-cve-2026-28318-poc

SolarWinds Serv-U CVE-2026-28318: انهيار غير مصادق عليه لـ Content-Encoding: deflate. تحليل السبب الجذري (تحرير غير صحيح لمؤشر داخلي -> تلف الكومة) + إثبات مفهوم (PoC) يقتصر على رفض الخدمة (DoS). تم الإصلاح في 15.5.4 Hotfix 1.

الأكثر شعبية

عرض الكل →

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

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

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

عرض جميع الأدوات →
مشاركة
عرض المستودع
1منذ 2 أشهرلم تتم المراجعة بعد

CVE-2026-28318 — SolarWinds Serv-U "Content-Encoding: deflate" تعطل قبل المصادقة

تحليل السبب الجذري + إثبات المفهوم لتعطيل الخدمة. التقرير العام يصنف هذا على أنه تعطيل للخدمة / استهلاك غير مسيطر عليه للموارد قبل المصادقة. يُظهر التحليل الثنائي أن العيب الأساسي هو سلامة الذاكرة: استدعاء free() غير صحيح لمؤشر داخلي في مسار فك تشفير deflate الخاص بـ HTTP، مما يفسد كومة العملية (STATUS_HEAP_CORRUPTION, 0xC0000374). إنه ليس قنبلة فك ضغط، والتعطل مستقل عن حجم البيانات المفكوكة.


⚠️ إخلاء مسؤولية / نطاق

  • هذا بحث دفاعي في الثغرات الأمنية لثغرة مُصحَّحة بالفعل ومُعلَن عنها علنًا (تم إصدار الإصلاح في 2026-06-04 في Serv-U 15.5.4 Hotfix 1؛ مُدرجة في CISA KEV).
  • إثبات المفهوم هنا يُعطِّل فقط مثيل Serv-U الذي تمتلكه أو مصرَّح لك صراحةً باختباره. إنه لتعطيل الخدمة فقط — لا يتضمن أو يُظهر تنفيذ كود عن بُعد (انظر شدة الضرر).
  • استخدمه للتحقق من حالة التصحيح والكشف على أنظمتك الخاصة. لا توجهه إلى أنظمة لا تتحكم فيها. أنت مسؤول عن الامتثال للقوانين المعمول بها.

المتأثر / المُصحَّح

يؤثر فقط على مستمع HTTP/HTTPS (مسار الويب / الإدارة). بروتوكولات FTP/FTPS/SFTP ليست على هذا المسار البرمجي.


TL;DR

أي طلب HTTP يحمل Content-Encoding: deflate مع جسم deflate صالح يُعطِّل الخدمة. يقوم المعالج بفك ضغط الجسم، ثم يحرر المؤشر إلى الجسم المضغوط ويستبدله بالمخزن المؤقت المفكوك — لكن هذا المؤشر هو مؤشر داخلي في مخزن استقبال HTTP (يشير إلى الجسم، مباشرة بعد \r\n\r\n)، ليس أساس تخصيص كومة. استدعاء free() على مؤشر غير أساسي وغير محاذي يُفسد الكومة وتنتهي العملية.

نظرًا لأن الخلل يكمن في كيفية تحرير مؤشر الجسم — وليس في كمية البيانات المنتجة — حتى جسم مضغوط بحوالي 25 بايت (يفك ضغطه إلى بضعة كيلوبايتات) يُعطِّله بشكل موثوق. لا يزيد استخدام الذاكرة؛ إنها ليست "قنبلة zip/deflate".


السبب الجذري

توجد روتين فك تشفير deflate في RhinoNET.dll (مكتبة الشبكة لـ Serv-U) ويُصل إليه من مسار استقبال HTTP (ProcessReceive) بمجرد أن يضبط محلل الرأس علامة "deflate" عند رؤية Content-Encoding: deflate.

بشكل مبسط، يُستدعى الروتين كـ decode(this, &bodyPtr, &bodyLen) ويقوم بما يلي:

root@kitploit:~
1. فك ضغط bodyPtr[0..bodyLen] -> ينمو مخزن مؤقت تراكمي `acc`   (zlib قياسي، محدود، صحيح)
2. free(*bodyPtr)                <-- *bodyPtr هو مؤشر داخلي في مخزن استقبال HTTP
3. *bodyPtr = acc                // استبدال الجسم المضغوط بالمخزن المؤقت المفكوك
4. *bodyLen = total

الخطوة 2 هي الخلل. *bodyPtr ليس كتلة مخصصة بشكل مستقل: إنه يشير إلى جسم الطلب داخل مخزن استقبال HTTP الواحد، أي receive_buffer + header_length. تحرير مؤشر داخلي (وغير محاذي لـ 16 بايت) يجعل المُخَصِّص يُفسر منطقة متأثرة من قبل المهاجم كرأس كتلة كومة → تلف بيانات وصفية للكومة → 0xC0000374.

ما تم استبعاده (حتى لا تتبع الشيء الخطأ)

كلتا الفرضيتين "الواضحتين" خاطئتان، تم التحقق منهما وقت التشغيل:

  • ليس تجاوزًا في فك الضغط (inflate). المفكك هو zlib1.dll!inflate القياسي ويحترم avail_out في كل استدعاء (لوحظ عبر أكثر من 100 شريحة؛ صفر كتابات خارج الحدود).
  • ليس تجاوزًا في المخزن التراكمي. المخزن المؤقت الناتج المتنامي يُخصص كـ prev_total + produced + 1 كل جولة ويُكتب بهذا المقدار بالضبط — ضيق، لا تجاوز.

التلف هو حصرًا بسبب free() غير الصحيح في الخطوة 2.


الأدلة

تم التقاطها وقت التشغيل (Frida) ضد Serv-U 15.5.4.108 أثناء إرسال طلب Content-Encoding: deflate الذي يفك ضغط جسمه إلى "A" * 8192:

  • المؤشر المحرر هو …ce — mod 16 == 14. قواعد تخصيص الكومة محاذاة لـ 16 بايت، لذا هذا ليس قاعدة تخصيص؛ إنه مؤشر داخلي.
  • الـ 48 بايت قبل المؤشر المحرر هي ذيل رأس HTTP، تنتهي بـ \r\n\r\n:
    root@kitploit:~
    …tream\r\nContent-Length: 26\r\nConnection: close\r\n\r\n
    
  • البايتات عند المؤشر المحرر هي تيار deflate خام (ed c1 01 0d 00 …).
  • توقيع التعطل: الوحدة المُخطئة ntdll.dll، الاستثناء 0xC0000374 (STATUS_HEAP_CORRUPTION)، مع نشأة الاستدعاء من free في معالج deflate في RhinoNET.dll. آخر عملية كومة قبل التعطل هي بالضبط هذا free(bodyPtr).
  • الاستقلال عن الحجم: جسم يفك ضغطه إلى حوالي 4 كيلوبايت فقط (مضغوط ≈ بضع عشرات من البايتات) يتعطل بشكل مماثل؛ ذاكرة مجموعة العمل لا تنمو.

شدة الضرر

  • مؤكد: تعطل موثوق عن بُعد بدون مصادقة لخدمة Serv-U (DoS). قد تعيد الخدمة تشغيل نفسها تلقائيًا، لكن الطلبات المتكررة تبقها معطلة ويمكن أن تستنفد استرداد خدمة Windows.
  • ما بعد DoS — غير مثبت. "رأس الكتلة" المحرر يتداخل مع بايتات رأس HTTP التي يتحكم بها المهاجم، وهو من حيث المبدأ أداة أقوى من مجرد DoS. ومع ذلك، على Windows الحديث (Segment Heap) يفشل free غير الصحيح بسرعة (0xC0000374) في اختباراتنا، ولم نحقق تنفيذ كود. عالج هذا على أنه تعطل DoS مع تلف كومة قبل المصادقة وسبب جذري في سلامة الذاكرة؛ لا تفترض تنفيذ كود عن بُعد.

إعادة الإنتاج

يتطلب Python 3 (المكتبة القياسية فقط). وجهه إلى مستمع HTTP لـ Serv-U مخوَّل باختباره. على Windows، يستخدم استدعاء واحد Get-NetTCPConnection لقراءة PID المستمع وسجل أحداث التطبيق لتأكيد تعطل تلف الكومة.

root@kitploit:~
python poc_verify.py                       # افتراضي 127.0.0.1:80، حزمة صغيرة، مرة واحدة
python poc_verify.py --host <ip> --port 80
python poc_verify.py --big                 # الجسم يفك ضغطه إلى 8192 بايت
python poc_verify.py --shots 3
python poc_verify.py --no-events           # تخطي فحص سجل الأحداث (لا يحتاج صلاحيات)

يبني إثبات المفهوم طلبًا أدنى:

root@kitploit:~
POST / HTTP/1.1
Host: <target>
Content-Encoding: deflate
Content-Type: application/octet-stream
Content-Length: <n>
Connection: close

<جسم deflate خام — حتى بضع عشرات من البايتات كافية>

يُبلغ عن PASS إذا تعطلت الخدمة (تغير PID المستمع / ظهر حدث 0xC0000374) وFAIL إذا بقيت (تم التصحيح بالفعل، غير متأثرة، أو لم يُعالج الجسم كـ deflate).


التخفيف

  1. طبق Serv-U 15.5.4 Hotfix 1 (أو أحدث).
  2. مؤقتًا: أمام Serv-U، قم بإزالة أو رفض Content-Encoding الوارد على مستمع HTTP/HTTPS، مثلاً على وكيل عكسي:
    root@kitploit:~
    if ($http_content_encoding) { return 400; }
    
  3. قلل من التعرض الشبكي لمنفذ الويب/الإدارة لـ Serv-U.

المنهجية (كيف تم تحليل هذا)

  • ثابت: تفكيك معلمي لـ PE لـ RhinoNET.dll / Serv-U.exe (قاعدة الصورة 0x180000000) لتعيين مسار الاستقبال → تحليل الرأس → فك تشفير deflate وتحديد موقع free الخاطئ.
  • ديناميكي: توجيه Frida للخدمة الحية — ربط المفكك لإثبات أن zlib يحترم avail_out، تتبع كل alloc/free/memcpy لاستدعاء فك التشفير على القرص، ومعالج استثناء عملية لالتقاط التعليمات المُخطئة ومكدس 0xC0000374 عند لحظة التلف. ثم تم تأكيد تحرير المؤشر الداخلي بتفريغ البايتات حول المؤشر المحرر (ذيل رأس HTTP + جسم deflate خام، غير محاذٍ لـ 16 بايت).

الإزاحات المشار إليها في التحليل خاصة بالبناء 15.5.4.108 وستختلف عبر الإصدارات.


المراجع

  • SolarWinds — ملاحظات إصدار Serv-U 15.5.4 Hotfix 1
  • NVD — CVE-2026-28318
  • كتالوج CISA KEV — CVE-2026-28318

نُشر كبحث دفاعي بعد توفر التصحيح من البائع. إثبات المفهوم هو لتعطيل الخدمة فقط ومخصص للاختبار المصرح به.

تنزيل الأداة
المنتجSolarWinds Serv-U (FTP / MFT / File Server)
الإصدارات المتأثرة15.5.4 والإصدارات السابقة في هذا الفرع بدون Hotfix 1 (التحليل تم على البناء 15.5.4.108)
المُصحَّحServ-U 15.5.4 Hotfix 1 (صدر في 2026-06-04)
ناقل الهجومغير مصادق، شبكة (منفذ HTTP/HTTPS للإدارة / الويب)
التصنيف العامCWE-400 استهلاك غير مسيطر عليه للموارد · DoS · CVSS 7.5 · CISA KEV
التصنيف الفعليCWE-763 تحرير مؤشر غير صالح / CWE-590 تحرير ذاكرة غير موجودة على الكومة → تلف الكومة