
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 يكون قرصه واصف VMDK متناثرًا (sparse) بالإضافة إلى امتداد FLAT، يفتح مسارًا على المضيف مذكورًا في ذلك الامتداد وينسخ تلك البايتات إلى القرص المستورد. بعد vmdkParseDescriptor، يُستخدم كل امتداد يبدأ فيه pszBasename بـ RTPATH_SLASH كما هو؛ وإلا فيُستخدم RTPathJoinA(descriptor dir, pszBasename) الذي يتبع ../. ثم يقوم FLAT وHOSTED_SPARSE بـ vmdkFileOpen على ذلك المسار الكامل. أما streamOptimized (تصدير VirtualBox المعتاد، سحر VMDK) فهو ملف واحد ولا يخضع لهذا المسار. ومع ذلك لا يزال الاستيراد يقبل المحدد المتناثر.
| المعرّف | لا يوجد CVE بعد |
| الفئة | قراءة ملف (مسار امتداد FLAT/sparse في VMDK المتناثر) |
| الوصول | محلي (المضيف) 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. ضع واصف VMDK متناثرًا (# Disk DescriptorFile، createType="monolithicFlat") بجوار امتداد FLAT يكون اسمه الأساسي المقتبس ../../somewhere/secret أو /path/secret. المشغّل الذي يستورده يفتح ذلك المسار على المضيف بمعرّف المستخدم (UID) الذي يقوم بالاستيراد وينسخ البايتات إلى القرص الوجهة. أما streamOptimized (سحر VMDK 0x564D444B) فلا يستشير اسم FLAT المضمّن. هذه قراءة لملفات يمكن لمستخدم VBox UID فتحها، وليست كتابة خالية من اللاحقة إلى authorized_keys.
| الصلاحية | الطريقة + نقطة الوصول | ما الذي يمنحه | المصدر |
|---|---|---|---|
| استطلاع | استيراد قرص VMDK متناثر ASCII. بعد vmdkParseDescriptor، يتم استدعاء RTPathJoinA(descriptor dir, pszBasename) دون طي ../ (VMDK.cpp 3472-3503). ثم vmdkFileOpen بنمط FLAT على المسار الكامل. ينسخ الاستيراد تلك البايتات إلى الوجهة. | بايتات ملف المضيف المسمى بواسطة ../ تصل إلى القرص المستورد. في المختبر، تم ضم 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) |
| استطلاع | streamOptimized مع سحر VMDK. يأخذ vmdkDescriptorRead المسار vmdkDescriptorReadSparse. FLAT ASCII المضمّن سمّى الـ oracle. | لم يفتح الاسم المضمّن. بقيت الوجهة ملف التدفق (STREAMOPTIMIZED-SELF-NOT-ORACLE). | مُثبت مختبريًا (streamoptimized-consults-extent=no) |
| استطلاع | بدء الضيف، ثم قراءة الحجم المحوّل. | يرى الضيف محتويات ملف المضيف القابلة للقراءة بواسطة UID المستورد والتي وصلت إلى الوجهة. | مستنتج (نفس النسخ؛ المختبر لا يُقلع ضيفًا) |
| الإتاحة | وجهة استيراد موجودة مسبقًا، أو ربط لاحق للقرص المحوّل. | إتاحة الكتابة فوق قرص الوجهة. تصبح المحتويات هي ملف المضيف المفتوح. | مستنتج (نفس الكتابة إلى الوجهة) |
| مغلق | VMDK بنمط streamOptimized (تصدير VirtualBox المعتاد) | فرع السحر. ملف واحد. لا يُفتح اسم FLAT المضمّن. | مغلق |
| مغلق | مسار مطلق بحرف محرك أقراص Windows (C:\...) | قد يفوّت pszBasename[0] == RTPATH_SLASH. يصف الكود فحص المسار المطلق بأنه حل مؤقت (@todo implement proper path absolute check). | مغلق |
| مغلق | كتابات بلا لاحقة (authorized_keys، crontab) | ليست من بقايا الكتابة. فتح الامتداد هو قراءة للمسار المسمى في المضيف. | مغلق |
| مغلق | نواة المضيف، من الضيف إلى المضيف، أجهزة افتراضية أخرى، ذاكرة VBoxSVC | ليست هذه البقايا. لا يلزم بدء جهاز افتراضي للنسخ. نفس UID الخاص بالمستورد. | مغلق |
OVA هو نفس المسار بمجرد أن يكون الوصف المتناثر على القرص: يوفر عضو tar الوصف بالإضافة إلى FLAT (اختياري) داخل المجلد؛ ويوفر اسم الامتداد الأساسي الفتح المُهرَّب. لا 3D، ولا Guest Additions، ولا VRDP، وليس PUEL.
بقيت على الوسم v7.2.20 (f2792cf44) بعد تحديث CPU لشهر سبتمبر 2026 وقرأت استيراد VMDK. ExtraData والمجلدات المشتركة ووجهة NVRAM وRawFile التسلسلي تمت إزالتها بالفعل. وجهة ovf:href هي بقايا شقيقة. تصدير 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 ويُبقي الملف المفتوح مسبقًا كامتداد. ASCII يأخذ vmdkDescriptorReadAscii والربط أعلاه.
المنعطفات الخاطئة المسجّلة مسبقًا: معاملة streamOptimized على أنه هذه البقايا (السحر لا يستشير اسم FLAT المضمّن)؛ معاملة مسار مطلق بحرف محرك أقراص Windows كفحص الشرطة المائلة في Unix؛ معاملة الكتابة فوق قرص الوجهة ككتابة authorized_keys خالية من اللاحقة؛ إقلاع جهاز ظاهري عندما يكون مصدر تسخير الربط كافيًا. المسرح: نواة المضيف، من الضيف إلى المضيف. الأوراكل هو سطر شاهد خارج مجلد الوصف بالإضافة إلى disk-flat.vmdk تحكّمي بقي في مكانه.
python3 vbox-vmdk-sparse-extent-Abraxas-Labs.py
أو
cd lab
./run.sh
حزمة مصدر اختبار vmdkParseDescriptor لضم الامتدادات، وvmdkFileOpen، وفرع السحر streamOptimized. Docker compose، loopback 127.0.0.1:19250، بدون ملف VirtualBox التنفيذي. دليل الوصف /work/import/disk. Oracle /work/oracle. الوجهة /work/import/out.vmdk.
SUCCESS vbox-vmdk-sparse-extent relative-escape=yes absolute-extent=yes control-in-folder=yes VBOX-VMDK-SPARSE-EXTENT-WITNESS
قم بطي أو رفض .. في pszBasename. ارفض pszBasename المطلق. أو افتح النطاقات فقط تحت دليل الواصف (RTPATHABS_F_STOP_AT_BASE / realpath-under-base). لا تعامل pszBasename[0] == RTPATH_SLASH كفحص مطلق كامل.