Skip to content
KitploitKITPLOIT
उपकरणब्लॉग
जमा करें
उपकरणब्लॉग
जमा करें

हैकिंग, पेनटेस्ट और साइबर सुरक्षा उपकरण आपके सुरक्षा शस्त्रागार के लिए!

Kitploit हैकिंग, साइबर सुरक्षा और पेंटेस्टिंग टूल्स की एक निर्देशिका है। कमजोरियों को खोजने, सिस्टम का विश्लेषण करने, परीक्षण को स्वचालित करने और अपनी सुरक्षा को मजबूत करने के लिए नवीनतम प्रोजेक्ट अपडेट खोजें।

··फ़ीड·संपर्क·गोपनीयता·© 2026 Kitploit

टूल निर्देशिका

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
CVE-2022-22629 — CVE-2022-22629 के लिए प्रूफ ऑफ कॉन्सेप्ट, Safari के WebGL मल्टी-ड्रॉ एक्सटेंशन में एक हीप बफर ओवरफ्लो, जिसमें भेद्यता विश्लेषण और क्रैश पुनरुत्पादन चरण शामिल हैं। | Kitploit
उपकरण/GitHubGitHub/lck0/cve-2022-22629
भेद्यता विश्लेषणशोषणवेब सुरक्षा
GitHublck0/cve-2022-22629

CVE-2022-22629

CVE-2022-22629 के लिए प्रूफ ऑफ कॉन्सेप्ट, Safari के WebGL मल्टी-ड्रॉ एक्सटेंशन में एक हीप बफर ओवरफ्लो, जिसमें भेद्यता विश्लेषण और क्रैश पुनरुत्पादन चरण शामिल हैं।

रिपॉजिटरी देखें
524 साल पहलेअभी तक समीक्षित नहीं

सबसे लोकप्रिय

सभी देखें →

हमारे समुदाय द्वारा सबसे अधिक उपयोग किए जाने वाले उपकरण खोजें।

सभी उपकरण खोजें

हमारे उपकरणों का संग्रह ब्राउज़ करें

सभी उपकरण देखें →
साझा करें

CVE-2022-22629 प्रूफ ऑफ कॉन्सेप्ट

यह पोस्ट उस WebGL बग के poc के बारे में है जिसे Safari 15.4 सुरक्षा अपडेट में पैच किया गया था।

bug

अगर आप विस्तार से जानना चाहते हैं कि WebGL कैसे काम करता है, तो आप इस आधिकारिक संसाधन का उपयोग कर सकते हैं, क्योंकि हम यहाँ बग से संबंधित विशेष विवरणों पर चर्चा करने जा रहे हैं:

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

यह poc इस बारे में नहीं है कि इस बग का शोषण करने के लिए प्रिमिटिव कैसे प्राप्त करें, हम केवल भेद्यता विश्लेषण और webcontent को क्रैश करने के तरीके पर चर्चा करेंगे : )

परिचय

WebGL एक जावास्क्रिप्ट API है जिसका उपयोग ब्राउज़रों में 2D और 3D ग्राफिक्स रेंडर करने के लिए किया जाता है। यह अपने प्राथमिक WebGL बैकएंड के रूप में ANGLE घटक का उपयोग करता है, जो अन्य ब्राउज़रों के साथ संगतता में काफी सुधार करता है, और WebKit में एक अनुरूप WebGL 2.0 सक्षम करता है। WebGL डेवलपर के लिए अनुकूलन के साथ रेंडरिंग करने हेतु बहुत सारे एक्सटेंशन प्रदान करता है। तो, हम उस एक्सटेंशन को देखेंगे जिससे हमारा सरोकार है।

WebGL में एक्सटेंशन

extension

तो, यह API विभिन्न उद्देश्यों के लिए कई एक्सटेंशन प्रदान करता है। जिस बग पर हम चर्चा करने वाले हैं वह EXT_ में है।

आप एक्सटेंशन के बारे में यहाँ से अधिक विस्तार से पढ़ सकते हैं:

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

खैर, चलिए बग की ओर बढ़ते हैं :)

भेद्यता विश्लेषण

WEBGL_multi_draw एक्सटेंशन

WEBGL_multi_draw एक्सटेंशन WebGL API का हिस्सा है और एक ही फ़ंक्शन कॉल के साथ एक से अधिक प्रिमिटिव रेंडर करने की अनुमति देता है। यह WebGL एप्लिकेशन के प्रदर्शन को बेहतर कर सकता है क्योंकि यह रेंडरर में बाइंडिंग लागत को कम करता है और यूनिफ़ॉर्म डेटा के साथ GPU थ्रेड समय को तेज़ करता है।

यह एक्सटेंशन OpenGL के लिए ARB_shader_draw_parameters द्वारा उजागर किए गए vertex shader बिल्टिन gl_DrawID के अतिरिक्त, EXT_multi_draw_arrays कार्यक्षमता में Multi* ड्रॉ कॉल वेरिएंट को उजागर करता है।

ये फ़ंक्शन मानक फ़ंक्शन DrawArrays() और DrawElements() के समान व्यवहार करते हैं, सिवाय इसके कि वे एक कॉल में वर्टिस की कई सूचियों को संभालते हैं। इनका मुख्य उद्देश्य एक फ़ंक्शन कॉल को एक से अधिक प्रिमिटिव जैसे triangle strip, triangle fan, आदि रेंडर करने की अनुमति देना है।

इसके अतिरिक्त, यह एक्सटेंशन shading language में एक और बिल्टिन वेरिएबल, 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 API के 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 तक मौजूद है, क्योंकि Apple के मामले में यह एक्सटेंशन केवल Safari 15 (iOS) में समर्थित है।

पैच को समझना बहुत आसान है और यह स्पष्ट रूप से बताता है कि यह रेंडरिंग के दौरान heap buffer overflow है। यह फ़ंक्शन ऊपर [1] में बताए गए सभी ऑपरेशनों में WebGLMultiDraw.cpp के अंदर कॉल किया जाता है। आइए समझते हैं कि इस फ़ंक्शन के कॉल होने से पहले क्या हो रहा है। हम ऊपर दिए गए किसी एक फ़ंक्शन के कार्यान्वयन को देख सकते हैं:

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 जो निष्पादित किए जाने वाले एलिमेंट्स की रेंज के इंस्टेंसों की संख्या निर्दिष्ट करता है।

कार्यान्वयन को देखने पर, हम देख सकते हैं कि हम offset और drawcount को नियंत्रित कर सकते हैं ताकि बफर के आकार से आगे draw mode तक ड्रॉ किया जा सके : )

तो, हमारा POC यहाँ है ...

परीक्षण

11pro

जैसा कि आप देख सकते हैं, हमारा वेबपेज क्रैश हो गया क्योंकि multiDrawArraysWEBGL() में कॉल किया गया validateOffset() यह जाँच नहीं करता कि हमारा firstsOffset [0, size-drawcount] की सीमा में है, और हम वास्तविक बफर के आकार से आगे ड्रॉ कर रहे हैं। m_context->graphicsContextGL()->multiDrawArraysANGLE() फ़ंक्शन कॉल WebKit के लिए तृतीय-पक्ष घटकों में लागू किया गया है, जिसे ANGLE के नाम से जाना जाता है, और यह रेंडरिंग से पहले कोई जाँच नहीं करता है, इसलिए हम मेमोरी क्षेत्र में कुछ गलत मान लिखकर क्रैश कर देते हैं।

FYI, multiDrawArraysANGLE() का स्यूडोकोड इस प्रकार काम करता है:

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

और पैच लागू होने के बाद, यह कुछ भी रेंडर नहीं करेगा और validateOffset() फ़ंक्शन कॉल के माध्यम से false लौटाएगा:

12pro

js) ...

क्रेडिट

PARS Defense Team

हम नए टीम सदस्यों को नियुक्त कर रहे हैं, संपर्क करें: info[at]parsdefense.com

टूल डाउनलोड करें