
VirtualBox 7.2.20 - उच्च - स्थानीय - फ़ाइल लेखन - OVF href dest escape
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vbox-ovf-href-dest-escape
वर्ग: फ़ाइल लेखन पहुँच: स्थानीय (होस्ट) UI:R
Oracle VM VirtualBox OSS 7.2.20 (f2792cf44) - Oracle
एक होस्ट उपयोगकर्ता जो किसी शत्रुतापूर्ण OVF/OVA को आयात करता है, नए VM फ़ोल्डर के बाहर डिस्क-इमेज बाइट्स लिखता है। ovf:href गंतव्य फ़ाइल नाम है। RTPathAbsExCxx RTPATHABS_F_STOP_AT_BASE को नहीं लेता है। अद्वितीय-पथ सहायक प्रत्यय से पहले _%i डालता है और बेसनेम-स्ट्रिप नहीं करता है।
| ID | अभी तक कोई CVE नहीं |
| वर्ग | फ़ाइल लेखन (OVF/OVA गंतव्य पथ) |
| पहुँच | स्थानीय (होस्ट) UI:R (पीड़ित एक शत्रुतापूर्ण एप्लायंस आयात करता है) |
| CWE | CWE-22 |
| CVSS | उच्च: 7.8 CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/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 भेजें। ovf:href में ../somewhere/disk.vmdk या एक निरपेक्ष /path/disk.iso डालें। जो ऑपरेटर इसे आयात करता है, वह आयातकर्ता UID के रूप में उन डिस्क-इमेज बाइट्स को CREATE_REPLACE-लिखता है, जिसमें वे मूल निर्देशिकाएँ भी शामिल हैं जो मौजूद नहीं थीं। प्रत्यय आवश्यक है (vmdk / iso / अन्य MediumFormat एक्सटेंशन)। यह authorized_keys की प्रत्यय-रहित ड्रॉप नहीं है।
| विशेषाधिकार | विधि + सिंक | यह क्या प्रदान करता है | उत्पत्ति |
|---|---|---|---|
| अखंडता | IAppliance::read File/href को बिना बेसनेम स्ट्रिप के कॉपी करता है (ovfreader.cpp)। Appliance::interpret() dest = di.strHref सेट करता है (ApplianceImplImport.cpp 802-851)। | गंतव्य फ़ाइल नाम हमलावर द्वारा चुना गया है, जिसमें ../ और निरपेक्ष पथ शामिल हैं। | लैब-प्रमाणित (सापेक्ष और निरपेक्ष hrefs) |
| अखंडता | i_ensureUniqueImageFilePath (ApplianceImpl.cpp 1126-1160) RTPathAbsExCxx(strAbsName, aMachineFolder, aName) को बिना RTPATHABS_F_STOP_AT_BASE के कॉल करता है। टकराव aName के प्रत्यय से पहले _%i डालता है, न कि बेसनेम। | अद्वितीय गंतव्य अभी भी मशीन फ़ोल्डर से बाहर चला जाता है। ../oracle/WITNESS.vmdk बन जाता है ../oracle/WITNESS_1.vmdk। | लैब-प्रमाणित (unique-keeps-dotdot=yes) |
| अखंडता | आयात i_importOneDiskImage AbsEx फिर से (ApplianceImplImport.cpp 4169-4171)। i_importCreateAndWriteDestinationFile (1043-1053) mkdir-parents फिर RTFILE_O_CREATE_REPLACE। | डिस्क-इमेज बाइट्स VM फ़ोल्डर के बाहर गिरती हैं। निरपेक्ष href मशीन फ़ोल्डर को अनदेखा करता है। नियंत्रण disk.vmdk फ़ोल्डर के अंदर रहता है। | लैब-प्रमाणित (relative-escape=yes absolute-href=yes control-in-folder=yes) |
| टोह | आयात विज़ार्ड / VBoxManage import --dry-run गंतव्य दिखाता है। | पथ दृश्यमान है। अपने आप में कोई गुप्त लीक नहीं। | अनुमानित |
| उपलब्धता | सापेक्ष गंतव्य जो किसी अन्य VM की डिस्क पर गिरता है। | आयातकर्ता UID के रूप में उस फ़ाइल को अधिलेखित करें। | अनुमानित (वही CREATE_REPLACE लेखन) |
| बंद | MediumFormat प्रत्यय के बिना गंतव्य | आयात has no extension फेंकता है। प्रत्यय-रहित authorized_keys / crontab लेखन नहीं। | बंद |
| बंद | NVRAM गंतव्य | मशीन फ़ोल्डर के अंतर्गत {vmname}.nvram पर मजबूर। | बंद |
| बंद | VM नाम .. | sanitiseMachineFilename इसे विकृत कर देता है। | बंद |
| बंद | साझा फ़ोल्डर / ExtraData / सीरियल RawFile | vbox:Machine पथ पर सैनिटाइज़ किया गया। | बंद |
| बंद | होस्ट कर्नेल, गेस्ट-टू-होस्ट | यह अवशेष नहीं। कोई VM स्टार्ट आवश्यक नहीं। आयातकर्ता के समान UID। | बंद |
OVA साफ़ रास्ता है: tar सदस्य बाइट्स देता है, href एस्केप किया गया गंतव्य देता है। कोई 3D नहीं, कोई Guest Additions नहीं, कोई VRDP नहीं, PUEL नहीं।
मैंने सितंबर 2026 CPU के बाद टैग v7.2.20 (f2792cf44) पर बैठकर OVF आयात पढ़ा। ExtraData, साझा फ़ोल्डर, NVRAM गंतव्य, और सीरियल RawFile पहले से ही हटा दिए गए हैं। डिस्क गंतव्य नहीं है। interpret() di.strHref को सीधे HardDiskImage VBox मान में कॉपी करता है:
Utf8Str strFilename = di.strHref;
/* ... */
i_ensureUniqueImageFilePath(strMachineFolder, devType, strFilename);
pNewDesc->i_addEntry(VirtualSystemDescriptionType_HardDiskImage,
hd.strDiskId,
di.strHref,
strFilename,
di.ulSuggestedSizeMB,
strExtraConfig);
ApplianceImpl.cpp 1126-1160 उस नाम को RTPATHABS_F_STOP_AT_BASE के बिना मशीन फ़ोल्डर के सापेक्ष पूर्ण करता है, फिर aName को यथास्थान परिवर्तित करता है:
int vrc = RTPathAbsExCxx(strAbsName, aMachineFolder, aName);
/* ... */
const char *pszSuffix = RTPathSuffix(aName.c_str());
offDashNum = pszSuffix ? (size_t)(pszSuffix - aName.c_str()) : aName.length();
aName.replace(offDashNum, cchDashNum, szTmp, cchTmp);
Import, अभी भी सापेक्ष dest (ApplianceImplImport.cpp 4169-4171) पर AbsEx दोहराता है और CREATE_REPLACE-लिखता है। IPRT परीक्षण उसी जोड़ को प्रलेखित करते हैं: निरपेक्ष दूसरा तर्क जीतता है; /VirtualBox/Machines और ../VirtualBox.xml मिलकर /VirtualBox/VirtualBox.xml बनते हैं।
पहले से दर्ज गलत मोड़: प्रत्यय-रहित authorized_keys लेखन को अवशेष मानना (import फेंकता है); NVRAM dest (फ़ोल्डर के अंदर बाध्य); VM नाम .. (सैनिटाइज़र); साझा फ़ोल्डर / ExtraData / सीरियल RawFile (पहले से सैनिटाइज़्ड)। थिएटर: होस्ट कर्नेल, गेस्ट-से-होस्ट। ओरेकल मशीन फ़ोल्डर के बाहर एक गवाह पंक्ति है साथ ही एक नियंत्रण disk.vmdk जो अपनी जगह पर रहा।
python3 vbox-ovf-href-dest-escape-Abraxas-Labs.py
या
cd lab
./run.sh
interpret dest-join, unique-path और import CREATE_REPLACE write का स्रोत harness। Docker compose, loopback, कोई VirtualBox बाइनरी नहीं। मशीन फ़ोल्डर /work/Machines/ImportedVM। Oracle /work/oracle।
SUCCESS vbox-ovf-href-dest-escape relative-escape=yes unique-keeps-dotdot=yes absolute-href=yes control-in-folder=yes VBOX-OVF-HREF-DEST-ESCAPE-WITNESS
ovf:href को dest बनने से पहले basename-strip करें, या RTPATHABS_F_STOP_AT_BASE पास करें (और absolute नामों को अस्वीकार करें)। RTPATH_PROP_DOTDOT_REFS को अस्वीकार करें। Unique-path को basename को बदलना चाहिए, relative string को नहीं।
f2792cf44f663989818507e36d3db5f978523c5e)ApplianceImplImport.cpp 802-851, 1043-1053, 4169-4171ApplianceImpl.cpp 1126-1160GNU Affero GPL v3.0। देखें LICENSE। केवल लूपबैक लैब। कोई वारंटी नहीं।