
VirtualBox 7.2.20 - عالية - محلية - كتابة ملف - هروب وجهة href في OVF
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 خبيثًا يكتب بايتات صورة القرص خارج مجلد الجهاز الظاهري الجديد. ovf:href هو اسم ملف الوجهة. لا يأخذ RTPathAbsExCxx الخيار RTPATHABS_F_STOP_AT_BASE. تُدرج أداة المسار الفريد _%i قبل اللاحقة ولا تُزيل اسم الأساس.
| المعرّف | لا يوجد 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. ضع ../somewhere/disk.vmdk أو مسارًا مطلقًا /path/disk.iso في ovf:href. يقوم المشغّل الذي يستورده بكتابة بايتات صورة القرص تلك عبر CREATE_REPLACE بصلاحيات المستخدم المستورد، بما في ذلك الأدلة الأصلية غير الموجودة. اللاحقة مطلوبة (vmdk / iso / امتدادات MediumFormat الأخرى). هذا ليس إسقاطًا بلا لاحقة لملف authorized_keys.
| الصلاحية | الطريقة + نقطة الوصول | ما تمنحه | المصدر |
|---|---|---|---|
| السلامة | IAppliance::read ينسخ File/href دون إزالة اسم الأساس (ovfreader.cpp). Appliance::interpret() يضبط الوجهة = di.strHref (ApplianceImplImport.cpp 802-851). | اسم ملف الوجهة يختاره المهاجم، بما في ذلك ../ والمسارات المطلقة. | مُثبت مختبريًا (روابط href نسبية ومطلقة) |
| السلامة | i_ensureUniqueImageFilePath (ApplianceImpl.cpp 1126-1160) يستدعي RTPathAbsExCxx(strAbsName, aMachineFolder, aName) دون RTPATHABS_F_STOP_AT_BASE. التصادم يُدرج _%i قبل لاحقة aName، وليس اسم الأساس. | الوجهة الفريدة لا تزال تخرج عن مجلد الجهاز. يصبح ../oracle/WITNESS.vmdk هو ../oracle/WITNESS_1.vmdk. | مُثبت مختبريًا (unique-keeps-dotdot=yes) |
| السلامة | الاستيراد i_importOneDiskImage AbsEx مرة أخرى (ApplianceImplImport.cpp 4169-4171). i_importCreateAndWriteDestinationFile (1043-1053) ينشئ الدليل الأصلي ثم RTFILE_O_CREATE_REPLACE. | بايتات صورة القرص تستقر خارج مجلد الجهاز. رابط href المطلق يتجاهل مجلد الجهاز. ملف التحكم disk.vmdk يبقى داخل المجلد. | مُثبت مختبريًا (relative-escape=yes absolute-href=yes control-in-folder=yes) |
| الاستطلاع | معالج الاستيراد / VBoxManage import --dry-run يُظهر الوجهة. | المسار مرئي. ليس تسريبًا لسر بحد ذاته. | مُستنتج |
| التوافر | وجهة نسبية تستقر على قرص جهاز ظاهري آخر. | الكتابة فوق ذلك الملف بصلاحيات المستخدم المستورد. | مُستنتج (نفس كتابة CREATE_REPLACE) |
| مغلق | وجهة بلا لاحقة MediumFormat | الاستيراد يرمي has no extension. ليس كتابة بلا لاحقة لـ authorized_keys / crontab. | مغلق |
| مغلق | وجهة NVRAM | تُفرض إلى {vmname}.nvram تحت مجلد الجهاز. | مغلق |
| مغلق | اسم الجهاز .. | sanitiseMachineFilename يشوّهه. | مغلق |
| مغلق | المجلدات المشتركة / ExtraData / serial RawFile | مُعقّمة على مسار vbox:Machine. | مغلق |
| مغلق | نواة المضيف، من الضيف إلى المضيف | ليس هذه البقايا. لا يلزم بدء الجهاز. نفس UID الخاص بالمستورد. | مغلق |
OVA هو المسار النظيف: عضو tar يوفّر البايتات، وhref يوفّر الوجهة المُهرَّبة. لا 3D، ولا Guest Additions، ولا VRDP، ولا PUEL.
توقفت عند الوسم v7.2.20 (f2792cf44) بعد تحديث CPU لشهر سبتمبر 2026 وقرأت استيراد 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 عملية AbsEx على الـ dest الذي لا يزال نسبيًا (ApplianceImplImport.cpp 4169-4171) وعمليات الكتابة CREATE_REPLACE. توثّق اختبارات IPRT نفس الدمج: الوسيط الثاني المطلق يفوز؛ /VirtualBox/Machines مع ../VirtualBox.xml تصبح /VirtualBox/VirtualBox.xml.
المنعطفات الخاطئة المسجّلة سلفًا: معاملة كتابة authorized_keys الخالية من لاحقة على أنها المتبقي (يرمي Import استثناءً)؛ وجهة NVRAM (مفروضة داخل المجلد)؛ اسم VM .. (المعقّم)؛ المجلدات المشتركة / ExtraData / RawFile التسلسلي (مُعقّمة سلفًا). المسرح: نواة المضيف، من الضيف إلى المضيف. الأوراكل هو سطر شاهد خارج مجلد الآلة بالإضافة إلى disk.vmdk ضابط بقي في مكانه.
python3 vbox-ovf-href-dest-escape-Abraxas-Labs.py
أو
cd lab
./run.sh
مصدر اختبار interpret dest-join وunique-path وكتابة الاستيراد CREATE_REPLACE. 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
أزل اسم الأساس (basename) من ovf:href قبل أن يصبح مسارًا وجهة (dest)، أو مرّر RTPATHABS_F_STOP_AT_BASE (وارفض الأسماء المطلقة). ارفض RTPATH_PROP_DOTDOT_REFS. يجب أن يعدّل المسار الفريد (unique-path) اسم الأساس، لا السلسلة النسبية.
f2792cf44f663989818507e36d3db5f978523c5e)ApplianceImplImport.cpp 802-851، 1043-1053، 4169-4171ApplianceImpl.cpp 1126-1160GNU Affero GPL v3.0. راجع LICENSE. للاستخدام في مختبر loopback فقط. دون أي ضمان.