flawopen.com/Teardowns/cve-2026-63277-libreoffice-calc-jdbc-classpath-rce
CVE-2026-63277: Java-Code beim Öffnen einer Calc-Tabelle
Ein präpariertes Calc-Dokument konnte über eine externe Datenverknüpfung bewirken, dass LibreOffice beim Öffnen eine JDBC-Treiberklasse aus einem nicht lokalen Java-Classpath auflöste. LibreOffice 26.2.5 und 26.8.0 lassen dafür nur Einträge mit dem Schema file zu. Eine Person muss das Dokument öffnen; es handelt sich daher nicht um eine Zero-Click-Netzwerkschwachstelle.[1], [2], [3]
Eine Tabelle kann einen Vermerk enthalten, wo das Programm einen Datenbanktreiber suchen soll. Vor der Korrektur konnte dieser Vermerk auf eine entfernte Adresse zeigen, von der beim Öffnen der Datei Java-Code geladen werden konnte. Die Korrektur akzeptiert nur Adressen mit dem Schema file:. Das schränkt den Weg ein, beweist aber nicht allein durch die Kennzeichnung, dass jedes Ziel physisch lokal ist.[1], [4], [5]
Kernkonzepte & Begriffe
Externe Datenverknüpfung- Calc-Einstellung, die beschreibt, wie das Tabellenblatt eine externe Datenquelle erreicht.[1]
JDBC-Treiber- Java-Software, mit der eine Anwendung mit einer Datenbank kommunizieren kann.[1]
Framework-Zuordnungen
- CWE-Referenz für die in diesem Leitfaden beschriebene Schwachstelle: CWE-829
Ursachenanalyse
Der verwundbare Pfad jvmaccess::ClassPath::translateToUrls erweiterte jeden Java-Classpath-Eintrag und übergab ihn an den Java-URL-Konstruktor, ohne zuvor das Schema einzuschränken. Der Quellstand 26.2.5.2 ergänzt die URI-Analyse und lehnt Einträge mit einem anderen Schema als file vor der Java-URL-Erstellung ab. Der Herstellerhinweis verbindet diesen Pfad mit externen Calc-Datenverknüpfungen und dem Laden von JDBC-Treibern. Eine Person muss ein präpariertes Dokument öffnen; die genannten Quellen belegen weder Zero-Click-Erreichbarkeit noch aktive Ausnutzung. Die Schutzprüfung betrifft ausdrücklich das Schema: Sie ist weder als allgemeine Autorisierungsrichtlinie zu beschreiben noch als Ablehnung jeder entfernten Dateifreigabe.[1], [4], [5]
CVE-2026-63277: Bedingungen für Java-Ladevorgänge aus Calc
| Prüfung | Betroffene Bedingung oder bestätigtes Verhalten | Schutzmaßnahme |
|---|---|---|
| Vom Dokument gesteuerte Eingabe | Die externe Datenverknüpfung kann den Classpath-Pfad für den JDBC-Treiber festlegen. | Behandeln Sie Dokumente und Verknüpfungen aus nicht vertrauenswürdigen Quellen als nicht vertrauenswürdige Eingaben; installieren Sie eine korrigierte Version. |
| Benutzerinteraktion | Eine Person muss das Dokument öffnen, um den vom Hersteller beschriebenen Ladepfad zu erreichen. | Nicht als Zero-Click-Schwachstelle darstellen; Prozesse für Empfang und Öffnen von Dokumenten prüfen. |
| Grenze der Korrektur | Die Schema-Prüfung belegt weder, dass jedes file:-Ziel auf einem lokalen Datenträger liegt, noch dass Netzwerkfreigaben abgewiesen werden. | Die Änderung als Schema-Prüfung beschreiben und keine weitergehende Garantie zu Berechtigung oder Speicherort behaupten. |
Schritt-für-Schritt Angriffsablauf
Der Java-Classpath wird in URLs übersetzt
Vor der Korrektur übergab translateToUrls einen erweiterten Eintrag an den Java-URL-Konstruktor, ohne auf ein lokales Dateischema zu prüfen.[4]
Quellcode: Verwundbar vs. Sicher
Diese gezielten Ausschnitte stammen aus der versionsgebundenen Upstream-Implementierung von translateToUrls. 26.2.4.2 erweitert den Eintrag und erstellt danach unmittelbar eine Java-URL. 26.2.5.2 ergänzt die URI-Analyse und weist andere Schemas als file vor dieser Erstellung ab. Der Diff belegt die Schema-Prüfung; der Herstellerhinweis belegt den Calc-/JDBC-Dokumentpfad. Dies ist Quellcodeanalyse, kein ausführbarer Proof of Concept.[4], [5], [1]
Quelltextauszug: jvmaccess/source/classpath.cxx — Funktion translateToUrls
// LibreOffice 26.2.4.2 — jvmaccess/source/classpath.cxx (verwundbare Version)
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 (korrigierte Version)
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);
}
Checkliste für Engineering & Systemsicherheit
- ✓Aktualisieren Sie auf LibreOffice 26.2.5 oder neuer im 26.2-Zweig oder auf 26.8.0 oder neuer im 26.8-Zweig; prüfen Sie das Distributionspaket und mögliche Backports.[1], [2]
- ✓Erfassen Sie Abläufe, die Calc-Dokumente aus nicht vertrauenswürdigen Quellen öffnen, sowie externe Datenverknüpfungen mit JDBC-Treibern.
- ✓Ergänzen Sie einen Regressionstest: Andere Classpath-Schemas als
filemüssen vor der Java-URL-Erstellung abgewiesen werden, zulässige lokale Dateieinträge müssen weiter funktionieren.[5] - ✓Makro-Warnungen schützen nicht vor diesem Java-Classpath-Pfad; bewerten Sie das Öffnen von Dokumenten und die Java-Konfiguration getrennt.[1]
- ✓Laut Apache-Hinweis hat LibreOffice dasselbe Problem als
CVE-2026-63277gemeldet; Apache OpenOffice führt es unterCVE-2026-59265. Prüfen Sie die für AOO geltenden betroffenen und behobenen Versionen sowie die zugehörige Abhilfe; übernehmen Sie nicht die LibreOffice-Versionen.[8], [1] - ✓Reproduzieren Sie beim Testen weder das verbreitete Dokument noch das entfernte Java-Payload; verwenden Sie eine kontrollierte, nicht ausführbare Assertion zur Schema-Prüfung.[1]