
VirtualBox 7.2.20 - उच्च - स्थानीय - फ़ाइल लेखन - Guest Control copy-from DOTDOT
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vbox-guestctrl-copyfrom-dotdot
वर्ग: फ़ाइल लेखन पहुँच: स्थानीय (गेस्ट) भ्रमित-डिप्टी
Oracle VM VirtualBox OSS 7.2.20 (f2792cf44) - Oracle
होस्ट IGuestSession::directoryCopyFromGuest / VBoxManage guestcontrol copyfrom गेस्ट DIR_NOTIFY नामों को गंतव्य पर जोड़ता है। FsList::AddDirFromGuest केवल सटीक . और .. को छोड़ता है। GuestPath::Translate स्लैश शैली और दोहरे-स्लैश संकुचन है। BuildDestinationPath गंतव्य रूट पर RTPATH_PROP_DOTDOT_REFS को अस्वीकार करता है जिसे होस्ट ने नामित किया, प्रति-प्रविष्टि नामों पर नहीं।
एक गेस्ट जो होस्ट-आरंभित निर्देशिका कॉपी-फ्रॉम का उत्तर .. वाले नामों के साथ देता है, गंतव्य के बाहर VBox UID के रूप में फ़ाइलें लिखता है।
| ID | अभी तक कोई CVE नहीं |
| वर्ग | फ़ाइल लेखन (होस्ट गंतव्य पलायन) |
| पहुँच | स्थानीय (गेस्ट) भ्रमित-डिप्टी। होस्ट कॉपी शुरू करता है। गेस्ट फ़ाइलों के नाम देता है। |
| CWE | CWE-22 |
| CVSS | उच्च: 8.2 CVSS:3.1/AV:L/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N |
| उत्पाद | Oracle VM VirtualBox OSS |
| प्रभावित | 7.2.20 (f2792cf44f663989818507e36d3db5f978523c5e) |
| प्रमाणीकरण | Guest Additions (या एक प्रतिस्थापन HGCM क्लाइंट) तथा एक होस्ट-आरंभित निर्देशिका कॉपी-फ्रॉम |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | केवल 127.0.0.1। स्रोत हार्नेस। VirtualBox को बूट नहीं करता। |
Guest Control डिज़ाइन से होस्ट-से-गेस्ट है। शेष विपरीत है: होस्ट उपयोगकर्ता एक गेस्ट निर्देशिका की प्रतिलिपि बनाता है, और गेस्ट HOST_MSG_DIR_READ का उत्तर GUEST_MSG_DIR_NOTIFY / GUEST_DIR_NOTIFYTYPE_READ नामों के साथ देता है। Main उन नामों को गंतव्य पर जोड़ता है और उन्हें खोलता है।
| विधि | सिंक | विशेषाधिकार |
|---|---|---|
होस्ट IGuestSession::directoryCopyFromGuest / VBoxManage guestcontrol copyfrom द्वारा गेस्ट निर्देशिका की प्रतिलिपि। गेस्ट लिस्टिंग नाम ../oracle/VBOX-GUESTCTRL-COPYFROM-DOTDOT-WITNESS। | CopyFrom::Run करता है strDstAbs = dest + native_sep + pEntry->strPath, फिर GuestPath::Translate, फिर fileCopyFromGuest -> RTFileOpen(RTFILE_O_WRITE | RTFILE_O_OPEN_CREATE)। | VBox UID के रूप में गंतव्य के बाहर होस्ट फ़ाइल बनाएँ/अधिलेखित करें। लैब गंतव्य /work/vbox-copy। लैब ने /work/oracle/VBOX-GUESTCTRL-COPYFROM-DOTDOT-WITNESS लिखा। सामग्री गेस्ट-चयनित है (फ़ाइल-पठन सूचना)। |
सटीक . और .. निर्देशिका नाम छोड़े जाते हैं और नहीं लिखते। एक फ़ाइल जिसके नाम में .. है, संग्रहीत और जोड़ी जाती है।
| विधि | सिंक | विशेषाधिकार |
|---|---|---|
वही कॉपी-फ्रॉम। गेस्ट ../../../.ssh/authorized_keys (या DOS ..\..\...) सूचीबद्ध करता है जबकि होस्ट गंतव्य /tmp/vbox-copy / C:\Temp\vbox-copy है। | वही जोड़ + RTFileOpen। | कोई भी होस्ट पथ बनाएँ या अधिलेखित करें जिसे वह UID लिख सकता है। नेस्टेड --recursive नाम और आगे चलते हैं। |
होस्ट द्वारा पहले से चुने गए गंतव्य के अतिरिक्त कुछ नहीं। गेस्ट इस शेष से अतिरिक्त होस्ट पथ नहीं सीखता।
उन फ़ाइलों का अधिलेखन जिन्हें VBox UID लिख सकता है। क्रैश शेष नहीं। CVSS A:N।
fileCopyFromGuest: गंतव्य पूरी तरह होस्ट-निर्दिष्ट है; अतिथि केवल उस पथ में बाइट्स प्रदान करता है।AddDirFromHost होस्ट लिस्टिंग में . / .. को छोड़ देता है।/etc एक सामान्य उपयोगकर्ता के रूप में, किसी अन्य उपयोगकर्ता का होम)।HOST_MSG_* का अतिथि द्वारा इंजेक्शन। svcCall केवल GUEST_MSG_* को डिस्पैच करता है।guestCtrlValidateDirEntryEx में पथ सैनिटाइज़र। वह जाँच UTF-8/आकार है, .. नहीं।इसके लिए Guest Additions (या एक प्रतिस्थापन HGCM क्लाइंट जो सत्र का स्वामी हो) और होस्ट-आरंभित निर्देशिका copy-from की आवश्यकता होती है। कोई 3D नहीं। कोई VRDP नहीं। PUEL नहीं। Confused-deputy: होस्ट उपयोगकर्ता एक शत्रुतापूर्ण अतिथि से प्रतिलिपि बनाता है।
मैंने VirtualBox/virtualbox v7.2.20 (f2792cf44) को पिन किया। Guest Control हंट H04। केवल अतिथि-से-होस्ट। Shared-folder TOCTOU (P0 1037) एक भिन्न सेवा पर एक सहोदर वर्ग है और इस पिन पर बंद है (लेक्सिकल abs के बाद RTPathStartsWith)। Guest Control copy-from DIR_NOTIFY नामों को जोड़ता है, SHFL नामों को नहीं।
AddDirFromGuest अतिथि Name से strEntry बनाता है और केवल सटीक . / .. को छोड़ता है:
Utf8Str strEntry = strPathSub + Utf8Str(bstrName);
switch (enmObjType)
{
case FsObjType_Directory:
{
if ( bstrName.equals(".")
|| bstrName.equals(".."))
{
break;
}
vrc = AddDirFromGuest(strPath, strEntry);
break;
}
case FsObjType_File:
vrc = AddEntryFromGuest(strEntry, fsObjInfo->i_getData());
break;
}
CopyFrom::Run फिर संग्रहीत पथ को dest पर जोड़ता है और केवल अनुवाद करता है:
strDstAbs += PATH_STYLE_SEP_STR(PATH_STYLE_NATIVE);
strDstAbs += pEntry->strPath;
vrc = GuestPath::Translate(strDstAbs, mSession->i_getGuestPathStyle(), PATH_STYLE_NATIVE);
/* directoryCreateOnHost / fileCopyFromGuest -> RTFileOpen WRITE|OPEN_CREATE */
GuestPath::BuildDestinationPath दस्तावेज़ करता है कि "Dotdot directories are forbidden for security reasons" और RTPATH_PROP_DOTDOT_REFS को अस्वीकार करता है। वह कॉल केवल dest root पर है (GuestSessionImplTasks.cpp:1685-1686)। प्रति-प्रविष्टि नाम कभी उससे नहीं गुज़रते। Translate (GuestCtrlPrivate.cpp:2129-2208) slash शैली बदलता है और // को संकुचित करता है। यह .. को अस्वीकार नहीं करता।
पहले से दर्ज गलत मोड़: सटीक . / .. छोड़ने को path sanitizer मानना; यह मानना कि Translate canonicalize करता है; dest-root जाँच को प्रत्येक प्रविष्टि पर लागू करना; source harness के बजाय VM बूट करना; इसे host-kernel escape बताना; single-file copy-from dest या copy-to-guest को बचा हुआ मानना। Theatre: एक reverse shell। Oracle dest के बाहर एक witness फ़ाइल है।
cd lab
./run.sh
Compose प्रोजेक्ट vbox-guestctrl-copyfrom-dotdot। Loopback 127.0.0.1:19220। pin v7.2.20 peel f2792cf44 का सोर्स हार्नेस: सटीक . / .. का skip, GuestPath::Translate (केवल slash शैली), CopyFrom::Run dest+sep+entry join फिर write/create, dest-root BuildDestinationPath DOTDOT reject। VirtualBox या Guest Additions को boot नहीं करता। इसे loopback से bind करें।
SUCCESS vbox-guestctrl-copyfrom-dotdot skip-dot=yes translate-keeps-dotdot=yes escaped-write=yes dest-root-check-unused-per-entry=yes VBOX-GUESTCTRL-COPYFROM-DOTDOT-WITNESS
प्रत्येक जोड़े गए dest को GuestPath::BuildDestinationPath (या RTPathParse RTPATH_PROP_DOTDOT_REFS, या dest के विरुद्ध RTPATHABS_F_STOP_AT_BASE के साथ RTPathAbsEx) के माध्यम से चलाएँ। उन लिस्टिंग नामों को अस्वीकार करें जिनके घटकों में .. शामिल है, केवल सटीक . और .. ही नहीं। dest-root जाँच रखें। यह अपने आप में पर्याप्त नहीं है।