
CVE-2026-74945, एक तैयार किए गए वेब फ़ॉन्ट के माध्यम से अनइनिशियलाइज़्ड हीप डिस्क्लोज़र (sec-high)
यह निर्देशिका Firefox फ़ॉन्ट हैंडलिंग में अनइनिशियलाइज़्ड-मेमोरी डिस्क्लोज़र के लिए एक ईमानदार पुनरुत्पादन पैकेज रखती है। एक तैयार किया गया @font-face फ़ॉन्ट OTS आउटपुट स्ट्रीम को एक अनइनिशियलाइज़्ड-हीप गैप में ले जाता है, और सामान्य कंटेंट उस गैप के बाइट्स को canvas measureText API के माध्यम से वापस पढ़ता है। इसे केवल सिंथेटिक डेटा के साथ स्थानीय रूप से डाउनलोड किए गए कमज़ोर Firefox बिल्ड के विरुद्ध चलाने के लिए बनाया गया है। यह कभी भी किसी लाइव या तृतीय-पक्ष सिस्टम को स्पर्श नहीं करता है।
मिलता-जुलता PoC रिपॉज़िटरी: https://github.com/defineid/Palimpsest
राइटअप: इस पोर्टफ़ोलियो में writeup-font-cmap-leak.html।
| फ़ील्ड | मान |
|---|---|
| CVE | CVE-2026-74945 |
| कंपोनेंट | Core / Graphics: Text |
| वर्ग | Uninitialized Memory Disclosure (CWE-908 · CWE-200) |
| गंभीरता | sec-high (वेब-रिचेबल मेमोरी डिस्क्लोज़र) |
| इसमें ठीक किया गया | Firefox 154 · ESR 140.14 |
| बग | bugzilla.mozilla.org/show_bug.cgi?id=2057808 |
| इंटरैक्शन | कोई नहीं · केवल पेज लोड |
Firefox उपयोग से पहले वेब फ़ॉन्ट्स को OTS के माध्यम से सैनिटाइज़ करता है। तीन स्वतंत्र दोष इस तरह एक साथ आते हैं कि एक तैयार किया गया फ़ॉन्ट सैनिटाइज़्ड आउटपुट के भीतर एक अनइनिशियलाइज़्ड-हीप गैप छोड़ देता है और कंटेंट उसे वापस पढ़ सकता है:
moz_xrealloc) के साथ बढ़ती है जो नई जगह को शून्य-भरता नहीं है।nonDefaultUVSOffset वाली cmap फ़ॉर्मेट-14 सबटेबल OTS को सैनिटाइज़्ड फ़ॉन्ट को पुनः-सीरियलाइज़ करते समय अपनी आउटपुट स्ट्रीम को आगे की ओर seek करने पर मजबूर करती है। लिखे गए बाइट्स और seek टारगेट के बीच का छोड़ा गया स्पैन अनइनिशियलाइज़्ड हीप लिए हुए कॉलर को सौंप दिया जाता है, और forget() बफ़र का आकार उच्चतम पहुँचे गए ऑफ़सेट तक कर देता है।cmap टेबल के शेष भाग के विरुद्ध बाउंड्स-चेक करता है, इसलिए वह सेगमेंट जिसका idRangeOffset फ़ॉर्मेट-4 डेटा के अंत से आगे निकल जाता है, फिर भी जाँच पास कर लेता है और पड़ोसी सबटेबल के अनइनिशियलाइज़्ड बाइट्स में पढ़ लेता है।तैयार किया गया फ़ॉन्ट एक फ़ॉर्मेट-4 सबटेबल, जिसका अंतिम सेगमेंट (0xFFFF) एक विषम, अतिक्रमणकारी idRangeOffset का उपयोग करता है, को एक बड़े nonDefaultUVSOffset वाली फ़ॉर्मेट-14 सबटेबल के साथ जोड़ता है, साथ ही maxp.numGlyphs = 65535 और प्रत्येक ग्लिफ़ id के लिए एक अलग hmtx एडवांस (एडवांस == ग्लिफ़ id) रखता है। इसलिए U+FFFF को मापने पर एक ग्लिफ़ id प्राप्त होता है जो अनइनिशियलाइज़्ड गैप से पढ़ा जाता है, और उसकी एडवांस चौड़ाई, जो स्क्रिप्ट से पढ़ी जा सकती है, लगभग 64 KB विंडो पर प्रति माप लगभग दो बाइट हीप का खुलासा करती है।
एक सामान्य वेब पेज तैयार किए गए फ़ॉन्ट को @font-face के माध्यम से सर्व करता है और ctx.measureText("") कॉल करता है। किसी क्लिक, अनुमति, एक्सटेंशन, या प्रेफ़ बदलाव की आवश्यकता नहीं है। OTS इन-प्रोसेस चलता है और सैंडबॉक्स्ड लाइब्रेरीज़ में से नहीं है, इसलिए खुलासा किए गए बाइट्स कंटेंट-प्रोसेस हीप हैं जिनमें पॉइंटर या रहस्य हो सकते हैं।
| फ़ाइल | उद्देश्य |
|---|---|
make_font.py | तैयार किए गए फ़ॉन्ट leak.otf और leak.woff बनाता है। |
trigger.html | एक सादा पेज जो @font-face के माध्यम से फ़ॉन्ट लोड करता है और measureText के माध्यम से U+FFFF एडवांस वापस पढ़ता है। |
https://ftp.mozilla.org/pub/firefox/releases/140.9.0esr/ से मिलता-जुलता प्लेटफ़ॉर्म बिल्ड डाउनलोड करें।pip install fonttools brotli
python3 make_font.py # writes leak.otf and leak.woff in this directory
फिर कमज़ोर बिल्ड में trigger.html को file:// पाथ से या अपने नियंत्रण वाले
लोकल स्टैटिक सर्वर से खोलें, और Measure पर क्लिक करें।
.notdef) में रिज़ॉल्व होता है और एडवांस 0 होता है। कोई गैप लीक
नहीं होता, क्योंकि आउटपुट स्ट्रीम शून्य किया जाता है और फ़ॉर्मेट-4 लुकअप
अपनी ही सबटेबल तक सीमित रहता है।make_font.py को यहाँ fontTools 4.63.0 के साथ
निष्पादित किया गया और इसने leak.otf (393816 बाइट) और leak.woff (132372
बाइट) उत्पन्न किया। उत्पन्न फ़ॉन्ट को रॉ बाइट्स से वापस पार्स किया गया और
प्रत्येक तैयार किए गए घटक की पुष्टि की गई: maxp.numGlyphs = 65535,
hhea.numberOfHMetrics = 65535, प्रत्येक ग्लिफ़ आईडी के लिए एक अलग hmtx
एडवांस (एडवांस == ग्लिफ़ आईडी), दो cmap सबटेबल (प्लेटफ़ॉर्म 3 एन्कोडिंग 1
फ़ॉर्मेट 4, और प्लेटफ़ॉर्म 0 एन्कोडिंग 5 फ़ॉर्मेट 14), फ़ॉर्मेट-4 का अंतिम
सेगमेंट endCode = 0xFFFF जिसमें एक विषम ओवररनिंग
idRangeOffset = 0x4001 है, और फ़ॉर्मेट-14 का
nonDefaultUVSOffset = 0x8000।trigger.html को स्वयं किसी लोकल
कमज़ोर बिल्ड के विरुद्ध चलाएँ। यह पैकेज तैयार किए गए इनपुट और रीड-बैक पाथ
को प्रदर्शित करता है; यह कोई हथियारीकृत एक्सप्लॉइट नहीं है और इसमें कोई
नियंत्रित कोड-एग्ज़िक्यूशन प्रिमिटिव शामिल नहीं है।यह सिंथेटिक, स्वयं-उत्पन्न फ़ॉन्ट डेटा के साथ लोकल रूप से डाउनलोड किए गए बिल्ड को लक्षित करता है, जो लेखक के स्वयं के रिपोर्ट किए गए और पहले ही पैच किए जा चुके CVE के राइटअप के लिए है। यह किसी लाइव या तृतीय-पक्ष सेवा पर हमला नहीं करता।