FlawOpen

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

● CVE-2026-63277 · CVSS v4 8.5 · Hoch
Sicherheitsforschung · FlawOpen

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]

💡 Einfache Erklärung (ELI5)

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]
Classpath
Menge der Orte, von denen Java Klassen und zugehörige Ressourcen laden kann.[4], [5]
CWE-829
Einbindung von Funktionalität aus einem nicht vertrauenswürdigen Kontrollbereich; hier akzeptierte der Pfad eine Classpath-URL außerhalb des vorgesehenen lokalen Dateischemas.[6], [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üfungBetroffene Bedingung oder bestätigtes VerhaltenSchutzmaßnahme
Vom Dokument gesteuerte EingabeDie 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.
BenutzerinteraktionEine 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 KorrekturDie 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

Schritt 1

Das Dokument enthält eine externe Datenverknüpfung

Das betroffene Dokument beschreibt eine externe Quelle und einen Classpath für eine Java-Datenbanktreiberklasse.[1], [4]

Schritt 2

Eine Person öffnet das Dokument

Benutzerinteraktion ist erforderlich; das Öffnen einer beliebigen Tabelle ist nicht gleichbedeutend mit einer entfernten Zero-Click-Ausnutzung.[1], [2]

Schritt 3

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]

Schritt 4

Der angegebene Treiber kann geladen werden

Der Herstellerhinweis beschreibt diesen Java-Ladepfad. Die Auswirkung hängt von Dokument, Konfiguration und Java-Integration ab; nicht jede Calc-Installation ist pauschal als ausnutzbar einzustufen.[1], [2]

Schritt 5

Die korrigierte Version weist andere Schemas ab

LibreOffice 26.2.5.2 analysiert den URI und löst vor der URL-Erstellung eine Ausnahme aus, sofern das Schema nicht file lautet. Installieren Sie einen korrigierten Hersteller- oder Distributionsbuild.[5], [1]

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

VERWUNDBARE IMPLEMENTIERUNG
// 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);
}
GEHÄRTETER SICHERHEITS-PATCH
// 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

Quellen