
VirtualBox 7.2.20 - عالية - محلية - قراءة ملف - OVF NAT TFTP بادئة فارغة
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vbox-ovf-nat-tftp-prefix
الفئة: قراءة ملفات الوصول: محلي (من الضيف) بعد استيراد يتطلب UI:R
Oracle VM VirtualBox OSS 7.2.20 (f2792cf44) - Oracle
يقوم استيراد vbox:Machine OVF بتعقيم ExtraData والمجلدات المشتركة ومسار NVRAM وserial RawFile. لكنه لا يمس أبدًا enable-tftp الخاص بـ NAT ولا @prefix الخاص بـ TFTP. يعطّل libslirp بروتوكول TFTP فقط عندما يكون tftp_prefix مساويًا لـ NULL. يبقى g_strdup("") في DrvNAT غير NULL. طلب RRQ من الضيف لـ etc/passwd مع بادئة / أو بادئة فارغة يصبح /etc/passwd. لا يزال ../ في اسم الضيف مرفوضًا.
استيراد NAT TFTP ببادئة فارغة أو / يتيح للضيف إرسال RRQ لملفات المضيف بصلاحيات UID الخاص بـ VBox. ليس كتابة. ليس نواة المضيف. ليس من بقايا فحص ../ المغلق.
| المعرّف | لا يوجد CVE بعد |
| الفئة | قراءة ملفات (RRQ عبر TFTP من الضيف لمسارات المضيف) |
| الوصول | محلي (من الضيف) بعد استيراد UI:R لملف vbox:Machine OVF، ثم تشغيل الآلة الافتراضية |
| CWE | CWE-22 من بقايا فئة البادئة CVE-2022-21394 |
| 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) |
| المصادقة | لا شيء في الضيف؛ يجب على مستخدم المضيف أن يستورد ثم يشغّل |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | أداة اختبار من المصدر؛ compose على loopback؛ لا يتم إقلاع VirtualBox |
تسليم ملف vbox:Machine OVF/OVA تحتوي كتلة NAT فيه على enable-tftp وبادئة TFTP تساوي / أو فارغة، بالإضافة إلى قرص ضيف يُصدر طلبات TFTP RRQ إلى بوابة NAT (10.0.2.2:69). يستورد مستخدم المضيف الملف (File / Import أو VBoxManage import) ثم يشغّل الآلة الافتراضية. يمسح الاستيراد ExtraData والمجلدات المشتركة وserial RawFile ومسار NVRAM. تبقى حقول TFTP. عند التشغيل، يُدرج ConsoleImplConfigCommon قيمة EnableTFTP. تُحذف البادئة الفارغة من CFGM؛ عندها يجعل DrvNAT القيمة الافتراضية لـ TFTPPrefix مساوية لـ "" ويطبّق عليها g_strdup. يعامل libslirp ذلك على أنه مفعّل.
هذه هي مجموعة الصلاحيات الكاملة. لا يوجد هنا أي كتابة على المضيف، ولا أي بدائية heap في عملية الآلة الافتراضية، ولا أي هروب من النواة.
| الطريقة | الموقع | الصلاحية |
|---|---|---|
RRQ عبر TFTP لـ oracle/VBOX-OVF-NAT-TFTP-PREFIX-WITNESS مع بادئة مستوردة "" | tftp_handle_rrq في libslirp ثم RTFileOpen للبادئة + / + اسم الضيف | مُثبت مختبريًا. تبقى البادئة الفارغة غير NULL. المسار المبني هو /oracle/VBOX-OVF-NAT-TFTP-PREFIX-WITNESS. أعاد الفتح للقراءة فقط بايتات الشاهد. |
RRQ عبر TFTP للاسم نفسه مع بادئة مستوردة / | نفسه | مُثبت مختبريًا. المسار المبني هو //oracle/...، وهو مطابق POSIX لـ /oracle/.... أُعيدت بايتات الشاهد. |
نظير المسار فقط لطلب RRQ من الضيف لـ etc/passwd مع بادئة فارغة | "" + "/" + "etc/passwd" | بناء مسار مُثبت مختبريًا. النتيجة هي /etc/passwd. لا يفتح المختبر /etc الخاص بالمضيف. |
RRQ عبر TFTP لأي اسم نسبي يستطيع UID الخاص بـ VBox فتحه (مفاتيح home، VirtualBox.xml، /etc الخاص بالمضيف، جذر القرص الحالي في Windows) | نفس RTFileOpen | مُستنتج. نفس الدمج. تبقى الملفات التي لا تستطيع العملية فتحها مغلقة (File not found). |
| الطريقة | الصلاحية |
|---|---|
| WRQ عبر TFTP | مغلق. خادم TFTP هذا مخصص لـ RRQ فقط. لا يوجد معالج كتابة. |
| الكتابة فوق ملف المضيف / إنشاؤه | مغلق. RTFILE_O_READ للقراءة فقط. |
| heap عملية الآلة الافتراضية، VBoxSVC، آلات افتراضية أخرى، نواة المضيف | مغلق. هذه البقايا هي فتح ملف لمسار مبني. |
| حجب الخدمة عبر TFTP | خارج النطاق. |
fEnableTFTP على false (مُنشئ NATEngine في Settings.cpp).VBoxNetSlirpNAT دائمًا بتعيين tftp_path إلى <VirtualBox home>/TFTP عندما يكون home موجودًا. تبقى طلبات RRQ تحت ذلك البادئة.../ والشرطة المائلة اللاحقة / لا يزالان يُنتجان "Access violation". ذلك هو مسار CVE-2022-21394 المُغلق./work/tftp/boot.pxe في المختبر).المضيف الحقيقي الذي يستورد هذا الجهاز ويشغّل الآلة الافتراضية يمنح الضيف قراءة أي مسار يستطيع UID الخاص بـ VBox فتحه. المختبر هو أداة مصدرية لتلك المسيرة. لا يتم إقلاع VirtualBox.
ثبّتُّ VirtualBox/virtualbox v7.2.20 (f2792cf44). عمليات بحث NAT وOVF. غيّرت 7.2 NAT إلى libslirp 4.9.3 المضمّن. احترام المجلدات المشتركة من .ova يُعامَل بالفعل كخطر ويُجرَّد. لم يكن TFTP على تلك القائمة.
لا يزال Settings.cpp يقرأ NAT enable-tftp وTFTP/@prefix عند استيراد vbox:Machine:
elmMode.getAttributeValue("enable-tftp", nic.nat.fEnableTFTP);
// ...
pelmTFTP->getAttributeValue("prefix", nic.nat.strTFTPPrefix);
ApplianceImplImport.cpp:6147 ينقّي كل ما تذكّروا تنظيفه:
config.sanitizeImportedSerialPorts();
config.sanitizeSharedFolderSettings();
config.sanitizeImportedNvramSettings();
if (!m->optListImport.contains(ImportOptions_KeepExtraData))
config.sanitizeImportedExtraData();
تلك الكيانات الأربعة لا تذكر strTFTPPrefix أو fEnableTFTP أبدًا.
عند بدء التشغيل، يُدرج ConsoleImplConfigCommon.cpp:2286-2292 المفتاح TFTPPrefix فقط عندما يكون غير فارغ ويُدرج دائمًا EnableTFTP. ويضبط DrvNAT.cpp:1656-1665 القيمة الافتراضية لـ EnableTFTP على true بالنسبة للأجهزة الافتراضية القديمة التي تحذف المفتاح، ثم:
rc = pDrvIns->pHlpR3->pfnCFGMQueryStringAllocDef(pCfg, "TFTPPrefix", &pszTmp, "");
slirpCfg.tftp_path = pszTmp;
slirp.c:698 هو g_strdup. الفارغ يبقى غير NULL. tftp.c:353-357 يعطّل فقط عند NULL. 364-370 يضيف البادئة، /، اسم الضيف. 398-407 يرفض ../. ثم RTFileOpen للمسار المبني.
المنعطفات الخاطئة المسجّلة مسبقًا: معاملة ../ الخاص بالضيف على أنه المتبقي (CVE-2022-21394، لا يزال مرفوضًا)؛ معاملة الأجهزة الافتراضية الجديدة الافتراضية على أنها متأثرة؛ معاملة home/TFTP الخاص بـ NAT Network على أنه هذا المتبقي؛ الادعاء بكتابات WRQ؛ الادعاء بنواة المضيف. المسرح: فتح /etc/passwd الخاص بالمضيف. الأوراكل هو ملف شاهد تحت /oracle.
python3 vbox-ovf-nat-tftp-prefix-Abraxas-Labs.py
أو
cd lab
./run.sh
مصدر أداة التثبيت الخاصة بمعقّمات pin، والقيمة الافتراضية للسلسلة الفارغة في DrvNAT، وg_strdup، وtftp_handle_rrq في libslirp. مشروع Docker compose باسم vbox-ovf-nat-tftp-prefix. على loopback فقط. لم يتم إقلاع VirtualBox. تم زرع الشاهد VBOX-OVF-NAT-TFTP-PREFIX-WITNESS في /oracle/.... ملف PXE التحكمي هو /work/tftp/boot.pxe. السطر الأخير:
SUCCESS vbox-ovf-nat-tftp-prefix sanitize-miss=yes null-disable=yes empty-prefix-read=yes slash-prefix-read=yes dotdot-reject=yes VBOX-OVF-NAT-TFTP-PREFIX-WITNESS