
CVE-2026-59827 पर ब्लॉग, असुरक्षित H2 क्वेरी आउटपुट डिसीरियलाइज़ेशन
GHSA-w95f-x9v9-wv36 | CVSS 9.9 गंभीर | CWE-502: अविश्वसनीय डेटा का डीसीरियलाइज़ेशन
CVE-2026-59827 एक गंभीर रिमोट कोड एक्ज़ीक्यूशन कमज़ोरी है, जो लोकप्रिय ओपन-सोर्स बिज़नेस इंटेलिजेंस और डेटा एनालिटिक्स प्लेटफ़ॉर्म Metabase में पाई गई है। यह दोष इस बात से उत्पन्न होता है कि Metabase H2 डेटाबेस कनेक्शन द्वारा लौटाए गए क्वेरी परिणामों को कैसे संभालता है। जब किसी H2 स्रोत के विरुद्ध एक नेटिव SQL क्वेरी OTHER टाइप के एक कॉलम को लौटाती है, तो Metabase बिना कोई सत्यापन किए उस कॉलम के कच्चे बाइट्स को एक जावा ऑब्जेक्ट में डीसीरियलाइज़ कर देता है। इसलिए एक प्रमाणित उपयोगकर्ता जो नेटिव क्वेरी चला सकता है, परिणाम सेट में एक दुर्भावनापूर्ण सीरियलाइज़्ड पेलोड को तस्करी कर सकता है और Metabase को होस्ट करने वाले सर्वर पर मनमाना कोड निष्पादन कर सकता है।
इस कमज़ोरी को 9.9 का CVSS स्कोर दिया गया था, जो आवश्यक न्यूनतम पूर्व शर्तों और सफल शोषण से होने वाले पूर्ण सर्वर-साइड कोड निष्पादन को दर्शाता है।
Metabase एक ही रिलीज़ चक्र से दो समानांतर संस्करण ट्रैक जारी करता है। ओपन-सोर्स संस्करण में 0 उपसर्ग वाले संस्करण संख्याएँ होती हैं — उदाहरण के लिए, v0.61.1। एंटरप्राइज़ (वाणिज्यिक) संस्करण में 1 उपसर्ग वाले संस्करण संख्याएँ होती हैं — उदाहरण के लिए, v1.61.1। दोनों संस्करण एक ही अंतर्निहित कोडबेस साझा करते हैं और एक साथ जारी किए जाते हैं, इसलिए एक कमज़ोरी जो v1.61.0 को प्रभावित करती है, वह v0.61.0 को भी समान रूप से प्रभावित करती है। इस पूरे लेखन में, संस्करण संख्याएँ एंटरप्राइज़ 1.xx उपसर्ग का उपयोग करके लिखी गई हैं, लेकिन प्रत्येक प्रभावित संस्करण सीधे अपने 0.xx ओपन-सोर्स समकक्ष से मैप करता है, जिसमें प्रमुख 1 को 0 से बदल दिया जाता है।
CVE-2026-59826 और CVE-2026-59827 दोनों को जुलाई 2026 में एक साथ खुलासा किया गया था। वे ओवरलैपिंग संस्करण श्रेणियाँ साझा करते हैं लेकिन अलग-अलग पैच पॉइंट हैं।
कमज़ोर एंटरप्राइज़ रिलीज़ 1.58.0 से 1.58.14, 1.59.0 से 1.59.11, 1.60.0 से 1.60.6.2, और 1.61.0 से 1.61.1.3 हैं। संबंधित ओपन-सोर्स रिलीज़ 0.58.0 से 0.58.14, 0.59.0 से 0.59.11, 0.60.0 से 0.60.6.2, और 0.61.0 से 0.61.1.3 हैं।
एक आंतरिक पैच पहले 1.61.1.4 (एंटरप्राइज़) और 0.61.1.4 (ओपन-सोर्स) के रूप में जारी किया गया था। 1.61 लाइन में पहली सार्वजनिक रूप से उपलब्ध निश्चित रिलीज़ 1.61.2 (v1.61.2.x / v0.61.2.x) है। Metabase Cloud उदाहरणों को प्रदाता द्वारा स्वचालित रूप से पैच किया गया था।
कमज़ोर एंटरप्राइज़ रिलीज़ 1.55.0 से 1.58.15.0, 1.59.0 से 1.59.11, 1.60.0 से 1.60.6.2, और 1.61.0 से पूरी 1.61.1.x लाइन हैं। पहली पूरी तरह से पैच की गई सार्वजनिक रिलीज़ 1.61.2 (v1.61.2.x / v0.61.2.x) है। CVE-2026-59826 का दायरा व्यापक है, जो 1.55 रिलीज़ लाइन तक वापस जाता है, जो अपर्याप्त रूप से सत्यापित डेटाबेस-निर्माण कोड पथ के लंबे समय से मौजूद होने को दर्शाता है।
जावा का सीरियलाइज़ेशन तंत्र एक ऑब्जेक्ट को मेमोरी में बाइट्स की एक फ्लैट स्ट्रीम में बदलने, संग्रहीत करने या प्रेषित करने, और फिर ObjectInputStream.readObject() को कॉल करके बाद में पुनर्निर्माण करने की अनुमति देता है। इस तंत्र का महत्वपूर्ण गुण यह है कि पुनर्निर्माण कोड को निष्पादित करता है। क्लास कंस्ट्रक्टर, readObject ओवरराइड और फ़ाइनलाइज़र सभी डीसीरियलाइज़ेशन के दौरान चलते हैं। यदि पढ़े जा रहे बाइट्स किसी अविश्वसनीय स्रोत से आते हैं, तो एक हमलावर JVM में पहले से लोड मौजूदा, वैध क्लासेस के अनुक्रम के माध्यम से मनमानी विधि कॉल को ट्रिगर करने के लिए उन्हें तैयार कर सकता है। इन अनुक्रमों को गैजेट चेन के रूप में जाना जाता है।
गैजेट चेन को एप्लिकेशन में कोई नया कोड पेश करने की आवश्यकता नहीं होती है। वे मौजूदा लाइब्रेरी क्लासेस के वायरिंग का शोषण करते हैं जिनकी सामान्य विधियाँ, जब डीसीरियलाइज़ेशन के दौरान सही क्रम में बुलाई जाती हैं, अंततः Runtime.exec() जैसे सिंक तक पहुँचती हैं। ysoserial जैसे टूल विशेष रूप से Apache Commons Collections, Spring Framework और अन्य जैसी व्यापक रूप से तैनात लाइब्रेरियों के लिए इन पेलोड को उत्पन्न करने के लिए मौजूद हैं।
H2 एक शुद्ध-जावा एम्बेडेड रिलेशनल डेटाबेस है। यह OTHER नामक एक विशेष SQL कॉलम प्रकार को परिभाषित करता है जो मनमाने जावा ऑब्जेक्ट्स के लिए पास-थ्रू के रूप में कार्य करता है। जब H2 किसी मान को OTHER कॉलम में संग्रहीत करता है, तो वह जावा के ObjectOutputStream द्वारा उत्पन्न बाइट्स लिखता है। जब वह मान वापस पढ़ता है, तो वह ऑब्जेक्ट को पुनर्निर्माण करने के लिए ObjectInputStream.readObject() को कॉल करता है। कच्चे सीरियलाइज़्ड बाइट्स को H2 के हेक्साडेसिमल लिटरल सिंटैक्स का उपयोग करके सीधे क्वेरी में भी आपूर्ति किया जा सकता है:
SELECT CAST(X'ACED0005...' AS OTHER);
-- or
SELECT X'ACED0005...'::OTHER;
ACED के बाद 0005 उपसर्ग जावा सीरियलाइज़ेशन स्ट्रीम मैजिक नंबर और प्रोटोकॉल संस्करण है। ACED0005 से शुरू होने वाली कोई भी हेक्स स्ट्रिंग एक जावा सीरियलाइज़्ड ऑब्जेक्ट स्ट्रीम है।
जब H2 इस क्वेरी को संसाधित करता है, तो वह डेटाबेस पक्ष पर हेक्स बाइट्स को डीसीरियलाइज़ करता है। परिणामी ऑब्जेक्ट तब JDBC ResultSet के माध्यम से कॉलिंग एप्लिकेशन को वापस भेज दिया जाता है। यदि एप्लिकेशन कॉलम मान का निरीक्षण करता है — उदाहरण के लिए, इसे प्रदर्शन के लिए फ़ॉर्मेट करने हेतु — तो यह अतिरिक्त प्रसंस्करण को ट्रिगर कर सकता है। कमज़ोर कोड पथ में Metabase बिल्कुल ऐसा ही करता है।
Metabase H2 ड्राइवर से JDBC ResultSet प्राप्त करता है और प्रत्येक मान को उपयोगकर्ता के लिए कैसे प्रस्तुत करना है, यह तय करने के लिए कॉलम मेटाडेटा का निरीक्षण करता है। जब यह JDBC प्रकार Types.OTHER (जिसे JAVA_OBJECT के रूप में भी रिपोर्ट किया जाता है) वाले कॉलम का सामना करता है, तो Metabase के कमज़ोर संस्करण एक प्रदर्शन योग्य प्रतिनिधित्व उत्पन्न करने के लिए कच्चे बाइट्स को डीसीरियलाइज़ करने का प्रयास करते हैं। यह डीसीरियलाइज़ेशन कॉल, ObjectInputStream.readObject(), बिना किसी व्हाइटलिस्ट फ़िल्टरिंग या क्लास सत्यापन के निष्पादित होता है।
घटनाओं का क्रम इस प्रकार है:
OTHER प्रकार का एक कॉलम लौटाती है जिसमें एक तैयार किया गया सीरियलाइज़्ड पेलोड होता है।ResultSet में JAVA_OBJECT कॉलम के रूप में कच्चे बाइट्स लौटाता है।OTHER कॉलम प्रकार का सामना करता है और बाइट्स पर readObject() को कॉल करता है।Runtime.exec() तक पहुँचती है और Metabase प्रक्रिया चलाने वाले OS उपयोगकर्ता के रूप में हमलावर के कमांड को निष्पादित करती है।पैच किए गए संस्करण किसी भी डीसीरियलाइज़ेशन का प्रयास करने से पहले JDBC परिणाम मेटाडेटा का निरीक्षण करके समस्या का समाधान करते हैं। यदि कोई कॉलम JAVA_OBJECT के रूप में टाइप किया गया है, तो Metabase इसे पार्स करने का प्रयास करने के बजाय सीधे अस्वीकार कर देता है।
शोषण के लिए प्रमाणीकरण आवश्यक है। हमलावर के पास H2-समर्थित डेटाबेस पर नेटिव क्वेरी निष्पादन अनुमति वाला Metabase खाता होना चाहिए। व्यवस्थापक खाते डिफ़ॉल्ट रूप से इसे संतुष्ट करते हैं। नियमित उपयोगकर्ता खाते भी इस आवश्यकता को संतुष्ट कर सकते हैं यदि किसी व्यवस्थापक ने उन्हें संबंधित डेटाबेस के लिए नेटिव क्वेरी डेटा अनुमति प्रदान की हो।
Metabase ने 2023 में जारी संस्करण 0.46.6.4 में नए डेटा वेयरहाउस कनेक्शन के रूप में H2 जोड़ने के समर्थन को हटा दिया था। व्यवस्थापक इंटरफ़ेस के माध्यम से एक नया H2 कनेक्शन पंजीकृत करने का प्रयास करने पर "H2 is not supported as a data warehouse" त्रुटि लौटती है। यह निष्कासन पहले की H2-संबंधित कमज़ोरियों की प्रतिक्रिया थी और इसका उद्देश्य हमलावर-नियंत्रित H2 उदाहरणों से जुड़ने के जोखिम को समाप्त करना था।