
CVE-2026-74943 · Firefox RasterImage में फ्री के बाद उपयोग (sec-high)
गंभीरता: उच्च (sec high)। CWE 416। Firefox 154 और ESR 140.14 में ठीक किया गया। Bugzilla 2057308। सामान्य वेब पेज से बिना किसी उपयोगकर्ता इंटरैक्शन के पहुँचा जा सकता है।
Firefox डिकोड की गई इमेज सतहों को SurfaceCache में रखता है। कैश स्वामित्व वाली इमेज के लिए एक कच्चा गैर-स्वामित्व वाला पॉइंटर रखता है। जब कोई सतह बाहर निकाली जाती है, तो कैश उस इमेज को डिकोडर थ्रेड पर सूचित करता है। अधिसूचना ने mIsBeingDestroyed एटॉमिक फ्लैग को पढ़ा और उसके बाद ही RefPtr<RasterImage> image = this लिया। फ्लैग को पढ़ना और संदर्भ लेना दो अलग-अलग ऑपरेशन हैं। मुख्य थ्रेड इन दोनों के बीच अंतिम संदर्भ छोड़ सकता है। एक मरता हुआ ऑब्जेक्ट पुनर्जीवित हो जाता है और फिर उसके फ्री होने के बाद उसे पढ़ा जाता है।
Decoder thread (holds the SurfaceCache lock) Main thread
OnSurfaceDiscarded reads mIsBeingDestroyed = false
Release drops the refcount to zero and commits delete
~RasterImage sets the flag then blocks on the cache lock
RefPtr image = this (AddRef from zero to one)
queues the runnable and releases the lock
the destructor finishes and frees the 248 byte object
the runnable runs and reads freed mProgressTracker ==> use after free
पहले के एक फिक्स का फ्लैग इस समय-खिड़की को संकीर्ण करता है, लेकिन इसे बंद नहीं कर सकता। फ्लैग को false के रूप में देखना यह साबित नहीं करता कि refcount अभी भी शून्य से ऊपर है, क्योंकि फ्लैग को डिस्ट्रक्टर के अंदर सख्ती से उस समय सेट किया जाता है जब काउंट पहले ही शून्य तक पहुँच चुका होता है।
इस बग को वहन करने वाले दो निर्देश संकलित फ़ंक्शन में स्पष्ट रूप से दिखाई देते हैं। फ्लैग जाँच और this पर संदर्भ गणना वृद्धि अलग-अलग हैं।

प्रभावित संस्करण का ASAN बिल्ड उपयोग करें। prefs.js में दिए गए प्रेफ्स लागू करें ताकि सतह कैश बहुत छोटा रहे और डिकोडर थ्रेड लगातार सतहों को बाहर निकालता रहे। uaf-reduced.html लोड करें और इसे लूपिंग पर छोड़ दें। यह एक क्रॉस-थ्रेड टाइमिंग रेस है, इसलिए यह रुक-रुक कर रिप्रोड्यूस होता है।
AddressSanitizer: heap-use-after-free
READ of size 8, 8 bytes into a freed 248-byte RasterImage
use : RasterImage::OnSurfaceDiscardedInternal (main thread)
freed : RasterImage::Release() via imgRequest teardown
alloc : ImageFactory::CreateRasterImage() on the ImageIO thread
कंटेंट प्रोसेस में हीप फ्री-के-बाद-उपयोग (heap use-after-free)। यह एक वेब पेज से पहुँचा जा सकता है और इसके लिए किसी क्लिक या अनुमति की आवश्यकता नहीं है। परीक्षण किए गए बिल्डों पर नियंत्रित निष्पादन प्रदर्शित नहीं किया गया। ऑब्जेक्ट को पुनर्जीवित किया जाता है और बाद में दूसरी बार फ्री किया जाता है।
OnSurfaceDiscarded अब इमेज को संदर्भित नहीं करता। यह अलग से संदर्भ-गणना किए गए ProgressTracker के लिए एक सशक्त संदर्भ कैप्चर करता है और ट्रैकर के वीक बैक-संदर्भ के माध्यम से मुख्य थ्रेड पर इमेज को पुनः प्राप्त करता है। पुनः प्राप्ति यदि जीवित हो तो एटॉमिक add का उपयोग करती है। अप्रचलित फ्लैग हटा दिया गया है।
Abdulaziz Alasaiqah · https://azoz.my/writeups.html