ثغرات نظام ويندوز من مايكروسوفت قد تؤدي إلى مخاطر أمان Web3
تحتوي التحديثات الأمنية التي أصدرتها مايكروسوفت الشهر الماضي على ثغرة تصعيد الامتياز win32k التي يتم استغلالها. يبدو أن هذه الثغرة موجودة فقط في الإصدارات المبكرة من أنظمة Windows، ولا يمكن تفعيلها على Windows 11.
لقد كانت استغلال هذه الثغرات مستمرة منذ فترة طويلة. في ظل التحسين المستمر للتدابير الأمنية الجديدة، نأمل في تحليل كيف يمكن للمهاجمين الاستمرار في استغلال هذه الثغرة. تم إكمال عملية التحليل هذه في بيئة Windows Server 2016.
ثغرة يوم الصفر هذه لم يتم الكشف عنها أو إصلاحها، ويمكن استغلالها من قبل الجهات الخبيثة دون أن يتم ملاحظتها، مما يجعلها مدمرة للغاية. من خلال هذه الثغرة، يمكن للقراصنة الحصول على السيطرة الكاملة على نظام Windows. قد يؤدي ذلك إلى سرقة المعلومات الشخصية، انهيار النظام، فقدان البيانات، خسائر مالية، وزرع البرمجيات الخبيثة، وغيرها من العواقب الخطيرة. بالنسبة لمستخدمي Web3، قد يتم سرقة المفاتيح الخاصة، وقد يتم نقل الأصول الرقمية. من منظور أوسع، قد تؤثر هذه الثغرة حتى على النظام البيئي الكامل لـ Web3 الذي يعمل على بنية تحتية قائمة على Web2.
من خلال تحليل التصحيح، اكتشفنا أن المشكلة تكمن في أن عدد المراجع للكائن تم معالجته بشكل زائد مرة واحدة. win32k هو كود قديم، وتعليقات المصدر القديمة تظهر أن الكود السابق كان يقوم فقط بقفل كائن النافذة، دون قفل كائن القائمة داخل كائن النافذة، مما قد يؤدي إلى الإشارة الخاطئة إلى كائن القائمة.
عند تنفيذ إثبات المفهوم ( PoC )، وجدنا أن القائمة الواردة xxxEnableMenuItem ( عادة ما يتم قفلها في الوظيفة العليا، وليس من الواضح أي كائن قائمة يجب حمايته هنا. ومن خلال التحليل الإضافي، وجدنا أن القائمة التي ترجعها دالة MenuItemState قد تكون القائمة الرئيسية لنافذة أو قد تكون قائمة فرعية أو حتى قائمة فرعية فرعية.
لإثارة الثغرة، قمنا بإنشاء هيكل قائمة مكون من أربع طبقات خاص، وحددنا بعض الشروط المحددة لتجاوز فحص دالة xxxEnableMenuItem. عند عودة دالة xxxRedrawTitle إلى طبقة المستخدم، قمنا بإزالة علاقة الإشارة بين القائمتين C و B، مما أدى إلى تحرير القائمة C بنجاح. في النهاية، عندما تعود دالة xxxEnableMenuItem إلى xxxRedrawTitle، تصبح كائن القائمة C المقرر الإشارة إليه غير صالح.
![Numen حصرية: ثغرة 0day من مايكروسوفت يمكن أن تكشف عن نظام + مستوى فيزيائي في لعبة Web3])https://img-cdn.gateio.im/webp-social/moments-171ea7cb7c6f7190c3f49a2b914eed04.webp(
عند تطوير استغلال )Exp(، أخذنا في الاعتبار بشكل أساسي خيارين: تنفيذ كود shell واستخدام العمليات الأساسية للقراءة والكتابة لتعديل عنوان token. نظرًا للاعتبارات العملية، اخترنا الخيار الثاني. يمكن تقسيم عملية الاستغلال بالكامل إلى خطوتين: كيفية استغلال ثغرة UAF للتحكم في قيمة cbwndextra، وكيفية تحقيق عمليات قراءة وكتابة مستقرة.
![Numen الحصرية: ثغرة 0day من مايكروسوفت يمكنها قلب لعبة Web3 على مستوى النظام + المستوى الفيزيائي])https://img-cdn.gateio.im/webp-social/moments-66af34ab04bec21e27be99bbe29c552a.webp(
لقد قمنا بتصميم تخطيط الذاكرة بعناية، باستخدام كائن اسم النافذة في فئة WNDClass لاحتلال كائن القائمة الذي تم تحريره. من خلال العمليات المحددة في دالة xxxRedrawWindow، حققنا أول عملية كتابة بيانات.
![Numen حصرية: ثغرة 0day من مايكروسوفت يمكنها أن تزيل نظام + المستوى الفيزيائي من لعبة Web3])https://img-cdn.gateio.im/webp-social/moments-1cc94ddafacec491507491eef9195858.webp01
لتحقيق تخطيط مستقر للذاكرة، صممنا ثلاثة كائنات HWND متتالية، وقمنا بتحرير الكائن الأوسط واستخدمنا كائن HWNDClass. تُستخدم كائنات HWND في البداية والنهاية للتحقق وتنفيذ عمليات القراءة والكتابة. كما قمنا أيضًا بتسريب عنوان مقبض النواة لتحديد بدقة ما إذا كانت ترتيب الكائنات يتوافق مع التوقعات.
في تنفيذ القراءة والكتابة للأصلي، نستخدم GetMenuBarInfo() للقراءة العشوائية، و SetClassLongPtr() للكتابة العشوائية. بخلاف عملية استبدال TOKEN، تستخدم جميع الكتابات الأخرى كائن class الخاص بأول كائن نافذة من خلال الإزاحة.
على الرغم من أن ثغرة win32k قديمة، إلا أن مايكروسوفت تحاول إعادة بناء التعليمات البرمجية الأساسية ذات الصلة باستخدام Rust، ومن المحتمل أن يتم القضاء على مثل هذه الثغرات في الأنظمة الجديدة في المستقبل. كانت عملية استغلال هذه الثغرة بسيطة نسبيًا، وكانت الصعوبة الرئيسية تكمن في كيفية التحكم في الكتابة الأولى. تعتمد هذه الثغرة بشكل كبير على تسرب عنوان مقبض كومة سطح المكتب، مما لا يزال يمثل خطرًا على الأمان في الأنظمة القديمة.
نفترض أن اكتشاف الثغرة قد يكون نتيجة لتحسينات في الكشف عن تغطية الشيفرة. بالنسبة لاكتشاف استغلال الثغرات، بالإضافة إلى مراقبة النقاط الحرجة، قد يكون الكشف المستهدف عن تخطيط الذاكرة غير الطبيعي وقراءة وكتابة بيانات النوافذ مفيدًا أيضًا في اكتشاف هذه الثغرات.
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
تهديد ثغرات نظام ويندوز لأمان الأصول في Web3 قد يؤدي إلى سرقة المفتاح الخاص
ثغرات نظام ويندوز من مايكروسوفت قد تؤدي إلى مخاطر أمان Web3
تحتوي التحديثات الأمنية التي أصدرتها مايكروسوفت الشهر الماضي على ثغرة تصعيد الامتياز win32k التي يتم استغلالها. يبدو أن هذه الثغرة موجودة فقط في الإصدارات المبكرة من أنظمة Windows، ولا يمكن تفعيلها على Windows 11.
لقد كانت استغلال هذه الثغرات مستمرة منذ فترة طويلة. في ظل التحسين المستمر للتدابير الأمنية الجديدة، نأمل في تحليل كيف يمكن للمهاجمين الاستمرار في استغلال هذه الثغرة. تم إكمال عملية التحليل هذه في بيئة Windows Server 2016.
ثغرة يوم الصفر هذه لم يتم الكشف عنها أو إصلاحها، ويمكن استغلالها من قبل الجهات الخبيثة دون أن يتم ملاحظتها، مما يجعلها مدمرة للغاية. من خلال هذه الثغرة، يمكن للقراصنة الحصول على السيطرة الكاملة على نظام Windows. قد يؤدي ذلك إلى سرقة المعلومات الشخصية، انهيار النظام، فقدان البيانات، خسائر مالية، وزرع البرمجيات الخبيثة، وغيرها من العواقب الخطيرة. بالنسبة لمستخدمي Web3، قد يتم سرقة المفاتيح الخاصة، وقد يتم نقل الأصول الرقمية. من منظور أوسع، قد تؤثر هذه الثغرة حتى على النظام البيئي الكامل لـ Web3 الذي يعمل على بنية تحتية قائمة على Web2.
من خلال تحليل التصحيح، اكتشفنا أن المشكلة تكمن في أن عدد المراجع للكائن تم معالجته بشكل زائد مرة واحدة. win32k هو كود قديم، وتعليقات المصدر القديمة تظهر أن الكود السابق كان يقوم فقط بقفل كائن النافذة، دون قفل كائن القائمة داخل كائن النافذة، مما قد يؤدي إلى الإشارة الخاطئة إلى كائن القائمة.
عند تنفيذ إثبات المفهوم ( PoC )، وجدنا أن القائمة الواردة xxxEnableMenuItem ( عادة ما يتم قفلها في الوظيفة العليا، وليس من الواضح أي كائن قائمة يجب حمايته هنا. ومن خلال التحليل الإضافي، وجدنا أن القائمة التي ترجعها دالة MenuItemState قد تكون القائمة الرئيسية لنافذة أو قد تكون قائمة فرعية أو حتى قائمة فرعية فرعية.
لإثارة الثغرة، قمنا بإنشاء هيكل قائمة مكون من أربع طبقات خاص، وحددنا بعض الشروط المحددة لتجاوز فحص دالة xxxEnableMenuItem. عند عودة دالة xxxRedrawTitle إلى طبقة المستخدم، قمنا بإزالة علاقة الإشارة بين القائمتين C و B، مما أدى إلى تحرير القائمة C بنجاح. في النهاية، عندما تعود دالة xxxEnableMenuItem إلى xxxRedrawTitle، تصبح كائن القائمة C المقرر الإشارة إليه غير صالح.
![Numen حصرية: ثغرة 0day من مايكروسوفت يمكن أن تكشف عن نظام + مستوى فيزيائي في لعبة Web3])https://img-cdn.gateio.im/webp-social/moments-171ea7cb7c6f7190c3f49a2b914eed04.webp(
عند تطوير استغلال )Exp(، أخذنا في الاعتبار بشكل أساسي خيارين: تنفيذ كود shell واستخدام العمليات الأساسية للقراءة والكتابة لتعديل عنوان token. نظرًا للاعتبارات العملية، اخترنا الخيار الثاني. يمكن تقسيم عملية الاستغلال بالكامل إلى خطوتين: كيفية استغلال ثغرة UAF للتحكم في قيمة cbwndextra، وكيفية تحقيق عمليات قراءة وكتابة مستقرة.
![Numen الحصرية: ثغرة 0day من مايكروسوفت يمكنها قلب لعبة Web3 على مستوى النظام + المستوى الفيزيائي])https://img-cdn.gateio.im/webp-social/moments-66af34ab04bec21e27be99bbe29c552a.webp(
لقد قمنا بتصميم تخطيط الذاكرة بعناية، باستخدام كائن اسم النافذة في فئة WNDClass لاحتلال كائن القائمة الذي تم تحريره. من خلال العمليات المحددة في دالة xxxRedrawWindow، حققنا أول عملية كتابة بيانات.
![Numen حصرية: ثغرة 0day من مايكروسوفت يمكنها أن تزيل نظام + المستوى الفيزيائي من لعبة Web3])https://img-cdn.gateio.im/webp-social/moments-1cc94ddafacec491507491eef9195858.webp01
لتحقيق تخطيط مستقر للذاكرة، صممنا ثلاثة كائنات HWND متتالية، وقمنا بتحرير الكائن الأوسط واستخدمنا كائن HWNDClass. تُستخدم كائنات HWND في البداية والنهاية للتحقق وتنفيذ عمليات القراءة والكتابة. كما قمنا أيضًا بتسريب عنوان مقبض النواة لتحديد بدقة ما إذا كانت ترتيب الكائنات يتوافق مع التوقعات.
في تنفيذ القراءة والكتابة للأصلي، نستخدم GetMenuBarInfo() للقراءة العشوائية، و SetClassLongPtr() للكتابة العشوائية. بخلاف عملية استبدال TOKEN، تستخدم جميع الكتابات الأخرى كائن class الخاص بأول كائن نافذة من خلال الإزاحة.
على الرغم من أن ثغرة win32k قديمة، إلا أن مايكروسوفت تحاول إعادة بناء التعليمات البرمجية الأساسية ذات الصلة باستخدام Rust، ومن المحتمل أن يتم القضاء على مثل هذه الثغرات في الأنظمة الجديدة في المستقبل. كانت عملية استغلال هذه الثغرة بسيطة نسبيًا، وكانت الصعوبة الرئيسية تكمن في كيفية التحكم في الكتابة الأولى. تعتمد هذه الثغرة بشكل كبير على تسرب عنوان مقبض كومة سطح المكتب، مما لا يزال يمثل خطرًا على الأمان في الأنظمة القديمة.
نفترض أن اكتشاف الثغرة قد يكون نتيجة لتحسينات في الكشف عن تغطية الشيفرة. بالنسبة لاكتشاف استغلال الثغرات، بالإضافة إلى مراقبة النقاط الحرجة، قد يكون الكشف المستهدف عن تخطيط الذاكرة غير الطبيعي وقراءة وكتابة بيانات النوافذ مفيدًا أيضًا في اكتشاف هذه الثغرات.