flawopen.com/Teardowns/cve-2026-63277-libreoffice-calc-jdbc-classpath-rce
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]
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]
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
| Pemeriksaan | Kondisi terdampak atau perilaku terkonfirmasi | Tindakan defensif |
|---|---|---|
| Masukan yang dikendalikan dokumen | Pemetaan 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 pengguna | Seseorang harus membuka dokumen untuk mencapai jalur pemuatan yang dijelaskan vendor. | Jangan menyebutnya zero-click; tinjau proses penerimaan dan pembukaan dokumen. |
| Batas perbaikan | Pemeriksaan 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
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]
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
// 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);
}
// 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
- ✓Perbarui ke LibreOffice 26.2.5 atau lebih baru pada jalur 26.2, atau 26.8.0 atau lebih baru pada jalur 26.8; periksa paket distribusi dan backport-nya.[1], [2]
- ✓Inventarisasi alur kerja yang membuka dokumen Calc dari sumber tidak tepercaya serta pemetaan eksternal yang bergantung pada driver JDBC.
- ✓Tambahkan uji regresi untuk memastikan skema class path selain
fileditolak sebelum URL Java dibuat dan entri berkas lokal yang didukung tetap berfungsi.[5] - ✓Jangan anggap peringatan makro sebagai perlindungan untuk jalur Java class path ini; nilai perilaku pembukaan dokumen dan konfigurasi Java secara terpisah.[1]
- ✓Advisory Apache menyatakan bahwa LibreOffice melaporkan masalah yang sama sebagai
CVE-2026-63277, sedangkan Apache OpenOffice melacaknya sebagaiCVE-2026-59265. Pastikan sendiri rilis AOO yang terdampak/sudah diperbaiki dan mitigasinya; jangan gunakan panduan versi LibreOffice.[8], [1] - ✓Jangan mereproduksi dokumen yang beredar atau payload Java jarak jauh saat pengujian; gunakan assertion terkontrol yang tidak menjalankan kode untuk memeriksa validasi skema.[1]