
VirtualBox 7.2.20 - उच्च - स्थानीय - हीप ओवरफ़्लो - HGCM SSM cParms रैप
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vbox-hgcm-ssm-cparms
वर्ग: हीप ओवरफ़्लो पहुँच: स्थानीय (होस्ट)
Oracle VM VirtualBox OSS 7.2.20 (f2792cf44) - Oracle
लाइव HGCM अभी भी cParms > 32 को अस्वीकार करता है। सेव्ड-स्टेट लोड नहीं करता। vmmdevR3HgcmLoadState बिना किसी VMMDEV_MAX_HGCM_PARMS सीमा के .sav से cParms पढ़ता है, फिर uint32_t cbCmd से कमांड का आकार निर्धारित करता है। cParms = 0x4000000 पर वह गुणनफल sizeof(VBOXHGCMCMD) (~120) पर रैप हो जाता है। पहला enmType स्टोर पहले से ही ब्लॉक से परे 4-बाइट लेखन है।
एक होस्ट उपयोगकर्ता जो शत्रुतापूर्ण सेव्ड स्टेट को पुनर्स्थापित करता है, VM-प्रोसेस हीप को ओवरफ़्लो कर देता है। कोई गेस्ट इसे Save के माध्यम से नहीं रोपित कर सकता।
| ID | अभी तक कोई CVE नहीं |
| वर्ग | हीप ओवरफ़्लो (VM-प्रोसेस OOB लेखन; होस्ट-कर्नेल एस्केप नहीं) |
| पहुँच | स्थानीय (होस्ट) (UI:R सेव्ड-स्टेट / स्नैपशॉट पुनर्स्थापन) |
| CWE | CWE-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) |
| प्रमाणीकरण | होस्ट उपयोगकर्ता एक सेव्ड VM, स्नैपशॉट, या .sav को पुनर्स्थापित करता है |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | केवल 127.0.0.1। सोर्स हार्नेस। कोई VirtualBox बूट नहीं, कोई .sav पार्स नहीं। |
ऑपरेटर को एक VM फ़ोल्डर सौंपें जिसकी सेव्ड स्टेट में एक लंबित VMMDev HGCM CALL है। वे सेव्ड VM पर Start क्लिक करते हैं, स्नैपशॉट पुनर्स्थापित करते हैं, या .sav को अपनाते हैं। कंसोल पुनर्स्थापन SSMR3 से होकर vmmdevR3LoadExec में और फिर vmmdevR3HgcmLoadState में जाता है। यह UI:R है। शेष बचा हुआ पार्सर है, गेस्ट हाइपरकॉल नहीं।
VMMDev डिफ़ॉल्ट रूप से चालू है। कोई 3D नहीं। कोई Guest Additions नहीं। कोई VRDP नहीं। PUEL नहीं।
| चरण | कहाँ | यह क्या प्रदान करता है |
|---|---|---|
| पुनर्स्थापन | होस्ट UI / सेव्ड VM पर VBoxManage startvm | होस्ट उपयोगकर्ता शत्रुतापूर्ण .sav खोलता है। यही एकमात्र आवश्यक क्लिक है। |
| SSM यूनिट | VMMDev 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-बाइट OOB लेखन है। स्ट्रीम को केवल CALL हेडर और एक पैरामीटर टाइप की आवश्यकता होती है। इसे 67 मिलियन रिकॉर्ड की आवश्यकता नहीं है। |
| प्रकार | उद्गम | हमलावर को क्या मिलता है |
|---|---|---|
| रेकॉन | कोई नहीं | ओवरफ़्लो बाइट्स sav-चयनित होते हैं। यह लीक नहीं है। हीप की सामग्री फ़ाइल को वापस नहीं लौटाई जाती। |
| अखंडता | lab-proven | cParms=0x4000000 uint32_t cbCmd को 120 तक रैप कर देता है। एक i=0 enmType स्टोर एक 0xA5 कैनरी को तोड़ देता है। canary0=56424f58 VBOX-HGCM-SSM-CPARMS-WITNESS का VBOX प्रीफ़िक्स है। नियंत्रण cParms=2 कैनरी को अक्षुण्ण छोड़ता है। |
| अखंडता | अनुमानित | आगे के sav-नियंत्रित parm रिकॉर्ड (प्रकार dword के साथ-साथ 32/64-बिट या pointer-desc फ़ील्ड) VirtualBoxVM / VBoxHeadless में ~120-बाइट RTMemAllocZ से रैखिक रूप से लिखते हैं। यह VM प्रक्रिया में एक राइट प्रिमिटिव है, QEMU migration memcorr के समान श्रेणी का। यह पैक इंस्ट्रक्शन-पॉइंटर नियंत्रण प्रदर्शित नहीं करता। |
| उपलब्धता | अनुमानित | यदि तोड़फोड़ को नियंत्रित राइट में नहीं बदला जाता तो VBoxVM क्रैश हो जाता है। हार्नेस एक कैनरी स्मैश है, VirtualBox प्रक्रिया क्रैश नहीं। |
vmmdevR3HgcmCallAlloc अभी भी cParms > 32 को अस्वीकार करता है (VMMDevHGCM.cpp:921-926)। कोई गेस्ट वैध Save के माध्यम से रैप को रोप नहीं सकता।VMMDEV_MAX_HGCM_PARMS 32, VMMDEV_MAX_HGCM_DATA_SIZE 128MiB)।offValue / cbValue memcpy एक दूसरा होस्ट-हीप राइट है केवल तब जब HGCM क्लाइंट उसी sav में रिस्टोर करें। यह इस लैब का हिस्सा नहीं है।पूर्ण होस्ट-यूज़र / होस्ट-कर्नेल के लिए अभी भी एक हार्डनिंग अवशेष की आवश्यकता है। इस स्मैश को सार्वजनिक IDispatch बायपास के साथ जोड़ना खारिज कर दिया गया है।
मैंने VirtualBox/virtualbox टैग v7.2.20 पील 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);
लोड नहीं करता। vmmdevR3HgcmLoadState sav से cParms लेता है और उसी allocator को कॉल करता है:
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) पर स्थित है। रैप के बाद वह alloc का अंत है। पहला स्टोर पहले से ही OOB है।
पहले से दर्ज गलत रास्ते: लाइव HGCM को अवशेष मानना (यह अभी भी 32 पर सीमित है); harness में 67 मिलियन स्टोर्स पर चलना (पहला dword ही प्रमाण है); यह दावा करना कि कोई guest इसे Save के माध्यम से लगा सकता है; VM-प्रोसेस heap smash को host-kernel escape तक बढ़ाना; सार्वजनिक IDispatch को चेन करना।
नाटक: एक reverse shell, एक .sav parser, VirtualBox को बूट करना। oracle रैप के साथ-साथ VBOX-HGCM-SSM-CPARMS-WITNESS का canary smash है।
cd lab
./run.sh
या पैक रूट से:
python3 vbox-hgcm-ssm-cparms-Abraxas-Labs.py
लूपबैक 127.0.0.1:19210 पर स्रोत हार्नेस। Compose प्रोजेक्ट vbox-hgcm-ssm-cparms। gadget.c पिन आकारों, uint32_t cbCmd सूत्र, लाइव 32 कैप, और एक लोड-पाथ enmType स्टोर की प्रतिलिपि करता है। यह VirtualBox को बूट नहीं करता और यह .sav को पार्स नहीं करता। इसे लूपबैक से बाइंड करें।
SUCCESS vbox-hgcm-ssm-cparms wrap=yes oob=yes live-cap=32 canary-smashed=yes VBOX-HGCM-SSM-CPARMS-WITNESS