Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2022-22629 — CVE-2022-22629 إثبات المفهوم | Kitploit
أدوات/GitHubGitHub/lck0/cve-2022-22629
تحليل الثغرات الأمنيةالاستغلالأمن الويب
GitHublck0/cve-2022-22629

CVE-2022-22629

CVE-2022-22629 إثبات المفهوم

عرض المستودع
5منذ 3 سنواتلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

إثبات المفهوم لـ CVE-2022-22629

هذه المقالة تتعلق بإثبات المفهوم لثغرة WebGL التي تم تصحيحها في تحديثات أمان Safari 15.4.

bug

إذا كنت ترغب في التعلم بالتفصيل عن كيفية عمل WebGL، يمكنك استخدام هذا المورد الرسمي حيث سنناقش تفاصيل الثغرة هنا:

https://webglfundamentals.org/webgl/lessons/webgl-how-it-works.html

إثبات المفهوم هذا ليس حول كيفية الحصول على الأوليات لاستغلال هذه الثغرة، سنناقش فقط تحليل الثغرة وكيفية تعطل محتوى الويب : )

مقدمة

WebGL هي واجهة برمجة تطبيقات جافا سكريبت تُستخدم في المتصفحات لعرض الرسوميات ثنائية وثلاثية الأبعاد. تستخدم مكون ANGLE كخلفية رئيسية لـ WebGL، مما يحسن التوافق مع المتصفحات الأخرى بشكل كبير، ويتيح WebGL 2.0 المتوافق في WebKit. يوفر WebGL العديد من الامتدادات للمطور لإجراء العرض مع تحسينات. لذا، سننظر في الامتداد الذي يهمنا.

الامتدادات في WebGL

extension

لذا، توفر هذه الواجهة العديد من الامتدادات لأغراض مختلفة. الثغرة التي سنناقشها موجودة في EXT_.

يمكنك قراءة المزيد من التفاصيل حول الامتدادات من هنا:

https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Using_Extensions

على أي حال، دعنا نتجه نحو الثغرة :)

تحليل الثغرة

امتداد WEBGL_multi_draw

امتداد WEBGL_multi_draw هو جزء من واجهة WebGL ويسمح بعرض أكثر من شكل أولي باستدعاء دالة واحدة. يمكن أن يحسن ذلك أداء تطبيق WebGL حيث يقلل تكاليف الربط في المُقدم ويسرع وقت معالجة وحدة معالجة الرسومات مع البيانات الموحدة.

يكشف هذا الامتداد عن متغيرات استدعاء الرسم Multi* في وظيفة EXT_multi_draw_arrays بالإضافة إلى gl_DrawID المدمج في تظليل الرأس المكشوف بواسطة ARB_shader_draw_parameters لـ OpenGL.

تتصرف هذه الدوال تمامًا مثل الدوال القياسية DrawArrays() و DrawElements() إلا أنها تتعامل مع قوائم متعددة من الرؤوس في استدعاء واحد. والغرض الرئيسي منها هو السماح باستدعاء دالة واحدة لعرض أكثر من شكل أولي مثل شريط المثلثات، مروحة المثلثات، إلخ.

بالإضافة إلى ذلك، يضيف هذا الامتداد متغيرًا مدمجًا آخر، gl_DrawID، إلى لغة التظليل. يحتوي هذا المتغير على فهرس الرسم الجاري معالجته حاليًا بواسطة متغير Multi* لأمر الرسم.

https://github.com/WebKit/WebKit/blob/a7f8eacef337cb6691dca0b742d00f80d4f3dd0f/Source/ThirdParty/ANGLE/extensions/ANGLE_multi_draw.txt

يمكنك قراءة المزيد من التفاصيل حول الامتداد هنا:

https://registry.khronos.org/webgl/extensions/WEBGL_multi_draw/

يشبه هذا الامتداد واجهة WebGL WebGLRenderingContext.drawArrays() و WebGLRenderingContext.drawElements() إلخ، التي تعرض الأشكال الأولية من بيانات المصفوفة. الاختلاف الوحيد هو أنه يمكننا العرض باستخدام هذا الامتداد باستخدام مصفوفات متعددة.

يمكننا إجراء هذه العمليات باستخدام هذا الامتداد: [1]

  1. ext.multiDrawArraysWEBGL() لعرض أشكال أولية متعددة من بيانات المصفوفة (مطابق لاستدعاءات متعددة لـ drawArrays).

  2. ext.multiDrawElementsWEBGL() لعرض أشكال أولية متعددة من بيانات مصفوفة العناصر (مطابق لاستدعاءات متعددة لـ drawElements).

  3. ext.multiDrawArraysInstancedWEBGL() لعرض أشكال أولية متعددة من بيانات المصفوفة (مطابق لاستدعاءات متعددة لـ drawArraysInstanced).

  4. ext.multiDrawElementsInstancedWEBGL() لعرض أشكال أولية متعددة من بيانات مصفوفة العناصر (مطابق لاستدعاءات متعددة لـ drawElementsInstanced).

التصحيح

patch

https://github.com/WebKit/WebKit/commit/c087ca07c9125093ca62e8e44024b738bb7d46dc

الثغرة موجودة فقط من Safari 15.0 إلى 15.3 لأن هذا الامتداد مدعوم فقط في Safari 15 (ios) في حالة أبل.

التصحيح سهل الفهم ويوضح بوضوح أنه تجاوز سعة المخزن المؤقت في الكومة أثناء العرض. يتم استدعاء هذه الدالة هنا في WebGLMultiDraw.cpp في جميع العمليات المذكورة أعلاه [1]. دعنا نفهم ما يحدث قبل استدعاء هذه الدالة. قد ننظر إلى تنفيذ إحدى الدوال أعلاه:

root@kitploit:~
void WebGLMultiDraw::multiDrawArraysWEBGL(GCGLenum mode, Int32List firstsList, GCGLuint firstsOffset, Int32List countsList, GCGLuint countsOffset, GCGLsizei drawcount)
{
    if (!m_context || m_context->isContextLost())
        return;

    if (!validateDrawcount("multiDrawArraysWEBGL", drawcount)
        || !validateOffset("multiDrawArraysWEBGL", "firstsOffset out of bounds", firstsList.length(), firstsOffset, drawcount)
        || !validateOffset("multiDrawArraysWEBGL", "countsOffset out of bounds", countsList.length(), countsOffset, drawcount)) {
        return;
    }

    m_context->graphicsContextGL()->multiDrawArraysANGLE(mode, makeSpanWithOffset(firstsList, firstsOffset), makeSpanWithOffset(countsList, countsOffset), drawcount);
}

في JS، يتم تعريف مواصفات الدالة هكذا:

root@kitploit:~
void ext.multiDrawArraysWEBGL(mode,
    firstsList, firstsOffset,
    countsList, countsOffset,
    drawCount);
  • mode:

    • gl.POINTS: يرسم نقطة واحدة.
    • gl.TRIANGLES: يرسم مثلثًا لمجموعة من ثلاث رؤوس.
  • firstsList:

    • Int32Array أو Array (من GLint) تحدد قائمة بفهارس البداية لمصفوفات نقاط المتجه.
  • firstsOffset:

    • GLuint تحدد نقطة البداية في مصفوفة firstsLists.
  • countsList:

    • Int32Array أو Array (من GLsizei) تحدد قائمة بأعداد الفهارس التي سيتم عرضها.
  • countsOffset:

    • GLuint تحدد نقطة البداية في مصفوفة countsList.
  • drawCount:

    • GLsizei تحدد عدد مثيلات نطاق العناصر المراد تنفيذها.

بالنظر إلى التنفيذ، يمكننا أن نرى أنه يمكننا التحكم في الإزاحة وعدد الرسومات للرسم في وضع يتجاوز حجم المخزن المؤقت : )

لذا، إثبات المفهوم لدينا هو هنا ...

الاختبار

11pro

كما ترى، تعطلت صفحة الويب لدينا لأن validateOffset() التي تم استدعاؤها في multiDrawArraysWEBGL() لا تتحقق مما إذا كانت firstsOffset في النطاق [0, size-drawcount] ونحن نرسم بحجم يتجاوز حجم المخزن المؤقت الفعلي. يتم تنفيذ استدعاء الدالة m_context->graphicsContextGL()->multiDrawArraysANGLE() في مكونات طرف ثالث لـ WebKit تُعرف باسم ANGLE وليس لديها أي فحوصات قبل العرض، لذا نتعطل بكتابة قيمة سيئة إلى منطقة الذاكرة.

لعلمك، الكود الزائف لـ multiDrawArraysANGLE() يعمل هكذا:

root@kitploit:~
      for(i=0; i<drawcount; i++) {
        if (*(counts+i)>0) DrawArrays(mode, *(firsts+i), *(counts+i));
      }

ومع تطبيق التصحيح، لن يعرض أي شيء وسيعيد false من خلال استدعاء الدالة validateOffset():

12pro

js) ...

الإسناد

فريق PARS Defense

نحن نوظف أعضاء جدد في الفريق، اتصل بنا: info[at]parsdefense.com

تنزيل الأداة