
CVE-2026-86950 का शोषण करने वाली PDF फ़ाइलों का पता लगाने के लिए एक Python टूल
इस प्रोजेक्ट और CVE-2026-86950 के बारे में अधिक संदर्भ के लिए, देखें https://decalage.info/CVE-2026-86950/
अस्वीकरण: इस readme का अधिकांश भाग और डिटेक्शन कोड AI कोडिंग एजेंटों की सहायता से लिखा गया है। इस टूल का हजारों वैध PDF फ़ाइलों पर और यहाँ प्रकाशित उपलब्ध प्रूफ-ऑफ-कॉन्सेप्ट पर सफलतापूर्वक परीक्षण किया गया है। हालाँकि, यह टूल नया है और डिटेक्शन एल्गोरिद्म काफ़ी जटिल है, इसलिए इसका उपयोग सावधानी से करें।
detect_cve_2026_86950.py PDF फ़ाइलों को स्टैटिक रूप से स्कैन करता है ताकि CVE-2026-86950 ("The Great Glyph Grift") का शोषण करने के लिए तैयार किए गए एम्बेडेड फ़ॉन्ट्स का पता लगाया जा सके, जो Apple CoreGraphics के एंटी-एलियास्ड ग्लिफ़ रास्टराइज़र में एक आउट-ऑफ़-बाउंड्स राइट है (iOS / macOS 26.7.1 में ठीक किया गया)।
यह कभी भी फ़ॉन्ट को रेंडर नहीं करता और न ही कोई एक्सप्लॉइट कोड निष्पादित करता है — यह PDF और एम्बेडेड फ़ॉन्ट प्रोग्राम को पार्स करता है और हमले के संरचनात्मक हस्ताक्षर की खोज करता है।
CoreGraphics एक फ़्लोटिंग-पॉइंट डिवाइस निर्देशांक को लगभग इस प्रकार 16.12 फ़िक्स्ड-पॉइंट पूर्णांक में बदलता है:
int32_t aa_double_to_fixed(double px) { return (int32_t)(0.5 + 4096.0 * px); }
जब 4096 * px int32 की सीमा से अधिक हो जाता है, तो कास्ट अपरिभाषित व्यवहार (undefined behaviour) होता है,
और दो कॉल साइटें (aa_moveto बनाम aa_lineto) असहमत होती हैं — एक संतृप्त (saturate) करती है, एक
काटती (truncate) है। यह असहमति aa_add_edges में ग्लिफ़ बाउंडिंग-बॉक्स गणना को दूषित करती है, इसलिए
aa_cache_render में कवरेज बफ़र बहुत छोटा आवंटित हो जाता है और रास्टराइज़र सीमा से बाहर लिखता है। 26.7.1 पैच
±0x3FFFF001 में स्पष्ट क्लैम्पिंग जोड़ता है।
सार्वजनिक प्रूफ़-ऑफ़-कॉन्सेप्ट एक दुर्भावनापूर्ण TrueType फ़ॉन्ट बनाता है जो ऐसे अत्यधिक बड़े निर्देशांक को बाध्य करता है:
/Tf 1024) पर, 4096 × device_coord int32 को ओवरफ़्लो करता है।/FontFile2) और CFF / OpenType (/FontFile3)।/Tf, Tm) में उपयोग किए गए टेक्स्ट आकारों के साथ जोड़ता है और जाँचता है कि 4096 × device_coord
वास्तव में INT32_MAX से अधिक है या नहीं — अर्थात क्या फ़िक्स्ड-पॉइंट ओवरफ़्लो
पहुँच योग्य है।निर्णय: exploit (ओवरफ़्लो पहुँच योग्य), suspicious (अत्यधिक बड़ी ज्यामिति लेकिन देखे गए आकार पर ओवरफ़्लो नहीं), clean।
# with uv (recommended)
uv venv
uv pip install -r requirements.txt
# or any environment with pikepdf + fonttools
python3 detect_cve_2026_86950.py suspicious.pdf
python3 detect_cve_2026_86950.py -v *.pdf # per-font details
python3 detect_cve_2026_86950.py --json f.pdf # machine-readable
एग्ज़िट कोड: 0 साफ़, 1 एक्सप्लॉइट/संदिग्ध मिला, 2 त्रुटि।
aa_* पाथ रास्टराइज़र में फ़िक्स्ड-पॉइंट कन्वर्ज़न है, जो TrueType glyf और CFF/Type2
आउटलाइन दोनों को रेंडर करता है। सार्वजनिक PoC TrueType कंपोज़िट
ग्लिफ़्स के साथ निर्देशांकों को बढ़ाता है; एक CFF फ़ॉन्ट सीधे अत्यधिक बड़े निर्देशांक तक पहुँच सकता है (जैसे कि
सापेक्ष ऑपरेटरों को संचित करके), इसलिए /FontFile2 और /FontFile3 दोनों का
विश्लेषण किया जाता है। कंपोज़िट-चेन ह्यूरिस्टिक TrueType-विशिष्ट है; CFF के लिए
संकेत अत्यधिक-निर्देशांक / बाउंडिंग-बॉक्स-झूठ जाँच है।/Tf, Tm) स्कैन बेस्ट-एफ़र्ट है; यह
PDF ग्राफ़िक्स स्टेट / CTM का पूरी तरह मूल्यांकन नहीं करता। जब कोई साइज़ नहीं मिलता, तो ओवरफ़्लो जाँच के लिए
1024 का रूढ़िवादी डिफ़ॉल्ट मान लिया जाता है। फ़ॉन्ट-अंतर्निहित अत्यधिक-ज्यामिति संकेत
इस पर निर्भर नहीं करते।