
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 خارج الوجهة.
| المعرّف | لا يوجد 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. وجهة المختبر /work/vbox-copy. كتب المختبر /work/oracle/VBOX-GUESTCTRL-COPYFROM-DOTDOT-WITNESS. المحتوى يختاره الضيف (إشعار قراءة ملف). |
تُتخطى أسماء المجلدات . و .. الحرفية ولا تكتب. أما الملف الذي يحتوي اسمه على .. فيُخزَّن ويُدمج.
| الطريقة | المَصبّ | الامتياز |
|---|---|---|
نفس النسخ من الضيف. يسرد الضيف ../../../.ssh/authorized_keys (أو نمط DOS ..\..\...) بينما وجهة المضيف هي /tmp/vbox-copy / C:\Temp\vbox-copy. | نفس الدمج + RTFileOpen. | إنشاء أو استبدال أي مسار مضيف يمكن لذلك المعرّف الكتابة فيه. الأسماء المتداخلة --recursive تتقدم أكثر. |
لا شيء يتجاوز الوجهة التي اختارها المضيف بالفعل. لا يتعلم الضيف مسارات مضيف إضافية من هذا المتبقي.
استبدال ملفات يمكن لمعرّف المستخدم VBox الكتابة فيها. ليس متبقيًا يؤدي إلى انهيار. CVSS A:N.
fileCopyFromGuest: الوجهة محددة بالكامل من المضيف؛ الضيف يوفّر البايتات فقط إلى ذلك المسار.AddDirFromHost يتخطى . / .. في قائمة المضيف./etc كمستخدم عادي، أو مجلد منزل مستخدم آخر).HOST_MSG_*. svcCall يوزّع فقط GUEST_MSG_*.guestCtrlValidateDirEntryEx. ذلك الفحص خاص بـ UTF-8/الحجم، وليس ...يتطلب Guest Additions (أو عميل HGCM بديل يملك الجلسة) و نسخًا من مجلد يبدأ من المضيف. لا 3D. لا VRDP. ليس PUEL. وكيل مُلتبس: مستخدم المضيف ينسخ من ضيف معادٍ.
ثبّتت VirtualBox/virtualbox عند v7.2.20 (f2792cf44). مطاردة Guest Control H04. من الضيف إلى المضيف فقط. TOCTOU للمجلد المشترك (P0 1037) فئة شقيقة على خدمة مختلفة وهي مغلقة عند هذا التثبيت (RTPathStartsWith بعد abs المعجمي). النسخ من Guest Control يَدمج أسماء DIR_NOTIFY، وليس أسماء SHFL.
AddDirFromGuest يبني strEntry من Name الخاص بالضيف ويتخطى فقط . / .. المطابقين تمامًا:
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. هذا الاستدعاء يقع فقط على جذر الوجهة (GuestSessionImplTasks.cpp:1685-1686). أسماء الإدخالات الفردية لا تمر عبره أبدًا. Translate (GuestCtrlPrivate.cpp:2129-2208) يغيّر نمط الشرطة المائلة ويجمع //. وهو لا يرفض ...
المنعطفات الخاطئة المسجّلة سلفًا: التعامل مع تخطي . / .. الدقيق كمعقّم للمسارات؛ افتراض أن Translate يقوم بالتقنين (canonicalization)؛ تطبيق فحص جذر الوجهة على كل إدخال؛ إقلاع جهاز ظاهري بدلًا من حزمة اختبار مصدرية؛ الادعاء بأن هذا هروب من نواة المضيف؛ اعتبار النسخ من الوجهة لملف واحد أو النسخ إلى الضيف هو المتبقي. المسرح: صدفة عكسية. الـ oracle هو ملف شاهد خارج الوجهة.
cd lab
./run.sh
إنشاء مشروع vbox-guestctrl-copyfrom-dotdot. Loopback 127.0.0.1:19220. حزمة اختبار المصدر الخاصة بـ pin v7.2.20 peel f2792cf44: تخطي . / .. الدقيقين، GuestPath::Translate (نمط الشرطة المائلة فقط)، CopyFrom::Run دمج dest+sep+entry ثم الكتابة/الإنشاء، رفض DOTDOT في جذر الوجهة BuildDestinationPath. لا يقوم بتشغيل VirtualBox أو Guest Additions. اربطه بـ loopback.
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
مرّر كل مسار وجهة مدمج عبر GuestPath::BuildDestinationPath (أو RTPathParse مع RTPATH_PROP_DOTDOT_REFS، أو RTPathAbsEx مع RTPATHABS_F_STOP_AT_BASE مقابل الوجهة). ارفض أسماء القوائم التي تتضمن مكوّناتها ..، وليس فقط . و .. المطابقين تمامًا. أبقِ على فحص جذر الوجهة. فهو غير كافٍ بحد ذاته.