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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
vbox-hgcm-ssm-cparms — VirtualBox 7.2.20 - عالية - محلية - تجاوز سعة الكومة - HGCM SSM cParms wrap | Kitploit
أدوات/GitHubGitHub/abraxas/vbox-hgcm-ssm-cparms
تحليل الذاكرة الجنائيتحليل الثغرات الأمنيةالاستغلالالمحاكاة الافتراضية للأمانالأوراق والأبحاثاستغلال الملفات الثنائيةمختبرات وتدريب عملي
GitHubabraxas/vbox-hgcm-ssm-cparms

vbox-hgcm-ssm-cparms

VirtualBox 7.2.20 - عالية - محلية - تجاوز سعة الكومة - HGCM SSM cParms wrap

عرض المستودع
3منذ 2 أياملم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

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

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

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

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

Abraxas Labs - vbox-hgcm-ssm-cparms

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  vbox-hgcm-ssm-cparms

vbox-hgcm-ssm-cparms

الفئة: تجاوز سعة الكومة (Heap overflow) الوصول: محلي (المضيف)

Oracle VM VirtualBox OSS 7.2.20 (f2792cf44) - Oracle

لا يزال HGCM المباشر يرفض cParms > 32. أما تحميل الحالة المحفوظة فلا يرفضه. يقرأ vmmdevR3HgcmLoadState قيمة cParms من ملف .sav دون حدّ VMMDEV_MAX_HGCM_PARMS، ثم يحدّد حجم الأمر باستخدام uint32_t cbCmd. عند cParms = 0x4000000 يلتفّ حاصل الضرب ليصبح sizeof(VBOXHGCMCMD) (~120). وأول عملية تخزين لـ enmType هي بالفعل كتابة بمقدار 4 بايت خارج حدود الكتلة.

مستخدم مضيف يستعيد حالة محفوظة خبيثة يُحدث تجاوزًا في كومة عملية الجهاز الافتراضي. ولا يستطيع الضيف زرع ذلك عبر Save.

المعرّفلا يوجد CVE بعد
الفئةتجاوز سعة الكومة (كتابة خارج الحدود في عملية الجهاز الافتراضي؛ وليس هروبًا إلى نواة المضيف)
الوصولمحلي (المضيف) (UI:R استعادة الحالة المحفوظة / اللقطة)
CWECWE-190، CWE-787
CVSSمرتفع: 7.8 CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
المنتجVirtualBox OSS
المتأثر7.2.20 (f2792cf44f663989818507e36d3db5f978523c5e)
المصادقةمستخدم المضيف يستعيد جهازًا افتراضيًا محفوظًا أو لقطة أو ملف .sav
الترخيصGNU Affero GPL v3.0
المختبر127.0.0.1 فقط. أداة اختبار من المصدر. دون إقلاع VirtualBox، ودون تحليل .sav.

ما يمكن للمهاجم فعله

تسليم المشغّل مجلد جهاز افتراضي تحمل حالته المحفوظة استدعاء VMMDev HGCM CALL معلّقًا. فينقر على Start لجهاز افتراضي محفوظ، أو يستعيد لقطة، أو يتبنّى ملف .sav. تمرّ استعادة وحدة التحكم عبر SSMR3 إلى vmmdevR3LoadExec ثم إلى vmmdevR3HgcmLoadState. هذا هو UI:R. والمتبقّي هو المحلّل، وليس استدعاءً فائقًا من الضيف.

VMMDev مفعّل افتراضيًا. لا 3D. لا Guest Additions. لا VRDP. وليس PUEL.

الطريقة ونقطة التأثير

الخطوةالمكانما تمنحه
الاستعادةواجهة المضيف / VBoxManage startvm على جهاز افتراضي محفوظيفتح مستخدم المضيف ملف .sav الخبيث. هذه هي النقرة الوحيدة المطلوبة.
وحدة SSMVMMDev vmmdevR3HgcmLoadState (VMMDevHGCM.cpp:2043-2091)SSMGetU32 في cParms دون حدّ VMMDEV_MAX_HGCM_PARMS (32).
التفاف التخصيصvmmdevR3HgcmCmdAlloc (VMMDevHGCM.cpp:376-381)uint32_t cbCmd = sizeof(VBOXHGCMCMD) + cParms * (40+24). عند cParms = 0x4000000 يلتفّ إلى ~120. وينجح RTMemAllocZ بهذا الحجم ضمن ميزانية الكومة.
أول تخزينحلقة التحميل paGuestParms[i].enmType (VMMDevHGCM.cpp:2085-2091)paGuestParms هو pCmd + sizeof(VBOXHGCMCMD)، وهو بالفعل نهاية التخصيص بعد الالتفاف. وأول dword للنوع هو كتابة خارج الحدود بمقدار 4 بايت. ولا يحتاج التدفّق إلا إلى ترويسة CALL مع نوع معامل واحد. ولا يحتاج إلى 67 مليون سجل.

الصلاحيات

النوعالمصدرما يحصل عليه المهاجم
استطلاعلا شيءبايتات الفائض يختارها sav. هذا ليس تسريبًا. لا تُعاد محتويات الكومة إلى الملف.
السلامةمُثبت مختبريًاcParms=0x4000000 يلفّ uint32_t cbCmd إلى 120. مخزن enmType واحد بـ i=0 يحطّم كاناري بقيمة 0xA5. canary0=56424f58 هو بادئة VBOX الخاصة بـ VBOX-HGCM-SSM-CPARMS-WITNESS. التحكم cParms=2 يترك الكاناري سليمًا.
السلامةمُستنتجسجلات parm إضافية يتحكم بها sav (نوع dword مع حقول 32/64-بت أو حقول وصف مؤشر) تكتب خطيًا خارج RTMemAllocZ البالغ ~120 بايت في VirtualBoxVM / VBoxHeadless. هذا بدائي كتابة في عملية الآلة الافتراضية، من نفس فئة memcorr في ترحيل QEMU. لا تُظهر هذه الحزمة التحكم في مؤشر التعليمات.
التوافرمُستنتجانهيار VBoxVM إذا لم يُحوَّل التحطيم إلى كتابة مُتحكَّم بها. أداة الاختبار هي تحطيم كاناري، وليست انهيار عملية VirtualBox.

ما لا يمنحه هذا المخلّف

  • ليس من الضيف إلى المضيف. لا يزال vmmdevR3HgcmCallAlloc الحي يرفض cParms > 32 (VMMDevHGCM.cpp:921-926). لا يستطيع الضيف زرع اللفّ عبر Save شرعي.
  • نواة المضيف. الآلات الافتراضية الأخرى. VBoxSVC.
  • ملفات المضيف. Windows restricted-token / AppContainer. Project Zero IDispatch 544666386 عام وليس هذا المخلّف.
  • لفّ حجم وسائط HGCM الحي (مصبوب CVE-2013-5892 الحي). هذا المدخل مغلق على هذا التثبيت (VMMDEV_MAX_HGCM_PARMS 32، VMMDEV_MAX_HGCM_DATA_SIZE 128MiB).
  • offValue / cbValue الشقيقان في memcpy عند الإكمال هو كتابة ثانية في كومة المضيف فقط إذا استعاد عملاء HGCM في نفس sav. ليس هذا المختبر.

لا يزال host-user / host-kernel الكامل بحاجة إلى مخلّف تقوية. الجمع بين هذا التحطيم وتجاوز IDispatch العام مستبعد.

كيف وجدته

ثبّتُّ VirtualBox/virtualbox عند الوسم v7.2.20 peel f2792cf44. كان HGCM الحي أول ما قرأته لأن CVE-2013-5892 كان من هذه الفئة: لفّ حجم الوسائط إلى VBOXHGCMCMD. لا يزال المسار الحي يحمل الحد الأقصى:

ASSERT_GUEST_STMT_RETURN(   cParms <= (cbHGCMCall - sizeof(VMMDevHGCMCall)) / cbHGCMParmStruct
                         && cParms <= VMMDEV_MAX_HGCM_PARMS,
                         LogRelMax(50, ("VMMDev: request packet with invalid number of HGCM parameters: ...")),
                         VERR_INVALID_PARAMETER);

لا يقوم Load بذلك. تأخذ vmmdevR3HgcmLoadState قيمة cParms من sav وتستدعي نفس المخصص:

const uint32_t cbCmd = sizeof(VBOXHGCMCMD) + cParms * (sizeof(VBOXHGCMGUESTPARM) + sizeof(VBOXHGCMSVCPARM))
                     + (enmCmdType == VBOXHGCMCMDTYPE_CONNECT ? sizeof(HGCMServiceLocation) : 0);

AssertCompile في تعليقات هذا التثبيت تضع CMD عند 120، وguestparm عند 40، وsvcparm عند 24. cParms = 0x4000000 يجعل الناتج 64-بت 0x100000000 + 120. التخزين إلى uint32_t يحتفظ بـ 120. ثم:

for (i = 0; i < cParms; ++i)
{
    VBOXHGCMGUESTPARM * const pGuestParm = &pCmd->u.call.paGuestParms[i];
    rc = pHlp->pfnSSMGetU32(pSSM, &u32);
    pGuestParm->enmType = (HGCMFunctionParameterType)u32;

paGuestParms يقع عند pCmd + sizeof(VBOXHGCMCMD). بعد الالتفاف يكون ذلك نهاية التخصيص. أول عملية تخزين تكون بالفعل خارج الحدود.

المسارات الخاطئة المسجّلة مسبقًا: التعامل مع HGCM الحيّ على أنه المتبقي (فهو لا يزال محدودًا عند 32)؛ اجتياز 67 مليون عملية تخزين في الـ harness (أول dword هو الدليل)؛ الادعاء بأن ضيفًا يمكنه زرع هذا عبر Save؛ تضخيم تحطيم كومة عملية VM إلى هروب إلى نواة المضيف؛ تسلسل IDispatch العام.

المسرح: reverse shell، ومحلّل .sav، وإقلاع VirtualBox. الـ oracle هو الالتفاف بالإضافة إلى تحطيم canary الخاص بـ VBOX-HGCM-SSM-CPARMS-WITNESS.

المختبر

cd lab
./run.sh

أو من جذر الحزمة:

python3 vbox-hgcm-ssm-cparms-Abraxas-Labs.py

مُحرِّض المصدر على loopback 127.0.0.1:19210. مشروع Compose vbox-hgcm-ssm-cparms. ينسخ gadget.c أحجام pin، وصيغة uint32_t cbCmd، والحد الأقصى الحي 32، ومخزن enmType واحد في مسار التحميل. لا يُقلع VirtualBox ولا يُحلِّل ملف .sav. اربطه بـ loopback.

SUCCESS vbox-hgcm-ssm-cparms wrap=yes oob=yes live-cap=32 canary-smashed=yes VBOX-HGCM-SSM-CPARMS-WITNESS

الإصلاح

حدّد سقف cParms في SSM عند VMMDEV_MAX_HGCM_PARMS في vmmdevR3HgcmLoadState (ومسار cLinAddrs لما قبل الإصدار 17) بالطريقة نفسها التي يفعلها vmmdevR3HgcmCallAlloc بالفعل. اجعل حجم cbCmd من نوع uint64_t / size_t وارفض أي التفاف. العدد الصحيح القادم من حالة محفوظة ليس أكثر موثوقية من عدد صحيح قادم من ضيف حيّ.

المراجع

تنزيل الأداة