
تحليل السبب الجذري لثغرة CVE-2026-54107: استخدام بعد التحرير (use-after-free) في win32kfull.sys بنظام Windows، مع تصحيح أخطاء حالة السباق، والتحليل الساكن، ورؤى فرز MSRC، وبحث عملي في استغلال النواة.
ValidateHwnd بوابة: التحليل الجذري لـ CVE-2026-54107استخدام بعد التحرير (use-after-free) في إدارة دورة حياة النوافذ في
win32kfull.sys— كيف وجدته، وكيف أقنعت نفسي بأنه حقيقي، وكيف بدت عملية MSRC فعليًا من منظور الباحث.
كانت الساعة تقترب من الثانية صباحًا عندما توقفت الآلة الافتراضية المستهدفة عن الاستجابة لنبض المُنقِّح (debugger) وسقطت في نقطة توقف عند التعليمات التي قضيت أسابيع أُثبت أنها قابلة للوصول بالضبط. لم يكن تأكيدًا، ولا توقفًا بسبب تلف تجمّع — بل انتهاك وصول بسيط في مسار توزيع الرسائل، أثناء فك إشارة كائن كان قد هُدم بالفعل بواسطة خيط آخر.
تلك النقطة أصبحت CVE-2026-54107، الحالة 11xxxxx لدى MSRC، وتم إصلاحها في عبر 27 منتجًا من منتجات Windows.
kd> !pool 2هذا المنشور هو النصف غير الخاضع لقيود النشر من القصة: السبب الجذري، ولماذا هذه الفئة من الثغرات على ما هي عليه، والمنطق الذي أوصلني إليها. تبقى تفاصيل الاستغلال خارج النطاق.
Win32k هو النصف الذي يعمل في وضع النواة من النظام الفرعي الرسومي في Windows. إنه قديم، وضخم، والأهم من ذلك — أنه يمكن الوصول إليه من سياقات من المفترض أن تكون غير موثوقة. هذه الخاصية الأخيرة هي السبب في بقائه هدفًا دائمًا للبحث على الرغم من عشرين عامًا من أعمال التحصين والتصفية وتقييد استدعاءات النظام.
داخل win32k، يكون كائن tagWND (PWND) مثيرًا للاهتمام بشكل غير عادي لأن عمره يُدار بأكثر من آلية واحدة في الوقت نفسه. النافذة هي:
ValidateHwnd،أي كائن له عدة مسارات إسناد مستقلة ومسار تدمير مشترك واحد يستحق القراءة بتمعن. هذا ليس ادعاءً بوجود ثغرة — بل هو استدلال إرشادي حول أين تستثمر وقتك.
ما جعلني أتوقف عند هذا المكوّن هو سطح الاستيراد. يستورد win32kfull.sys ثلاث بدائيات مرجعية كائنات مميزة من ntoskrnl:```c
NTSTATUS ObReferenceObjectByPointer(
void *Object,
uint32_t DesiredAccess,
POBJECT_TYPE ObjectType,
char AccessMode);
NTSTATUS ObReferenceObjectByHandle( HANDLE Handle, uint32_t DesiredAccess, POBJECT_TYPE ObjectType, char AccessMode, void **Object, OBJECT_HANDLE_INFORMATION *HandleInformation);
NTSTATUS ObReferenceObjectByName(/* ... */);
ثلاث طرق للدخول، ومسار واحد للخروج عبر `ObfDereferenceObject`.
هذا لا يعني أن الكود خاطئ. إنه يعني أن **الخاصية الثابتة (invariant) موزّعة** — لا توجد دالة واحدة تملك *"هذا الكائن حي الآن،"* لذا تعتمد الصحة على اتفاق كل مستدعي على أي مرجع يحملونه وإلى متى يظل صالحًا.
الثوابت الموزّعة هي المكان الذي تعيش فيه حالات السباق، لأن السباق ليس أبدًا خللًا منطقيًا يمكنك رؤيته في دالة واحدة. بل هو خلل في افتراض مشترك عبر دالتين.
لذلك السؤال الذي بدأت أطرحه على كل دالة تلامس `PWND` لم يكن *"هل هذا الكود صحيح؟"* بل:
> **إذا نُفِّذ جسم هذه الدالة نفسه على خيطين بفارق بضع تعليمات، فأيُّهما يكون على خطأ؟**
## 3. السبب الجذري
الخلل هو **فجوة وقت-الفحص / وقت-الاستخدام (time-of-check / time-of-use) التي تقع بين تحرير المرجع وتفكيك الكائن** في مسار تدمير النافذة، دون مزامنة كافية مع مستهلك متزامن يتحقق من صحة المقبض.
عند تجريده إلى شكله الأساسي:```c
/* Thread A — teardown */
NtUserDestroyWindow(HWND hwnd)
{
PWND pWnd = ValidateHwnd(hwnd);
if (pWnd) {
ObfDereferenceObject(pWnd); /* reference released */
/* <-- race window: object may become reclaimable here */
FreeWindowObject(pWnd); /* teardown proceeds on a pointer
no longer guaranteed live */
}
}
لم يتم توفير أي نص في الإدخال (INPUT) لترجمته. يرجى إرسال المحتوى المطلوب ترجمته.```c /* Thread B — consumer, concurrent / NtUserMessageCall(HWND hwnd, UINT msg, ...) { PWND pWnd = ValidateHwnd(hwnd); / may resolve a handle whose object is mid-teardown */
if (pWnd->fnid == FNID_BUTTON) /* use-after-free */
...
}
يجب أن يتحقق أمران حتى يكون لهذا أهمية، وقد تحقق كلاهما:
**(أ) النافذة حقيقية.** `ValidateHwnd` هي البوابة التي يُفترض أن تجعل الوصول المعتمد على المقابض آمنًا. إذا كان التحقق يمكن أن ينجح ضد كائن بدأ تفكيكه بالفعل، فهذه البوابة ليست بوابة — بل اقتراح.
**(ب) الذاكرة المحررة قابلة للتأثير من قِبل المهاجم.** الحقول التي تُقرأ مباشرة بعد التحقق تتضمن `fnid`، الذي يوجّه توزيع الرسائل. قرار التوزيع المُتخذ من ذاكرة مستعادة هو الفرق بين *"انهيار غير موثوق"* و*"انتهاك لحدود الأمان"*. هذا التمييز هو السبب الكامل لكون هذا CWE-362 مع تأثير تصعيد الصلاحيات (EoP) وليس خلل استقرار.
> إن **الفساد** الملاحظ هو استخدام بعد التحرير (use-after-free)؛ أما **السبب** فهو CWE-362، وهو تنفيذ متزامن يستخدم موردًا مشتركًا دون مزامنة صحيحة. هاتان عبارتان مختلفتان وMSRC تهتم بالثانية. **أبلغ عن السبب، وليس العرض فقط.**
### لماذا سباقات win32k أصعب هيكليًا مما تبدو
إذا كنت قد سبقت خللًا في أنظمة فرعية أخرى، فسوف يُحبِطك win32k، لأن البنية تقاومك بثلاث طرق محددة.
**النوافذ لها تقارب مع الخيوط (thread affinity).** تنتمي النافذة إلى الخيط الذي أنشأها. جزء كبير من النظام الفرعي مبني على افتراض أن الخيط المالك هو من يلمس الكائن، مما يعني أن النهج الساذج "أدر خيطين يستدعيان نفس الواجهة البرمجية" غالبًا لا يُحدث أي تداخل — أنت لا تخلق سباقًا، بل تخلق طابور انتظار. جعل مسارين يصطدمان فعليًا على نفس الكائن يتطلب فهم العمليات التي تنفذ فعليًا على خيط المتصل مقابل تلك التي تُمرَّر إلى خيط المالك.
**توزيع الرسائل يفرض تسلسلًا جزئيًا عليك.** الإرساليات (Sends) والمنشورات (Posts) تتصرف بشكل مختلف، والتوزيع عبر الخيوط يختلف عن التوزيع داخل نفس الخيط مجددًا. بعض ما يبدو فرصة للتوازي يُحوَّل بصمت إلى عملية مرتبة قبل أن يصل حتى إلى الكود الذي يهمك. إذا كنت لا تعرف أي فئة يقع فيها محفزك، فستستنتج أن السباق الحقيقي غير قابل للوصول — وهي نتيجة سلبية كاذبة تبدو مطابقة لـ"لا خلل هنا".
**القسم الحرج مختبئ في المتصل.** يعمل جزء كبير من النظام الفرعي تحت قفل خشن (coarse lock) يُكتسب أعلى بكثير من الدالة التي تنظر إليها. هذا هو أكبر مصدر وحيد لإهدار الوقت في تدقيق win32k: دالة لا تحتوي على أي مزامنة مرئية لكنها آمنة تمامًا لأن كل مسار إليها مُسلسَل بالفعل. **تغطية القفل خاصية عابرة للإجراءات.** يجب أن تصعد في مخطط الاستدعاءات، لا أن تقرأ الدالة فحسب.
تلك النقطة الثالثة هي السبب في أن *"لا يوجد قفل في هذه الدالة"* لا تساوي شيئًا تقريبًا كإشارة، والسبب في أن معظم العمل في هذا البحث أُنفق على قابلية الوصول بدلاً من العيب نفسه.
## 4. لماذا تقييم الأثر هو ما هو عليه
قيّمت MSRC هذا بأنه **مهم، تصعيد صلاحيات، CVSS 8.8، ناقل هجوم محلي، مصادق عليه.** هناك خاصيتان تدفعان إلى ذلك:
**قابلية الوصول من مستوى نزاهة منخفض.** سطح استدعاءات رسائل Win32k قابل للوصول من سياقات أدنى بكثير من SYSTEM. هذا ما يجعله ذا صلة بسلاسل الهروب من العزل (sandbox-escape) — فالعملية التي أنجزت تنفيذ كود داخل صندوقها الرملي ما تزال تستطيع الوصول إلى هذا السطح. خطورة خلل النواة هي غالبًا دالة لـ*من يمكنه لمسه*، وليس مدى ذكاء الفساد.
**فساد يؤثر على التوزيع.** إفساد حقل يعمل عليه `switch` أسوأ نوعيًا من إفساد حقل يُسجَّل فقط. الأول يحول خلل ذاكرة إلى مسألة تدفق تحكم.
أريد أن أكون دقيقًا هنا بشأن شيء ما، لأنني رأيت منشورات أول CVE تبالغ في هذا: **أنا أثبتُ السباق والاستخدام بعد التحرير. لم أنتج استغلالًا مسلحًا على مستوى SYSTEM.** إطار الهروب من العزل يصف *فئة السلسلة* التي ينتمي إليها هذا النوع من الخلل ولماذا هذا السطح قيّم — إنها حجة حول قابلية الوصول، وليست ادعاءً بأنني بنيت واحدة. المبالغة في الأثر هي أسرع طريقة لحرق المصداقية لدى البائع، وتقييم MSRC هو الرقم المهم، وليس تقييمي.
## 5. التفنيد جاء أولاً — معظم المرشحين سقطوا
الجزء الذي لا يكتب عنه أحد: لم يكن هذا المرشح الأول. بل كان هو الذي نجا.
قاعدتي العملية هي أن **المرشح مذنب حتى تثبت إدانته.** كل نمط واعد يحصل على سبب محدد ومكتوب يوضح لماذا *لا* ينبغي أن يكون قابلاً للاستغلال، وأذهب لأثبت ذلك السبب قبل أن أحاول تشغيله. المرشحون الذين أغلقته قبل هذا تضمنوا:
- مسارات بدت غير متزامنة لكنها كانت مُسلسَلة بقفل يُكتسب إطارًا واحدًا للأعلى،
- مسارات كان فيها الكائن "المحرَّر" مخزَّنًا مؤقتًا فعليًا بدلاً من تحريره،
- مسارات كانت حقًا بها سباق لكنها غير قابلة للوصول من أي متصل يمكن لمستخدم منخفض الصلاحيات تشغيله.
كل واحد من تلك كان نتيجة *لم أرسلها* إلى MSRC. هذه هي النقطة. إنتاجية الباحث ليست عدد المرشحين الذين يولدهم — بل مدى سرعة قتل المرشحين الخاطئين حتى لا يظل ممسكًا بهم في الثانية بعد منتصف الليل.
**الأسئلة الثلاثة التي قتلت معظم المرشحين:**
1. **هل أي شيء فوقي يحمل قفلًا؟** عابر للإجراءات، وليس محليًا. غياب القفل في دالة لا يعني شيئًا.
2. **هل يمكن لمتصل غير مميز الوصول فعليًا إلى الجانبين؟** السباق بين مسارين يتطلبان مستويين مختلفين من الصلاحيات ليس سباقًا، بل تجربة فكرية.
3. **هل الذاكرة المحررة قابلة للاستعادة في نافذة يمكنني التأثير عليها؟** إذا اكتمل الإنهاء (teardown) بشكل ذري لأغراض عملية، فلا يوجد خلل يستحق الإبلاغ.
## 6. التحقق: التحليل الساكن يعطي فرضيات، والمصحح يعطي الحقيقة
التحليل الساكن لـ `win32kfull.sys` أعطاني الفرضية. لم يكن بإمكانه أبدًا أن يعطيني الخلل. **حالات السباق غير مرئية في مفكك الترميز (decompiler)** لأن العيب ليس في التعليمات — بل في التشابك (interleaving).
### المختبر
| الدور | الإعداد |
| --- | --- |
| المضيف / المصحح | Windows 11, WinDbg |
| الهدف | Windows Server 2022, Build 20348.2159 |
| التحليل | Kali Linux + Windows 11 VM |
| ناقل التصحيح | VMware serial COM، تصحيح أخطاء النواة من المضيف إلى الهدف |
| التحليل الساكن | Ghidra عبر GhidraMCP |
| مساعدة الفرز | تمريرة بمساعدة الذكاء الاصطناعي على المخرجات المفككة |
ثلاث طبقات من الأدوات قامت بالعمل الفعلي.
### التجمع الخاص ومدقق برنامج التشغيل
إنها الخطوة الأعلى تأثيرًا في أي تحقيق في استخدام الذاكرة بعد تحريرها (UAF) في النواة. افتراضيًا، تُعاد استخدام ذاكرة التجمع المحررة فورًا تقريبًا بواسطة التخصيص التالي بحجم مشابه — مما يعني أن الاستخدام بعد التحرير عادةً *لا يُحدث خطأ*. فهو يقرأ بيانات صحيحة لشخص آخر، ويواصل التنفيذ، وينفجر في مكان غير ذي صلة بعد دقائق. بعدها تقضي ثلاثة أيام في تدقيق دالة بريئة.
التجمع الخاص يغير ذلك. يحصل كل تخصيص على صفحته الخاصة مع صفحة حراسة مجاورة، وتُعلَّم الصفحات المحررة بأنها غير قابلة للوصول بدلاً من إعادة تدويرها. النتيجة هي أن إلغاء الإشارة المخالف يُحدث خطأ **عند التعليمات التي تنفذه**، لا في مرحلة لاحقة:```
!verifier 0x1 win32kfull.sys ; special pool on the target driver
!verifier 0x8 win32kfull.sys ; pool tracking
بالاقتران مع تصفية وسوم التجمع، هذا هو ما يحوّل "خطأ bugcheck متقطع تحت التحميل" إلى عطل قابل للتكرار ويمكن إرجاعه إلى سببه.
إذا أخذت شيئًا واحدًا من هذا المنشور: فعّل special pool قبل أن تبدأ، وليس بعد أن تعلق.
بمجرد أن يكون لديك عطل، يكون السؤال هو: هل تنظر إلى فساد أم إلى خطأ في دورة الحياة؟ كلٌّ منهما يتطلب تقريرًا مختلفًا. بيانات تعريف التجمع تجيب على ذلك:``` kd> !pool
الكتلة التي تكون *مخصّصة* بوسمٍ معقول ومحتوى عشوائي تشير إلى **تلف**. الكتلة التي تكون *محرّرة*، أو موجودة في صفحة عديمة الوصول من التجمع الخاص، تشير إلى **خلل في دورة الحياة** — أي شيء أبقى مؤشرًا يتجاوز موت الكائن. هذا هو الفرق بين *"المُهاجم كتب هنا"* و *"كان ينبغي ألا يكون هذا الكائن قابلًا للوصول"*، وهو الفرق بين تقرير تلف الكومة وتقرير CWE-362.
تحقق من نوع الكائن قبل الالتزام بأيٍّ منهما. فـ `PWND` له شكل يمكن التعرف عليه؛ إذا كانت الذاكرة التي تعطلت عليها ما تزال تحمل بقاياه، فأنت شبه متأكد من أنك أمام مشكلة عمر نافذة وليس استبدالًا عشوائيًا.
### تصحيح أخطاء النواة المباشر على التداخل
حتى مع التجمع الخاص، فالسباق مشكلة جدولة، و**مصحح الأخطاء يغيّر الجدولة.** هذا هو الإحباط المركزي في عمل السباقات: الأداة تزعزع ما تقيسه. نقطة الإيقاف في مسار التفكيك تفرض التسلسل على الخيطين اللذين تحاول تداخلهما تمامًا، فيختفي الخطأ بأدب.
الطريق عبر ذلك هو التوقف عن محاولة الإمساك بالسباق عبر نقطة إيقاف، وبدلًا من ذلك:
- **توسيع النافذة بشكل مصطنع** — أي شيء يطيل الفاصل بين تحرير المرجع والتفكيك يجعل التصادم قابلًا للتحقيق بمعدلات جدولة طبيعية،
- **زيادة محاولات التصادم بدل الدقة** — تشغيل المسارين باستمرار وترك الاحتمال يقوم بالعمل،
- **استخدام نقاط إيقاف شرطية وقابلة للتفعيل لمرة واحدة** تُسلَّح فقط عندما توجد الحالة المثيرة للاهتمام، بدل كسر التنفيذ عند كل دخول،
- **تأكيد التداخل بعد حدوث العطل**، من حالة الخيوط والمكدسات، بدل محاولة ملاحظته مباشرة.
العطل نفسه، بمجرد حصولك عليه، غير مثير — إنه إلغاء مرجعية `PWND` في مسار توزيع الرسائل حيث يكون الكائن قد اجتاز التفكيك بالفعل على خيط آخر، مع `!pool` الذي يؤكد أن الكتلة حُرِّرت بدل أن تُستبدل:```
kd> !analyze -v
EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - Access violation
FAULTING_MODULE: win32kfull
(تم حجب الإزاحات والعناوين وتفاصيل إعادة الإنتاج بموجب الإفصاح المنسق.)
لا يُثبت التأثير بانهيار. إنه يُثبت بـمن يمكنه التسبب في الانهيار. نُفذ كل تشغيل للمحفّز من حساب مستخدم عادي غير مسؤول على النظام المستهدف، لأن خطأ kernel الذي لا يمكن الوصول إليه إلا من سياق متمتع بصلاحيات مسبقة هو خلل استقرار، لا خلل أمني. التحقق من مستوى السلامة (integrity level) للعملية التي قادت التصادم هو خطوة تستغرق ثلاثين ثانية تحدد ما إذا كانت لديك قضية مكافأة أم مجرد إدخال في Windows Feedback Hub.
الانضباط الأساسي: لم أصدق أي انهيار منفرد. انهيار واحد في سباق (race) هو مجرد ضجيج. ما جعله قابلاً للتبليغ هو قابلية التكرار ضمن توقيت محكوم — أي القدرة على قول "هذان المساران، هذا الترتيب، هذه النافذة" والحصول على الخطأ نفسه مرة أخرى. هذا هو الفرق بين تقرير يمكن لـ MSRC التعامل معه وتقرير يغلقونه باعتباره غير قابل لإعادة الإنتاج.
استخدمت فرزًا مدعومًا بالذكاء الاصطناعي للتنقل عبر المخرجات المفككة بشكل أسرع، وسأذكر بصراحة ما كان جيدًا فيه وما لم يكن.
جيد في: تغطية مساحة السطح. قراءة حجم كبير من HLIL والإشارة إلى "هذه الدوال تلمس كائنًا مشتركًا دون أي مزامنة ظاهرة" هي مطابقة أنماط، ومطابقة الأنماط بكميات كبيرة هي بالضبط ما تجيده هذه الأدوات. لقد اختصرت أسابيع من القراءة السريعة إلى أيام.
عديم الفائدة في: إصدار الأحكام. سيسرد بثقة سلسلة هجوم غير موجودة، ويزعم قابلية وصول لم يثبتها، وينتج تقريرًا منظمًا ببراعة لخلل غير موجود. كل استنتاج على حدة كان عليه أن يجتاز التحقق اليدوي في WinDbg قبل أن يقترب من أي تقرير.
نمط الفشل الذي يجب أن تخافه ليس أن تكون الأداة مخطئة، بل أن تكون الأداة فصيحة بينما هي مخطئة، في الساعة الثانية فجرًا، عندما تريدها أن تكون على صواب.
النتيجة الملفّقة المرسلة إلى MSRC تكلف مهندسيها وقتًا حقيقيًا وتكلفك سمعة لا يمكنك إعادة بنائها بسرعة.
| التاريخ | الحدث |
|---|---|
| 7 مايو 2026 | تم الإرسال — VULN-186460 |
| 7 مايو 2026 | فُتحت القضية — MSRC Case 11xxxxx |
| 11 يونيو 2026 | تأكيد السلوك من Microsoft؛ فُتحت مراجعة المكافأة |
| 27 يونيو 2026 | جدولة الإصلاح لإصدار يوليو؛ تعيين CVE-2026-54107 (قبل الإصدار) |
| 30 يونيو 2026 | مُنحت المكافأة — US$8,000، برنامج Windows Insider Preview Bounty Program |
| 14 يوليو 2026 | شُحن التصحيح؛ نُشر CVE |
خمسة أسابيع من الصمت بين الإرسال والتأكيد. هذا هو الجزء الذي يختبرك. لقد دوّنت ادعاءً حول kernel شخص آخر ولا تعلم بعد ما إذا كان استدلالك صحيحًا، أو ما إذا كان مكررًا، أو حتى ما إذا كان يعيد إنتاج نفسه على build الخاص بهم. رسالة التأكيد هي اللحظة التي يتوقف فيها الأمر عن كونه نظرية تملكها ليصبح ثغرة موجودة فعلًا.
أمر صغير جعلني أضحك على نفسي: في 14 يوليو بتوقيتي، راسلت القضية أسأل لماذا لم يُنشر CVE. كان الرد مهذبًا: إنه 13 يوليو في سياتل. يعمل تقويم إصدارات Microsoft بتوقيت المحيط الهادئ. الآن أعرف.
| الحقل | التفاصيل |
|---|---|
| CVE | CVE-2026-54107 |
| قضية MSRC | 11xxxxx (VULN-186460) |
| المكوّن | win32kfull.sys — دورة حياة كائنات النوافذ |
| التصنيف | حالة سباق (Race condition) → استخدام بعد التحرير (use-after-free) |
| CWE | CWE-362 |
| الأثر | رفع الامتيازات |
| الخطورة | مهم (MSRC) |
| CVSS v3.1 | 8.8 (عالي) |
| ناقل الهجوم | محلي، بمصادقة |
| البرنامج | Windows Insider Preview Bounty Program |
| المكافأة | US$8,000 |
| تم الإصلاح | تحديث أمان يوليو 2026 |
اقرأ بحثًا عن الثوابت، لا عن الأخطاء. "أين يفترض هذا الكود شيئًا لا يفرضه؟" يكتشف أكثر مما يكتشفه "أين يقع الفائض؟" — خاصة في المكونات الناضجة الخاضعة لتدقيق مكثف حيث اختفت الفئات السهلة.
السباق (race) ادعاء عابر لحدود الدوال. لا يمكنك إثباته أو دحضه من دالة واحدة. إذا توقف تحليلك عند حدود الدالة، فستولّد مرشحين لا يمكنك استبعادهم أبدًا.
بيئة التصحيح هي جوهر العمل. خسرت ساعات أكثر بسبب وصلة COM تسلسلية غير مستقرة مما خسرته في البحث الفعلي، والـ pipeline المعطوب ينتج نتائج سلبية كاذبة تبدو مطابقة تمامًا لعبارة "لا يوجد شيء هنا." كدت أتخلى عن هذا الهدف بسبب إعداد منفذ COM.
بلّغ عن السبب، لا عن الانهيار. تصل إلى MSRC حالات انهيار. ما يحرك القضية هو سرد متماسك حول أي ثابت انكسر ولماذا لم يكن الإنفاذ موجودًا.
التأكيد ليس النهاية. بين التأكيد وشحن التصحيح هناك متابعة لإعادة الإنتاج، وسلوك Canary، ومراجعة. ابقَ منخرطًا.
نفس المنهجية، أسطح مختلفة — tcpip.sys، afd.sys، clfs.sys. أفضل أن أُعرف بمجموعة أعمال بدلًا من اكتشاف محظوظ واحد، والطريقة الوحيدة لتحقيق ذلك هي مواصلة استبعاد المرشحين أسرع من توليدهم.
إذا كنت في المكان الذي كنت فيه قبل عام — قادمًا من مكافآت الويب، فضوليًا بشأن العمل على kernel، غير متأكد مما إذا كنت الشخص القادر على فعل ذلك — فستكتشف ذلك بأن تفعله. اختر برنامج تشغيل واحدًا. اربط مصحح أخطاء. اقرأ ببطء. واصل السؤال عما يحدث إذا شُغّل مرتين.
من هنا حقًا يبدأ كل شيء.
بقلم Pravin Choudhary (@pr4v1nx) — باحث مستقل في الأمن الهجومي. تم الإفصاح إلى Microsoft بموجب الإفصاح المنسق. تفاصيل الاستغلال والإزاحات وكود إعادة الإنتاج حُجبت عمدًا.