
CVE-2021-43229 دليل تشغيل
ثغرة رفع الامتياز في Windows NTFS
مميزة عن:
التصحيح: 14 ديسمبر 2021
وفقًا لـ @AravGarg3 على Twitter، يبدو أن CVE-2021-43229 قابل للاستغلال ومرتبط بـ فيضان عدد صحيح.
المصدر: https://twitter.com/AravGarg3/status/1479447843458863104
| الإصدارات الفرعية من Windows 10 | تواريخ الإصدار |
|---|---|
| 1387 | 11/22/2021 |
| 1415 | 12/14/2021 |
باستخدام BinDiff مع IDA Pro، نتائج مقارنة التصحيح مع التغييرات التالية:
يبرز ثلاثة مرشحين في المقدمة:
وفقًا لـ دليل تحديث الأمان من Microsoft لشهر ديسمبر، أربعة CVEs مرتبطة بـ NTFS:
يبدو أن CVE-2021-43240 مرتبط بـ NtSetShortNameInfo.
جميع NtfsRenameToPrivateDir و TxfAllocateAndStoreNameForTxLogging و TxAllocateFullFilePathForChangeNotify لديهم نفس التحقق الجديد من الطول، ويبدو أنهم مرتبطون بـ CVE-2021-43229 و CVE-2021-43230 و CVE-2021-43231، وليس بالضرورة بهذا الترتيب. حاليًا، ليس من الممكن معرفة أي منها، Microsoft بخيلة قليلاً بشأن هذه المعلومات.
في جميع CVEs الثلاثة، يحدث فيضان عدد صحيح أثناء حساب حجم التخصيص (طول مسار الدليل + طول اسم الملف)، مما يؤدي إلى تجاوز سعة المخزن المؤقت القائم على التجمّع مع memmove التاليين لمسار الدليل واسم الملف.
NtfsRenameToPrivateDirالمسار إلى NtfsRenameToPrivateDir موضح أدناه:
NtfsCommonSetInformation
|__________________
| |
v v
NtfsSetLinkInfo NtfsSetRenameInfo
|__________________|
|
v
NtfsRemoveSupersededTarget
|
v
NtfsRenameToPrivateDir
أولاً، لاستدعاء NtfsCommonSetInformation، فقط قم باستدعاء NtSetInformationFile. ثم، للمرور عبر NtfsSetLinkInfo و NtfsSetRenameInfo، استخدم FileLinkInformationEx و FileRenameInformationEx على التوالي كفئة معلومات الملف في NtSetInformationFile.
للوصول إلى NtfsRemoveSupersededTarget عبر NtfsSetRenameInfo، من الضروري تعيين علامات FILE_RENAME_REPLACE_IF_EXISTS و FILE_RENAME_POSIX_SEMANTICS. أعد تسمية ملف باسم ملف موجود للوصول إلى NtfsRemoveSupersededTarget. بالنسبة لـ NtfsRenameToPrivateDir، الأمر صعب بعض الشيء، لأن الملف المستبدل يجب أن يكون مفتوحًا بواسطة أي عملية.
لسوء الحظ، يتم إجراء فحص الطول قبل استدعاء NtfsRemoveSupersededTarget.
الطريقة مع NtfsSetLinkInfo مشابهة لـ NtfsSetRenameInfo، فقط أسماء العلامات تختلف، ومعانيها لا تزال كما هي. ولكن مثل NtfsSetRenameInfo، يتم إجراء فحص آخر قبل استدعاء NtfsRemoveSupersededTarget.
TxfAllocateAndStoreNameForTxLoggingالمسار إلى TxfAllocateAndStoreNameForTxLogging موضح أدناه:
NtfsCommonCreate
|
v
NtfsCreateNewFile
|
v
TxfNewFileCreate
|
v
TxfAllocateAndStoreNameForTxfLogging
أولاً، لاستدعاء NtfsCommonCreate، فقط قم باستدعاء CreateFile.
الوظيفة TxfNewFileCreate مسبوقة بـ Txf والتي تعني "Transactional NTFS" ويتم استدعاؤها عند إنشاء ملف معاملات. يتم استدعاء TxfAllocateAndStoreNameForTxfLogging أثناء العملية لتخزين مسار الملف المعامل.
استدعاءان فقط ضروريان:
الكود القابل للثغرة لـ TxfAllocateAndStoreNameForTxLogging موضح أدناه:
...
and di, 2
add di, [rsi+UNICODE_STRING.Length] ; File name
add di, [rsp+68h+RelativeNormalizedDirectoryPath.Length] ; OVERFLOW HERE
cmp [rsp+68h+arg_20], r12b
jnz loc_16592C
movzx edx, di
add rdx, size UNICODE_STRING ; NumberOfBytes
mov ecx, cs:PoolType
or ecx, 10h ; PoolType
mov r8d, 'afxT' ; Tag
call cs:__imp_ExAllocatePooliWthTag
...
من أجل تفعيل الفيضان، من الضروري إنشاء ملف بطول زائد، أكثر من 0xFFFF بايت (32767 حرفًا).
المشكلة التي تظهر هي أن اسم الملف أو الدليل لا يمكن أن يكون أكبر من 256 حرفًا - بما في ذلك حرف NULL. لحل هذه المشكلة، سيكون استخدام المجلدات الفرعية العميقة ضروريًا. بشكل غريب، ليس الأمر سهلاً للغاية، حتى مع إنشاء المجلدات الفرعية بنجاح، لا يمكن إنشاء الملف الفرعي، بالتأكيد بسبب بعض الفحوصات التي تم إجراؤها مسبقًا.
باستخدام شريط explorer يمكن ملاحظة التنسيق المستخدم لعرض مسار الدليل. ليس ما توقعته، فبدلاً من استخدام مسار "كلاسيكي"، يستخدم explorer التنسيق القديم لـ DOS، التنسيق القصير 8.3.
الاحتفاظ بإنشاء المجلدات الفرعية كما كان من قبل واستخدام الاسم القصير للمجلدات الفرعية أثناء إنشاء الملف يقوم بالمهمة.
من المهم ملاحظة أنه سيتم إضافة 16 بايت إلى الحجم المفيض، وهو حجم UNICODE_STRING الذي سيمثل المسار النهائي. وذلك لأن الذاكرة المطلوبة ستحتوي على UNICODE_STRING متبوعًا بمخزن هذا UNICODE_STRING.
الطريقة:
الظروف الحالية:
تقرير مثير من Synacktiv في SSTIC 2020 يمكن أن يكون فكرة للاستكشاف، من خلال استهداف VS Heap.
تم تقديم CVE-2020-17087، حالة مماثلة من الاستغلال، بواسطة PixiePoint Security باستخدام التقنية المذكورة أعلاه.
| Simi | Conf | Function | Info |
|---|
| NOK | 0.98 | 0.99 | NtfsCommonSetInformation$fin$0 | تعديلات القفز |
| 0.97 | 0.99 | NtSetShortNameInfo | ||
| 0.96 | 0.99 | NtfsUpdateSecurity | ||
| NOK | 0.91 | 0.94 | NtfsRenameToPrivateDir$fin$1 | تعديلات القفز |
| 0.89 | 0.98 | NtfsInitializeFileInDirectory | ||
| OK | 0.88 | 0.95 | TxfAllocateAndStoreNameForTxLogging | فحص الطول |
| OK | 0.87 | 0.93 | NtfsRenameToPrivateDir | فحص الطول |
| OK | 0.81 | 0.95 | TxfAllocateFullFilePathForChangeNotify | فحص الطول |
| 0.76 | 0.94 | NtfsCommonSetInformation |