
Oracle VM VirtualBox 7.2.20 - उच्च - स्थानीय - फ़ाइल पढ़ना - VMDK sparse FLAT extent path join
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vbox-vmdk-sparse-extent
वर्ग: फ़ाइल पठन पहुँच: स्थानीय (होस्ट) UI:R
Oracle VM VirtualBox OSS 7.2.20 (f2792cf44) - Oracle
एक होस्ट उपयोगकर्ता जो ऐसी OVF निर्देशिका या OVA आयात करता है जिसकी डिस्क एक sparse VMDK डिस्क्रिप्टर और FLAT extent है, वह उस extent में नामित होस्ट पथ खोलता है और उन बाइट्स को आयातित डिस्क में कॉपी करता है। vmdkParseDescriptor के बाद, pszBasename जिसका आरंभ RTPATH_SLASH से होता है, वाला प्रत्येक extent जैसा है वैसा ही उपयोग किया जाता है; अन्यथा RTPathJoinA(descriptor dir, pszBasename) का उपयोग होता है जो ../ का अनुसरण करता है। FLAT और HOSTED_SPARSE फिर उस पूर्ण पथ पर vmdkFileOpen करते हैं। streamOptimized (सामान्य VirtualBox निर्यात, VMDK magic) एकल फ़ाइल है और यह इस प्रक्रिया से नहीं गुज़रता। आयात अभी भी sparse specifier स्वीकार करता है।
| ID | अभी तक कोई CVE नहीं |
| वर्ग | फ़ाइल पठन (sparse VMDK FLAT/sparse extent पथ) |
| पहुँच | स्थानीय (होस्ट) UI:R (पीड़ित एक शत्रुतापूर्ण एप्लायंस आयात करता है) |
| CWE | CWE-22 |
| CVSS | उच्च: 7.7 CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:C/C:H/I:N/A:N |
| उत्पाद | Oracle VM VirtualBox OSS |
| प्रभावित | 7.2.20 (f2792cf44f663989818507e36d3db5f978523c5e) |
| प्रमाणीकरण | VirtualBox पर कोई नहीं। होस्ट उपयोगकर्ता File/Import या VBoxManage import खोलता है। |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | केवल 127.0.0.1। स्रोत हार्नेस। VirtualBox बूट नहीं किया गया है। |
एक OVF निर्देशिका या एक OVA भेजें। एक sparse VMDK डिस्क्रिप्टर (# Disk DescriptorFile, createType="monolithicFlat") को एक FLAT extent के बगल में रखें जिसका उद्धृत basename ../../somewhere/secret या /path/secret है। जो ऑपरेटर इसे आयात करता है, वह उस होस्ट पथ को आयात करने वाले UID के रूप में खोलता है और बाइट्स को गंतव्य डिस्क में कॉपी करता है। streamOptimized (VMDK magic 0x564D444B) एम्बेडेड FLAT नाम को नहीं देखता। यह उन फ़ाइलों का पठन है जिन्हें VBox UID खोल सकता है, न कि authorized_keys का प्रत्यय-मुक्त लेखन।
| विशेषाधिकार | विधि + सिंक | यह क्या प्रदान करता है | उद्गम |
|---|---|---|---|
| रेकॉन | एक ASCII स्पार्स VMDK का आयात। vmdkParseDescriptor के बाद, RTPathJoinA(descriptor dir, pszBasename) बिना किसी ../ संकुचन के (VMDK.cpp 3472-3503)। उस पूर्ण पथ का FLAT vmdkFileOpen। आयात उन बाइट्स को dest में कॉपी करता है। | ../ द्वारा नामित होस्ट फ़ाइल बाइट्स आयातित डिस्क में पहुँच जाती हैं। लैब pszBasename ../../oracle/VBOX-VMDK-SPARSE-EXTENT-WITNESS को /work/import/disk/../../oracle/... से जोड़ा गया और /work/import/out.vmdk में कॉपी किया गया। | लैब-प्रमाणित (relative-escape=yes) |
| रेकॉन | वही वॉक। pszBasename[0] == RTPATH_SLASH को जैसा है वैसा ही उपयोग किया जाता है (VMDK.cpp 3477-3485)। | निरपेक्ष होस्ट पथ खोला और कॉपी किया गया। लैब /work/oracle/VBOX-VMDK-SPARSE-EXTENT-WITNESS। | लैब-प्रमाणित (absolute-extent=yes) |
| रेकॉन | नियंत्रण FLAT disk-flat.vmdk को डिस्क्रिप्टर निर्देशिका के अंतर्गत जोड़ा गया। | फ़ोल्डर के भीतर ही रहता है। लैब पूर्णनाम /work/import/disk/disk-flat.vmdk। बाइट्स CONTROL-FLAT-NOT-ORACLE। | लैब-प्रमाणित (control-in-folder=yes) |
| रेकॉन | VMDK मैजिक के साथ streamOptimized। vmdkDescriptorRead vmdkDescriptorReadSparse लेता है। एम्बेडेड ASCII FLAT ने oracle का नाम दिया। | एम्बेडेड नाम को नहीं खोला। dest स्ट्रीम फ़ाइल ही रहा (STREAMOPTIMIZED-SELF-NOT-ORACLE)। | लैब-प्रमाणित (streamoptimized-consults-extent=no) |
| रेकॉन | गेस्ट Start, फिर परिवर्तित वॉल्यूम पढ़ें। | गेस्ट को आयातक-UID-पठनीय होस्ट फ़ाइल सामग्री दिखती है जो dest में पहुँची। | अनुमानित (वही कॉपी; लैब गेस्ट बूट नहीं करता) |
| उपलब्धता | आयात dest जो पहले से मौजूद है, या परिवर्तित डिस्क का बाद में अटैच। | dest डिस्क की उपलब्धता का अधिलेखन। सामग्री खोली गई होस्ट फ़ाइल बन जाती है। | अनुमानित (dest का वही लेखन) |
| बंद | streamOptimized VMDK (सामान्य VirtualBox निर्यात) | मैजिक शाखा। एकल फ़ाइल। एम्बेडेड FLAT नाम नहीं खोला जाता। | बंद |
| बंद | Windows ड्राइव-अक्षर निरपेक्ष (C:\...) | pszBasename[0] == RTPATH_SLASH चूक सकता है। कोड निरपेक्ष जाँच को एक हैक कहता है (@todo implement proper path absolute check)। | बंद |
| बंद | प्रत्यय-रहित लेखन (authorized_keys, crontab) | लेखन अवशेष नहीं। एक्सटेंट खोलना नामित होस्ट पथ का पठन है। | बंद |
| बंद | होस्ट कर्नेल, गेस्ट-से-होस्ट, अन्य VM, VBoxSVC मेमोरी | यह अवशेष नहीं। कॉपी के लिए किसी VM स्टार्ट की आवश्यकता नहीं। आयातक के समान UID। | बंद |
OVA वही वॉक है जब स्पार्स डिस्क्रिप्टर डिस्क पर आ जाता है: tar सदस्य डिस्क्रिप्टर के साथ (वैकल्पिक) इन-फ़ोल्डर FLAT प्रदान करता है; एक्सटेंट बेसनेम एस्केप्ड ओपन प्रदान करता है। कोई 3D नहीं, कोई Guest Additions नहीं, कोई VRDP नहीं, PUEL नहीं।
मैंने सितंबर 2026 CPU के बाद टैग v7.2.20 (f2792cf44) पर ध्यान दिया और VMDK आयात पढ़ा। ExtraData, साझा फ़ोल्डर, NVRAM dest, और सीरियल RawFile पहले ही हटा दिए गए हैं। ovf:href dest एक सहोदर अवशेष है। सामान्य VirtualBox निर्यात streamOptimized है। interpret() अभी भी स्पार्स स्पेसिफ़ायर (g_pszVMDKSparseURI) स्वीकार करता है। vmdkParseDescriptor के बाद, एक्सटेंट बेसनेम को ../ को संकुचित किए बिना या निरपेक्ष पथों को अस्वीकार किए बिना जोड़ा जाता है:
/* Hack to figure out whether the specified name in the
* extent descriptor is absolute. Doesn't always work, but
* should be good enough for now. */
char *pszFullname;
/** @todo implement proper path absolute check. */
if (pExtent->pszBasename[0] == RTPATH_SLASH)
{
pszFullname = RTStrDup(pExtent->pszBasename);
/* ... */
}
else
{
char *pszDirname = RTStrDup(pImage->pszFilename);
RTPathStripFilename(pszDirname);
pszFullname = RTPathJoinA(pszDirname, pExtent->pszBasename);
/* ... */
}
pExtent->pszFullname = pszFullname;
RTPathJoinA केवल स्लैश-संतुलन करता है। यह .. को संकुचित नहीं करता। FLAT और HOSTED_SPARSE फिर उस स्ट्रिंग को खोलते हैं:
case VMDKETYPE_FLAT:
rc = vmdkFileOpen(pImage, &pExtent->pFile, pExtent->pszBasename, pExtent->pszFullname,
VDOpenFlagsToFileOpenFlags(uOpenFlags, false /* fCreate */));
vmdkDescriptorRead मैजिक पर विभाजित होता है। VMDK स्पार्स मैजिक (0x564D444B) vmdkDescriptorReadSparse लेता है और पहले से खुली फ़ाइल को extent के रूप में रखता है। ASCII vmdkDescriptorReadAscii और ऊपर दिए गए join को लेता है।
पहले से दर्ज गलत मोड़: streamOptimized को इस अवशेष के रूप में मानना (मैजिक एम्बेडेड FLAT नाम से परामर्श नहीं करता); Windows ड्राइव-लेटर निरपेक्ष को Unix स्लैश जाँच के रूप में मानना; dest-disk अधिलेखन को प्रत्यय-रहित authorized_keys लेखन के रूप में मानना; VM को बूट करना जब join का स्रोत harness पर्याप्त है। थिएटर: होस्ट कर्नेल, गेस्ट-टू-होस्ट। ओरेकल डिस्क्रिप्टर फ़ोल्डर के बाहर एक गवाह पंक्ति है साथ ही एक नियंत्रण disk-flat.vmdk जो अपनी जगह पर रहा।
python3 vbox-vmdk-sparse-extent-Abraxas-Labs.py
या
cd lab
./run.sh
vmdkParseDescriptor extent join, vmdkFileOpen, और streamOptimized magic शाखा का स्रोत harness। Docker compose, loopback 127.0.0.1:19250, कोई VirtualBox बाइनरी नहीं। Descriptor dir /work/import/disk। Oracle /work/oracle। Dest /work/import/out.vmdk।