
MuPDF में Null Pointer Dereference, मेरे द्वारा खोजा गया पहला CVE
MuPDF 1.26.4 EPUB रेंडरिंग फ़ंक्शन में नल पॉइंटर डी-रेफरेंस
CVE संदर्भ - CVE-2025-55780
प्रभावित संस्करण : 1.26.7 और उससे पहले प्रभावित हैं
पाया गया और परीक्षण किया गया : 1.26.4
गंभीरता CVSSv3 स्कोर : 7.5 ( उच्च )
कमिट में ठीक किया गया : https://cgit.ghostscript.com/cgi-bin/cgit.cgi/mupdf.git/commit/?id=bdd5d241748807378a78a622388e0312332513c5
Bugzilla : https://bugs.ghostscript.com/show_bug.cgi?id=708720
क्रैश स्थान :-
(1a44.55c0): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
mupdf!break_word_for_overflow_wrap+0x243:
00007ff7`6dbf2a23 8b00 mov eax,dword ptr [rax] ds:00000000`00000000=????????
समाधान :- HTML लेआउट में NULL डीरेफरेंस को ठीक करें।
यदि हमारे पास एक एकल फ्लो नोड है जो उपलब्ध चौड़ाई में फिट होने के लिए बहुत बड़ा है
और हम "overflow-wrap:break-word" CSS शैली का उपयोग कर रहे हैं,
तो हम फ्लो नोड को छोटे टुकड़ों में तोड़ने का प्रयास करते हैं
ताकि यह अच्छी तरह से रैप हो सके।
हम ऐसा फ्लो नोड टेक्स्ट को ट्रैवर्स करके उसे क्लस्टर में तोड़ने के लिए करते हैं;
हम शेपिंग की समस्याओं से बचने के लिए कैरेक्टर स्तर के बजाय क्लस्टर स्तर पर
तोड़ना चाहते हैं।
दाएं से बाएं टेक्स्ट के लिए, क्लस्टर अपेक्षित क्रम के विपरीत क्रम में आते हैं
और मौजूदा लॉजिक गलत हो जाता है।
इससे स्प्लिटिंग कोड वास्तव में कुछ भी स्प्लिट नहीं कर पाता,
जिसके परिणामस्वरूप node->next NULL हो सकता है, और हम
NULL को डीरेफरेंस करने का प्रयास करते हैं।
समाधान दाएं से बाएं टेक्स्ट के लिए अलग तरीके से स्प्लिट करना है।
इसकी जांच करते समय, एक अतिरिक्त समस्या देखी गई, अर्थात्
हम जिस तरह से harfbuzz को कॉल कर रहे थे, उसका मतलब था कि यह क्लस्टर को
हमारी अपेक्षा के अनुसार एक साथ समूहित नहीं करता था। तदनुसार, हम यहाँ कोड का
विस्तार करते हैं ताकि हमारा 'string_walker' harfbuzz को 'कैरेक्टर' क्लस्टर नोड के
बजाय 'ग्रैफीम' क्लस्टर मोड में कॉल कर सके।
इसका उपयोग करके, हम फिर लौटाए गए फ्रैगमेंट्स को ट्रैवर्स करने के लिए
कोड अपडेट करते हैं, स्ट्रिंग के, आवश्यक स्थान के लिए सही स्थिति में
कोड को तोड़ते हुए, l2r और r2l दोनों टेक्स्ट के साथ
सही ढंग से निपटने का ध्यान रखते हुए।