FlawOpen

flawopen.com/Teardowns/cve-2026-63277-libreoffice-calc-jdbc-classpath-rce

● CVE-2026-63277 · CVSS v4 8.5 · उच्च
सुरक्षा अनुसंधान · FlawOpen

CVE-2026-63277: Calc शीट खोलने पर Java कोड चलना

तैयार किए गए Calc दस्तावेज़ में बाहरी डेटा मैपिंग का उपयोग करके LibreOffice को शीट खोलने पर गैर-स्थानीय Java class path से JDBC ड्राइवर क्लास खोजने के लिए प्रेरित किया जा सकता था। LibreOffice 26.2.5 और 26.8.0 में ऐसी प्रविष्टियों के लिए केवल file scheme स्वीकार होती है। दस्तावेज़ किसी व्यक्ति को खोलना पड़ता है, इसलिए यह zero-click नेटवर्क दोष नहीं है।[1], [2], [3]

💡 आसान भाषा में (ELI5)

स्प्रेडशीट में यह नोट रखा जा सकता है कि डेटाबेस ड्राइवर कहाँ खोजना है। सुधार से पहले नोट किसी दूरस्थ पते की ओर इशारा कर सकता था और फ़ाइल खुलने पर वहाँ से Java कोड लोड हो सकता था। सुधार केवल file: scheme वाले पते स्वीकार करता है। इससे रास्ता सीमित होता है, लेकिन यह लेबल अपने-आप यह साबित नहीं करता कि हर लक्ष्य भौतिक रूप से स्थानीय है।[1], [4], [5]

इस पेज के मुख्य शब्द

बाहरी डेटा मैपिंग
Calc की ऐसी सेटिंग जो बताती है कि शीट बाहरी डेटा स्रोत से कैसे जुड़ती है।[1]
JDBC ड्राइवर
Java सॉफ़्टवेयर जो किसी एप्लिकेशन को डेटाबेस से संवाद करने देता है।[1]
Class path
वे स्थान जहाँ से Java क्लास और संबंधित संसाधन लोड कर सकता है।[4], [5]
CWE-829
अविश्वसनीय नियंत्रण क्षेत्र से कार्यक्षमता शामिल करना; यहाँ पथ अपेक्षित स्थानीय फ़ाइल scheme से बाहर का class-path URL स्वीकार करता था।[6], [1]

फ्रेमवर्क मैपिंग

  • इस गाइड में बताई गई कमजोरी के लिए CWE संदर्भ: CWE-829

मूल कारण विश्लेषण (Root Cause)

कमज़ोर jvmaccess::ClassPath::translateToUrls पथ हर Java class-path प्रविष्टि का विस्तार करके Java URL constructor को देता था और पहले scheme सीमित नहीं करता था। 26.2.5.2 स्रोत URI parsing जोड़ता है और Java URL बनाने से पहले उन प्रविष्टियों को अस्वीकार करता है जिनकी scheme file नहीं है। विक्रेता सलाह इस पथ को Calc external-data mapping और JDBC driver loading से जोड़ती है। तैयार दस्तावेज़ को किसी व्यक्ति द्वारा खोलना आवश्यक है; उद्धृत स्रोत zero-click reachability या वास्तविक हमलों में उपयोग सिद्ध नहीं करते। जाँच विशेष रूप से scheme की है: इसे सामान्य authorization नीति न कहें और यह दावा न करें कि यह हर remote file share को अस्वीकार करती है।[1], [4], [5]

CVE-2026-63277: Calc से Java लोडिंग की शर्तें

जाँचप्रभावित स्थिति या पुष्ट व्यवहाररक्षात्मक कार्रवाई
दस्तावेज़ से नियंत्रित इनपुटदस्तावेज़ की बाहरी डेटा मैपिंग JDBC ड्राइवर के class path को तय कर सकती है।दस्तावेज़ और अविश्वसनीय स्रोतों के links को अविश्वसनीय input मानें; सुधारा संस्करण स्थापित करें।
उपयोगकर्ता की कार्रवाईविक्रेता द्वारा बताए गए loading path तक पहुँचने के लिए व्यक्ति को दस्तावेज़ खोलना होगा।इसे zero-click न कहें; दस्तावेज़ पाने और खोलने के controls की समीक्षा करें।
सुधार की सीमाScheme जाँच यह साबित नहीं करती कि हर file: लक्ष्य भौतिक रूप से स्थानीय डिस्क पर है या नेटवर्क shares अस्वीकार होंगे।बदलाव को scheme validation के रूप में बताएँ; authorization या स्थान पर व्यापक गारंटी न दें।

हमले का चरण-दर-चरण प्रवाह

चरण 1

दस्तावेज़ में बाहरी डेटा मैपिंग है

प्रभावित दस्तावेज़ बाहरी स्रोत और Java database-driver class के लिए class path बताता है।[1], [4]

चरण 2

कोई व्यक्ति दस्तावेज़ खोलता है

उपयोगकर्ता की कार्रवाई आवश्यक है; कोई भी स्प्रेडशीट खोलना remote zero-click exploit के समान नहीं है।[1], [2]

चरण 3

Java class path URL में बदला जाता है

सुधार से पहले translateToUrls विस्तारित प्रविष्टि को Java URL constructor तक पहुँचाता था और यह नहीं जाँचता था कि scheme स्थानीय फ़ाइल की है।[4]

चरण 4

दिया गया ड्राइवर लोड हो सकता है

विक्रेता सलाह इस Java loading path का वर्णन करती है। असर दस्तावेज़, configuration और Java integration पर निर्भर है; यह न मानें कि हर Calc दस्तावेज़ या स्थापना समान रूप से प्रभावित है।[1], [2]

चरण 5

सुधारा संस्करण अन्य schemes रोकता है

LibreOffice 26.2.5.2 URI parse करता है और file न होने पर URL बनाने से पहले exception देता है। विक्रेता या वितरण का सुधारा build स्थापित करें।[5], [1]

सोर्स कोड: कमज़ोर बनाम सुरक्षित कार्यान्वयन

ये चुने हुए अंश version-pinned upstream translateToUrls implementation से लिए गए हैं। 26.2.4.2 प्रविष्टि का विस्तार करके सीधे Java URL बनाता है। 26.2.5.2 URI parsing जोड़ता है और URL बनाने से पहले file के अलावा schemes रोकता है। Diff scheme check दिखाता है; vendor advisory Calc/JDBC document path की पुष्टि करती है। यह source analysis है, runnable proof of concept नहीं।[4], [5], [1]

सोर्स अंश: jvmaccess/source/classpath.cxx — translateToUrls फ़ंक्शन

कमज़ोर कार्यान्वयन
// LibreOffice 26.2.4.2 — jvmaccess/source/classpath.cxx (कमज़ोर संस्करण)
if (!url.isEmpty()) {
    css::uno::Reference< css::uri::XVndSunStarExpandUrlReference >
        expUrl(
            css::uri::UriReferenceFactory::create(context)->parse(url),
            css::uno::UNO_QUERY);
    if (expUrl.is()) {
        css::uno::Reference< css::util::XMacroExpander > expander =
            css::util::theMacroExpander::get(context);
        try {
            url = expUrl->expand( expander );
        } catch (const css::lang::IllegalArgumentException & e) {
            css::uno::Any anyEx = cppu::getCaughtException();
            throw css::lang::WrappedTargetRuntimeException(
                "com.sun.star.lang.IllegalArgumentException: "
                 + e.Message,
                 nullptr, anyEx );
        }
    }
    jvalue arg;
    arg.l = environment->NewString(
        reinterpret_cast< jchar const * >(url.getStr()),
        static_cast< jsize >(url.getLength()));
    if (arg.l == nullptr) {
        return nullptr;
    }
    jobject o(environment->NewObjectA(classUrl, ctorUrl, &arg));
    if (o == nullptr) {
        return nullptr;
    }
    urls.push_back(o);
}
सुरक्षित और सुदृढ़ फ़िक्स
// LibreOffice 26.2.5.2 — jvmaccess/source/classpath.cxx (सुधारा गया संस्करण)
if (!url.isEmpty()) {
    css::uno::Reference< css::uri::XVndSunStarExpandUrlReference >
        expUrl(
            css::uri::UriReferenceFactory::create(context)->parse(url),
            css::uno::UNO_QUERY);
    if (expUrl.is()) {
        css::uno::Reference< css::util::XMacroExpander > expander =
            css::util::theMacroExpander::get(context);
        try {
            url = expUrl->expand( expander );
        } catch (const css::lang::IllegalArgumentException & e) {
            css::uno::Any anyEx = cppu::getCaughtException();
            throw css::lang::WrappedTargetRuntimeException(
                "com.sun.star.lang.IllegalArgumentException: "
                 + e.Message,
                 nullptr, anyEx );
        }
    }
    css::uno::Reference< css::uri::XUriReference > uriRef(
        css::uri::UriReferenceFactory::create(context)->parse(url));
    if (!uriRef.is() || !uriRef->getScheme().equalsIgnoreAsciiCase("file"))
    {
        throw css::lang::IllegalArgumentException(
            "non-local Java class path entry: " + url,
            css::uno::Reference< css::uno::XInterface >(), 0);
    }
    jvalue arg;
    arg.l = environment->NewString(
        reinterpret_cast< jchar const * >(url.getStr()),
        static_cast< jsize >(url.getLength()));
    if (arg.l == nullptr) {
        return nullptr;
    }
    jobject o(environment->NewObjectA(classUrl, ctorUrl, &arg));
    if (o == nullptr) {
        return nullptr;
    }
    urls.push_back(o);
}

इंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट

स्रोत