flawopen.com/Teardowns/cve-2026-63277-libreoffice-calc-jdbc-classpath-rce
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]
स्प्रेडशीट में यह नोट रखा जा सकता है कि डेटाबेस ड्राइवर कहाँ खोजना है। सुधार से पहले नोट किसी दूरस्थ पते की ओर इशारा कर सकता था और फ़ाइल खुलने पर वहाँ से Java कोड लोड हो सकता था। सुधार केवल file: scheme वाले पते स्वीकार करता है। इससे रास्ता सीमित होता है, लेकिन यह लेबल अपने-आप यह साबित नहीं करता कि हर लक्ष्य भौतिक रूप से स्थानीय है।[1], [4], [5]
इस पेज के मुख्य शब्द
बाहरी डेटा मैपिंग- Calc की ऐसी सेटिंग जो बताती है कि शीट बाहरी डेटा स्रोत से कैसे जुड़ती है।[1]
JDBC ड्राइवर- Java सॉफ़्टवेयर जो किसी एप्लिकेशन को डेटाबेस से संवाद करने देता है।[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 या स्थान पर व्यापक गारंटी न दें। |
हमले का चरण-दर-चरण प्रवाह
Java class path URL में बदला जाता है
सुधार से पहले translateToUrls विस्तारित प्रविष्टि को Java URL constructor तक पहुँचाता था और यह नहीं जाँचता था कि scheme स्थानीय फ़ाइल की है।[4]
सोर्स कोड: कमज़ोर बनाम सुरक्षित कार्यान्वयन
ये चुने हुए अंश 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);
}
इंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट
- ✓26.2 शाखा में LibreOffice 26.2.5 या नया, अथवा 26.8 शाखा में 26.8.0 या नया संस्करण लें; वितरण पैकेज और backport की जाँच करें।[1], [2]
- ✓उन workflows की सूची बनाएँ जो अविश्वसनीय स्रोतों के Calc दस्तावेज़ खोलते हैं और उन बाहरी mappings की पहचान करें जो JDBC drivers पर निर्भर हैं।
- ✓Regression test जोड़ें जो Java URL बनने से पहले
fileके अलावा दूसरी class-path schemes के अस्वीकार होने और समर्थित स्थानीय फ़ाइल प्रविष्टियों के काम करते रहने की पुष्टि करे।[5] - ✓Macro चेतावनियों को इस Java class-path पथ की सुरक्षा न मानें; दस्तावेज़ खोलने और Java configuration का अलग-अलग आकलन करें।[1]
- ✓Apache advisory के अनुसार LibreOffice ने इसी समस्या को
CVE-2026-63277के रूप में रिपोर्ट किया, जबकि Apache OpenOffice इसेCVE-2026-59265के रूप में ट्रैक करता है। AOO के अपने प्रभावित/ठीक किए गए संस्करण और mitigation की पुष्टि करें; LibreOffice के संस्करण लागू न करें।[8], [1] - ✓परीक्षण में प्रसारित दस्तावेज़ या दूरस्थ Java payload को दोबारा न बनाएँ; scheme validation की नियंत्रित, गैर-निष्पादित assertion का उपयोग करें।[1]