
تحليل CVE-2026-5281 (Chrome Dawn WebGPU UAF)، أدوات تحقق مخبرية، وبيئة قابلة لإعادة الإنتاج للبنيات المعرضة للثغرة مقابل البنيات المُصححة.
هذه الثغرة أثرت على أحد العملاء الذين نقدم لهم الخدمات. هذا المستودع هو مساهمتنا في البحث الأصلي: نقطة انطلاق مركزية للفريق، بحيث إذا ظهرت ثغرة مشابهة تؤثر على هذا المكون مرة أخرى، يكون لدينا الأساس جاهزًا. يجمع المستودع النظرية وراء الخلل، وملخصًا موثقًا لنتائج الباحث الأصلي، ومجموعة من الأدوات العملية للتحقق من التعرض في بيئة مختبرية.
ملاحظة: كنت أرغب في مشاركة المزيد من هذا البحث، لكن بسبب قيود الشركة لا يمكنني الكشف عنه أكثر. كل ما هو مدرج هنا قد تمت مراجعته ولا ينتهك أي اتفاقيات أنا ملزم بها. لذلك تم أرشفة المستودع في حالته الحالية.
في الأول من أبريل 2026، أصدرت Google تحديثًا أمنيًا لـ Chrome يعالج 21 ثغرة، إحداها CVE-2026-5281، والتي كانت تُستغل بنشاط في النسخة المتداولة وقت الإفصاح. بعد ثلاثة أيام، أضافتها CISA إلى فهرس الثغرات المعروفة والمستغلة وأصدرت توجيهًا تشغيليًا ملزمًا يطالب الوكالات الفيدرالية بتطبيق التصحيح. بحلول ذلك الوقت، كانت قد أثرت علينا بالفعل.
هذا المستودع موجود لسبب واحد: حتى في المرة القادمة التي يحدث فيها شيء كهذا، يكون لدينا نقطة انطلاق بدلاً من البدء من الصفر. يجمع المستودع بين:
عندما تريد فهم سبب وجود ثغرة معينة، تبدأ بما صُمم النظام لفعله والافتراضات التي بني عليها.
يقدم WebGPU واجهة برمجة تطبيقات (API) لتنفيذ عمليات، مثل التصيير والحساب، على وحدة معالجة الرسومات (GPU). WebGPU ليس محاولة لتقديم OpenGL أو OpenGL ES (الأنظمة المضمنة). إنها واجهة برمجة تطبيقات جديدة مبنية على أفكار واجهات برمجة التطبيقات الحديثة مثل Direct3D 12 و Metal و Vulkan.
WebGPU هو البديل الحديث لـ WebGL، واجهة برمجة تطبيقات GPU القديمة التي استخدمتها المتصفحات لسنوات. الفرق الرئيسي هو أن WebGPU صُمم من البداية ليكون آمنًا وذا إدارة واضحة للموارد. أنت تعلن عن دورة حياة كل مخزن مؤقت (buffer) ونسيج (texture) وخط أنابيب (pipeline) بنفسك. يعمل المتصفح كطبقة تحقق بين JavaScript والعتاد GPU.
الكائنات التي تقع في مركز هذه الثغرة، حسب ترتيب الإنشاء:``` GPUAdapter ← represents a physical GPU or software fallback └─ GPUDevice ← your logical connection to the adapter; owns everything ├─ GPUBuffer ← a chunk of GPU-accessible memory ├─ GPUShaderModule ← a compiled WGSL shader program ├─ GPUComputePipeline ← a shader wired to a pipeline layout ├─ GPUBindGroup ← binds buffers as inputs to a pipeline ├─ GPUCommandEncoder ← records a sequence of GPU commands └─ GPUQueue ← submits recorded commands to hardware
القاعدة المهمة هنا: كل كائن مملوك لـ GPUDevice. إتلاف المخزن المؤقت بينما لا يزال الجهاز يحتوي على أوامر قيد التنفيذ تشير إليه هو أمر غير قانوني صراحةً بموجب المواصفات. من المفترض أن يكتشف تطبيق Dawn ذلك ويرفضه. CVE-2026-5281 هو حالة لم يفعل فيها ذلك.
---
---
---
<div id='whatisdawn'/>
## ***⚙️ ما هو Dawn؟***
- **[Dawn - تنفيذ WebGPU مفتوح المصدر](https://dawn.googlesource.com/dawn)**
> Dawn هو تنفيذ مفتوح المصدر ومتعدد المنصات لمعيار WebGPU قيد التطوير. يعرض واجهة برمجة تطبيقات C++ أصلية تعكس WebGPU IDL مع بعض الامتدادات.
Dawn هي مكتبة C++ داخل Chrome تترجم استدعاءات JavaScript الخاصة بـ WebGPU إلى أوامر GPU أصلية للمنصة. على Windows تستهدف D3D12، على macOS تستهدف Metal، وعلى Linux تستهدف Vulkan. تقع بين محرك JavaScript في Chrome وبرنامج تشغيل الأجهزة، وهي مسؤولة عن أربعة أشياء: التحقق من صحة استدعاءات API، تسلسل الأوامر، تتبع عمر الكائنات، وإظهار الأخطاء إلى JavaScript.
يقع CVE-2026-5281 في جزء تتبع العمر. تحديدًا، في المدة التي يحتفظ فيها Dawn بكائنات المخزن المؤقت لل GPU حية بينما لا تزال الأوامر التي تشير إليها معلقة للتنفيذ على قائمة انتظار الأجهزة.```
JavaScript (V8)
│ WebGPU API calls
▼
Dawn (C++) - validates, serializes, tracks lifetimes, reports errors
│
▼
D3D12 (Windows) - Metal (macOS) - Vulkan (Linux)
│
▼
GPU hardware driver
│
▼
Physical GPU - shader cores, VRAM
تحتاج إلى نموذج ذهني واضح لمكان وجود الأشياء في الذاكرة قبل أن يصبح Use-After-Free بديهيًا.``` High addresses ┌────────────────────────────────────┐ │ Kernel space │ The OS and drivers live here. │ │ User-mode code cannot touch it. ├────────────────────────────────────┤ │ Stack │ Function call frames. Fast. │ (grows downward) │ Freed automatically when the │ │ function returns. ├────────────────────────────────────┤ │ Heap │ Dynamic allocations - malloc, new, │ (grows upward) │ smart pointers like Ref. │ │ Freed only when you say so. ├────────────────────────────────────┤ │ BSS / Data / Text │ Globals, constants, compiled code. └────────────────────────────────────┘ Low addresses
كائنات C++ الخاصة بـ Dawn، مثل الكائن الداخلي الذي يدعم GPUBuffer، تعيش على الـ heap. ويتم عدّها بالمراجع: يحتفظ مؤشر ذكي بعدد الأشياء التي تحتفظ بمرجع للكائن. عندما يصل هذا العدد إلى الصفر، يتم تشغيل المدمر وتُعاد الذاكرة إلى المخصص.