Chrome ने WebP heap buffer overflow भेद्यता को ठीक किया
(chromereleases.googleblog.com)- डेस्कटॉप Chrome Stable और Extended Stable चैनलों के लिए अपडेट जारी किया गया है, जिसमें WebP heap buffer overflow भेद्यता का सुधार शामिल है
- नए बिल्ड Mac·Linux पर 116.0.5845.187 और Windows पर 116.0.5845.187/.188 हैं, और इन्हें कुछ दिनों से लेकर कुछ हफ्तों तक चरणबद्ध तरीके से लागू किया जाएगा
- इस रिलीज़ में 1 सुरक्षा सुधार शामिल है, और CVE-2023-4863 को Critical श्रेणी में वर्गीकृत किया गया है
- Apple SEAR और University of Toronto Munk School के The Citizen Lab ने 6 सितंबर 2023 को इस भेद्यता की रिपोर्ट की
- Google ने कहा है कि वास्तविक दुरुपयोग के मामले मौजूद हैं, और फिक्स्ड वर्ज़न लागू होने तक बग की विस्तृत जानकारी तक पहुंच सीमित की जा सकती है
डेस्कटॉप Chrome चैनल अपडेट
- Stable और Extended Stable चैनलों को डेस्कटॉप के लिए नए बिल्ड पर अपडेट किया गया है
- प्लेटफ़ॉर्म के अनुसार Stable चैनल वर्ज़न इस प्रकार हैं
- Mac: 116.0.5845.187
- Linux: 116.0.5845.187
- Windows: 116.0.5845.187/.188
- Extended Stable चैनल भी अलग वर्ज़न के रूप में जारी किया गया है
- Windows: 116.0.5845.188
- Mac: 116.0.5845.187
- अपडेट कुछ दिनों से लेकर कुछ हफ्तों में चरणबद्ध तरीके से जारी किया जाएगा
- इस बिल्ड के पूरे बदलावों की सूची log में देखी जा सकती है
सुरक्षा सुधार: CVE-2023-4863
- इस रिलीज़ में 1 सुरक्षा सुधार शामिल है
- बाहरी शोधकर्ताओं के योगदान से किया गया प्रमुख सुधार निम्न भेद्यता है
- Critical CVE-2023-4863: WebP में heap buffer overflow
- बग नंबर: 1479274
- रिपोर्ट करने वाले: Apple Security Engineering and Architecture(SEAR), University of Toronto Munk School का The Citizen Lab
- रिपोर्ट की तारीख: 6 सितंबर 2023
- इनाम राशि: $NA
वास्तविक दुरुपयोग और जानकारी प्रकटीकरण पर प्रतिबंध
- Google ने कहा कि CVE-2023-4863 exploit वास्तविक वातावरण में मौजूद है
- बग की विस्तृत जानकारी और संबंधित लिंक तक पहुंच तब तक सीमित रखी जा सकती है, जब तक अधिकांश उपयोगकर्ता फिक्स्ड वर्ज़न पर अपडेट नहीं कर लेते
- यह प्रतिबंध उस स्थिति में भी जारी रह सकता है, यदि वही बग किसी third-party library में मौजूद हो जिस पर अन्य प्रोजेक्ट निर्भर करते हैं और जिसका सुधार अभी नहीं हुआ हो
सुरक्षा बग की पहचान और रिपोर्टिंग के रास्ते
- कई सुरक्षा बग निम्न टूल्स से खोजे जाते हैं
- रिलीज़ चैनल बदलने का तरीका Chromium release channels guide में देखा जा सकता है
- नए इश्यू crbug.com पर रिपोर्ट किए जा सकते हैं, और सहायता Chrome community help forum से मिल सकती है
1 टिप्पणियां
Hacker News की रायें
Google Chrome में WebP इमेज renderer process में decode होती हैं, इसलिए exploit सफल भी हो जाए तो sandbox के भीतर renderer code execution तक ही सीमित रहता है
renderer बहुत जटिल होता है, इसलिए हर साल कई exploits मिलते हैं, लेकिन renderer में code execution मिल जाने पर भी सामान्य web page के अधिकारों से बहुत आगे नहीं जाया जा सकता
खासकर local filesystem की फाइलें देखी या छोड़ी नहीं जा सकतीं, और दूसरे domains की cookies भी नहीं पढ़ी जा सकतीं
यह तुरंत सर्वोच्च प्राथमिकता वाली बात नहीं है, लेकिन अगर ऐसा exploit पहले से wild में चल नहीं रहा है, तो भी बहुत असुविधाजनक न होने वाले समय पर जितनी जल्दी हो सके patch कर देना चाहिए
यह किसी एक site या frontend से बंधा नहीं है, इसलिए यह बेहतर/मजबूत XSS जैसा है
आह, मैंने गलत thread में reply कर दिया; मैं https://news.ycombinator.com/item?id=37479576 में “jpeg is good enough” का जवाब देना चाहता था
और अगर JavaScript बंद भी कर रखा हो, तब भी क्या अचानक website अब भी code execute कर पाएगी?
इसलिए अब मुझे browser developers के नए formats अपनाने में धीमे रहने से ज्यादा सहानुभूति होने लगी है
WebP के JPEG की तुलना में फायदे बहुत बड़े नहीं हैं, मुख्य रूप से transparency वगैरह, और उसमें भी सफलता सीमित रही
लेकिन अब यह कई high-priority security holes तक पहुंच गया है, और जहां-जहां libwebp linked है वहां अगले एक महीने तक patches deploy करने पड़ेंगे
मेरा मतलब यह नहीं कि कुछ नया न किया जाए, लेकिन मुझे लगता है developers लागत को काफी ज्यादा underestimate करते हैं
यह सही है कि WebP ecosystem कहीं कम mature है, लेकिन मुझे यकीन है कि पुराने format handling code में भी काफी security issues रहे होंगे
फिर भी तर्क सही है। कुछ ही हफ्ते पहले तक netizens का माहौल था कि JPEG XL को जितनी जल्दी हो सके अपनाना चाहिए, और उसके लिए browser developer को बस “reference decoder code को codebase में शामिल कर देना” होगा, यानी “cost लगभग नहीं है”
दूसरे image formats और libraries भी संभवतः bugs से भरे होंगे, लेकिन बड़े software में इस्तेमाल नहीं होते, इसलिए कोई ध्यान नहीं देता
खासकर उन लोगों के लिए जिनके पास ऐसे bugs ढूंढकर exploit करने की क्षमता है, समय के मुकाबले reward खराब है
लंबे समय तक इस्तेमाल न होने से bugs कम नहीं होते
अगर image encoders और decoders, और दूसरे encoders/decoders unsafe languages का इस्तेमाल न करें, तो ऐसे bugs बनने की संभावना कम हो जाती है
इससे अलग, जरूरत से ज्यादा code को complex बनाने वाली culture और details को ठीक से न समझने वाले developers भी समस्या हैं
यह fix आज के Firefox 117.0.1 और Fenix 117.1.0 में शामिल है: https://hg.mozilla.org/releases/mozilla-release/rev/e245ca21...
संदर्भ के लिए, image crate में safe Rust में लिखा हुआ WebP decoder implementation है: https://github.com/image-rs/image
लंबे समय तक यह काफी अधूरा था, लेकिन पिछले साल कई WebP features implement हुए
Chromium के पास अब Rust dependencies के इस्तेमाल की अनुमति देने वाली policy है, तो क्या Chromium भी इसे adopt करना शुरू कर सकता है?
समस्या वाला मूल commit: https://github.com/webmproject/libwebp/commit/f75dfbf23d1df1...
इस bug को ठीक करने वाला commit: https://github.com/webmproject/libwebp/commit/902bc919033134...
मूल commit ने Huffman decoder को optimize किया था। यह decoder एक जानी-मानी optimization का इस्तेमाल करके N bits पहले से पढ़ता है, और तय करता है कि असल में कितने bits consume करने हैं और कौन-सा symbol decode करना है। या अगर वह कई symbols का N-bit prefix है, तो बाकी bits के लिए किस table को reference करना है, यह तय करता है
पुराने version में छोटे symbols के लिए lookup table इस्तेमाल होती थी, लेकिन लंबे symbols के लिए graph traversal चाहिए होता था। नए version ने lookup table array का इस्तेमाल करके सुधार किया। हर item में
(nbits, value)होता है, जहाँnbitsconsume किए जाने वाले bits की संख्या है औरvalueआम तौर पर symbol होता है। लेकिन अगरnbitsN से ज़्यादा हो, तोvalueको table index के रूप में interpret किया जाता है, औरnbitsको उस subtree में सबसे लंबे code length के रूप में फिर से interpret किया जाता है। इसलिए बाद की हर table में2^(nbits - N)items होने चाहिए। root table हमेशा2^Nitems पर fixed रहती हैनए version ने symbols की संख्या के आधार पर अधिकतम item count (
kTableSize) calculate किया था। जाहिर है Huffman tree untrusted input से आता है, औरnbitsके बहुत बड़ा हो जाने की कल्पना करना आसान है। VP8 Lossless खास तौर पर अधिकतम 15 bits तक allow करता है, इसलिए अगर सभी LUTs अपने-अपने अलग auxiliary table पर map हों, तो संभव अधिकतम table2^N + 2^15items की हो जाती है। इसे बनाने के लिए भी बहुत ज़्यादा symbols की जरूरत नहीं होती; हर table के लिए16-Nsymbols काफी हैंदिलचस्प बात यह है कि code में सिर्फ table size calculate करने वाला mode (
root_table == NULLके साथVP8LBuildHuffmanTablecall) मौजूद था, लेकिन किसी वजह से उसका इस्तेमाल नहीं हुआ और fixed maximum size assume कर लिया गया। इसलिए अगर Huffman tree को item count maximize करने के लिए बनाया जाए, तो allocated area से आगे write हो जाता हैयह क्यों हुआ, समझ आता है। Huffman decoding stage कई compression formats में सबसे ज्यादा compute-heavy हिस्सों में से एक होता है, इसलिए छोटा improvement भी मायने रखता है। ऊपर वाली optimization well-known है, लेकिन लंबे code path आम तौर पर rare माने जाते हैं, इसलिए उनकी optimization priority कम रही। मूल commit message ने इस assumption को rebut किया और merge हो पाया। memory-safe language इस समस्या को रोक पाती या नहीं, यह भी पक्का कहना मुश्किल है। क्योंकि यह उन rare मामलों में से है जहाँ overflow checks को actively avoid करने का मन होता है
[1] हालांकि memory corruption tight loop में नहीं, बल्कि table construction के दौरान होती है, इसलिए partial overflow checks काफी मददगार होते। actual fix ने
ReadSymbolfunction को बिल्कुल नहीं बदला। फिर भी tight loop की safety को justify करना जरूरी है, और गलत justification सब कुछ बिगाड़ सकती हैअगर यह बात सही है कि bounds checks की जरूरत नहीं है, तो ठीक है। WUFFS runtime bounds checks emit नहीं करता
लेकिन अगर software, इस बार की तरह, bounds से बाहर जाकर गलत है, तो WUFFS में यह compile नहीं होगा
आप सोच सकते हैं कि “यह असंभव है”, और अगर WUFFS एक general-purpose programming language होती तो यह सही बात होती। Rice's theorem के अनुसार कोई भी non-trivial semantic property undecidable होती है
सौभाग्य से WUFFS general-purpose language नहीं है। ज्यादातर software WUFFS में नहीं लिखे जा सकते, लेकिन image codecs लिखे जा सकते हैं
हालांकि यह भी सोचता हूँ कि क्या इस तरह की problem पकड़ने वाली automated tests बनाई जा सकती थीं
जिस code पर मैं personally काम करता हूँ, उसमें कुछ calculations को अलग functions में निकालकर independently test किया जा सकता है। यहाँ performance की वजह से मुश्किल रहा होगा, लेकिन पक्का नहीं कह सकता
BuildHuffmanTableमें out-of-bounds write का fixhttps://github.com/webmproject/libwebp/commit/902bc919033134...
इसका मतलब हो सकता है कि Google ने यह bug खोजने के बाद libwebp के लिए fuzzer को optimize किया, और इसलिए अब और bugs मिल रहे हैं
लगता है इसे Apple ने report किया था, और यह इस security update से बहुत मिलता-जुलता दिखता है: https://support.apple.com/en-us/HT213906
इसलिए यह काफी likely लगता है। हो सकता है Apple internally ImageIO में libwebp इस्तेमाल कर रहा हो, या उसने मिलती-जुलती गलती की हो
image codecs में vulnerabilities का लंबा इतिहास रहा है
actual image processing इतनी साफ linear code हो सकती है कि उसे memory-safe FORTRAN IV में भी लिखा जा सके, लेकिन compression आते ही variable-length data structures, pointer chasing वगैरह बहुत बढ़ जाते हैं
ऊपर से इसे तेजी से run कराने का pressure भी जुड़ जाता है
क्या इसका Electron पर भी असर है? अगर हाँ, तो किस version पर?
दिलचस्प बात यह है कि Signal Desktop, जो अंदरूनी तौर पर Electron का इस्तेमाल करता है, Linux पर sandbox के बिना चलता है [1][2]
[0] https://github.com/electron/electron/pull/39824
[1] https://github.com/signalapp/Signal-Desktop/issues/5195
[2] https://github.com/signalapp/Signal-Desktop/pull/4381
इसे practically exploit करने का कोई रास्ता है?
सुना है कि 64-bit पर heap spray अब practical नहीं रहा
क्या memory में ऐसा कोई predictable object है जिसे overwrite किया जा सके?
64-bit पर भी kernel exploits में heap spray अब भी साफ़ तौर पर इस्तेमाल होता है। V8 exploits में लोग कौन-से primitives इस्तेमाल करते हैं, यह मुझे ठीक से नहीं पता