FlawOpen

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

● CVE-2026-63277 · CVSS v4 8.5 · Tinggi
Riset Keamanan · FlawOpen

CVE-2026-63277: eksekusi Java saat membuka spreadsheet Calc

Dokumen Calc yang disiapkan dapat memakai pemetaan data eksternal sehingga LibreOffice mencari kelas driver JDBC dari jalur Java nonlokal saat seseorang membuka spreadsheet. LibreOffice 26.2.5 dan 26.8.0 membatasi entri ini pada skema file. Dokumen harus dibuka oleh seseorang, jadi ini bukan kerentanan jaringan zero-click.[1], [2], [3]

💡 Penjelasan Sederhana (ELI5)

Spreadsheet dapat menyimpan catatan tentang lokasi program mencari driver basis data. Sebelum perbaikan, catatan itu dapat menunjuk ke alamat jarak jauh dan program dapat memuat kode Java dari sana saat seseorang membuka berkas. Perbaikan hanya menerima alamat dengan skema file:. Jalurnya menjadi lebih sempit, tetapi label tersebut saja tidak membuktikan bahwa setiap tujuan berada secara fisik di perangkat lokal.[1], [4], [5]

Konsep Kunci & Istilah

Pemetaan data eksternal
Pengaturan Calc yang menjelaskan cara lembar kerja terhubung ke sumber data eksternal.[1]
Driver JDBC
Perangkat lunak Java yang memungkinkan aplikasi berkomunikasi dengan basis data.[1]
Class path
Kumpulan lokasi tempat Java dapat memuat kelas dan sumber daya terkait.[4], [5]
CWE-829
Memasukkan fungsionalitas dari lingkup kendali yang tidak tepercaya; di sini, jalur menerima URL class path di luar skema berkas lokal yang dimaksud.[6], [1]

Pemetaan kerangka kerja

  • Referensi CWE untuk kelemahan yang dijelaskan dalam panduan ini: CWE-829

Analisis Akar Masalah (Root Cause)

Jalur rentan jvmaccess::ClassPath::translateToUrls memperluas setiap entri Java class path lalu meneruskannya ke konstruktor URL Java tanpa terlebih dahulu membatasi skemanya. Kode 26.2.5.2 menambahkan parsing URI dan menolak entri dengan skema selain file sebelum membuat URL Java. Peringatan vendor menghubungkan jalur ini dengan pemetaan data eksternal Calc dan pemuatan driver JDBC. Seseorang harus membuka dokumen yang disiapkan untuk mencapai jalur tersebut; sumber yang dikutip tidak membuktikan akses zero-click atau eksploitasi di dunia nyata. Pemeriksaan hanya memvalidasi skema: jangan menyebutnya kebijakan otorisasi umum atau mengklaim semua berbagi berkas jarak jauh ditolak.[1], [4], [5]

CVE-2026-63277: kondisi pemuatan Java dari Calc

PemeriksaanKondisi terdampak atau perilaku terkonfirmasiTindakan defensif
Masukan yang dikendalikan dokumenPemetaan data eksternal dalam dokumen dapat menentukan class path yang dipakai driver JDBC.Perlakukan dokumen dan tautan dari sumber tidak tepercaya sebagai masukan tidak tepercaya; pasang versi yang telah diperbaiki.
Interaksi penggunaSeseorang harus membuka dokumen untuk mencapai jalur pemuatan yang dijelaskan vendor.Jangan menyebutnya zero-click; tinjau proses penerimaan dan pembukaan dokumen.
Batas perbaikanPemeriksaan skema tidak membuktikan setiap tujuan file: berada di disk lokal secara fisik atau bahwa berbagi jaringan ditolak.Jelaskan perubahan sebagai validasi skema; jangan mengklaim jaminan otorisasi atau lokasi yang lebih luas.

Alur Serangan Langkah demi Langkah

Langkah 1

Dokumen memuat pemetaan data eksternal

Dokumen terdampak menjelaskan sumber eksternal dan class path untuk kelas driver basis data Java.[1], [4]

Langkah 2

Seseorang membuka dokumen

Interaksi pengguna diperlukan; membuka spreadsheet sembarang tidak sama dengan eksploit jarak jauh tanpa klik.[1], [2]

Langkah 3

Java class path diterjemahkan menjadi URL

Sebelum perbaikan, translateToUrls meneruskan entri yang diperluas ke konstruktor URL Java tanpa memeriksa apakah skemanya menunjuk ke berkas lokal.[4]

Langkah 4

Driver yang dirujuk dapat dimuat

Peringatan vendor menjelaskan jalur pemuatan Java ini. Dampak bergantung pada dokumen, konfigurasi, dan integrasi Java; jangan menyimpulkan semua dokumen atau instalasi Calc dapat dieksploitasi.[1], [2]

Langkah 5

Versi yang diperbaiki menolak skema lain

LibreOffice 26.2.5.2 mem-parsing URI dan melempar exception sebelum membuat URL kecuali skemanya file. Pasang build yang diperbaiki oleh vendor atau distribusi.[5], [1]

Kode Sumber: Rentan vs Aman

Cuplikan terfokus ini berasal dari implementasi upstream translateToUrls dengan versi yang ditetapkan. Versi 26.2.4.2 memperluas entri lalu langsung membuat URL Java. Versi 26.2.5.2 menambahkan parsing URI dan menolak skema selain file sebelum URL dibuat. Diff sumber membuktikan pemeriksaan skema; advisory vendor menjelaskan jalur dokumen Calc/JDBC. Ini analisis sumber, bukan proof of concept yang dapat dijalankan.[4], [5], [1]

Cuplikan sumber: jvmaccess/source/classpath.cxx — fungsi translateToUrls

IMPLEMENTASI RENTAN
// LibreOffice 26.2.4.2 — jvmaccess/source/classpath.cxx (versi rentan)
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);
}
PERBAIKAN AMAN & KUAT
// LibreOffice 26.2.5.2 — jvmaccess/source/classpath.cxx (versi yang diperbaiki)
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);
}

Daftar Periksa Penguatan Sistem Rekayasa

Sumber