FlawOpen

flawopen.com/Teardowns/cve-2026-5027-langflow-multipart-file-write

● CVE-2026-5027 · CVSS 8.8[1], [2] · Tinggi
Riset Keamanan · FlawOpen

Langflow CVE-2026-5027: traversal path pada upload file

CVE-2026-5027 memungkinkan penulisan file di luar area unggah Langflow. GTIG melaporkan eksploitasi; perbarui ke 1.9.0+.[1], [2], [6]

Vektor CVSSCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H[1], [2]
💡 Penjelasan Sederhana (ELI5)

Sebuah ruang surat menerima paket dengan label dan tujuan yang dipilih pengirim. Jika petugas menggabungkan label itu ke folder ruang surat tanpa memeriksa jalur akhirnya, paket bisa tersimpan di luar ruang. Rute unggah Langflow memercayai nama multipart, sedangkan lapisan penyimpanan tidak memverifikasi secara terpisah bahwa jalur akhir tetap berada di dalam folder yang diizinkan.[2], [3]

Konsep Kunci & Istilah

CVE-2026-5027
ID dari Tenable untuk path traversal pada nama multipart POST /api/v2/files Langflow: CWE-22, CVSS 3.1 8,8, dengan hak akses rendah sebagai prasyarat.[1], [2]
Nama multipart
Nama yang diberikan klien pada Content-Disposition di unggahan multipart. Ini input tak tepercaya, bukan jalur file yang aman.[1], [2]
Pembatasan jalur
Pemeriksaan yang menyelesaikan jalur kandidat secara kanonis dan membuktikan bahwa jalur itu tetap berada di bawah direktori penyimpanan yang diizinkan sebelum file dibuat atau ditulis.[3], [4], [7]
Catatan ID
GHSA terkait dari Langflow mencantumkan CVE-2026-33309, sedangkan Tenable dan Google GTIG menggunakan CVE-2026-5027. Artikel ini mengikuti ID GTIG dan mempertahankan kedua catatan sumber tanpa menggabungkan metadata secara diam-diam.[4], [5], [6]

Pemetaan kerangka kerja

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

Analisis Akar Masalah (Root Cause)

Catatan Tenable untuk CVE-2026-5027 menjelaskan POST /api/v2/files yang menerima nama multipart dengan komponen traversal dan menulis file di luar direktori tujuan. Batas keamanan meliputi rute API dan penyimpanan lokal: validasi parameter URL tidak memvalidasi nama dari multipart Content-Disposition; menggabungkan nama ke folder juga tidak membuktikan jalurnya tetap terkandung. Vektor CVE mensyaratkan hak akses rendah (PR:L); jangan menyatakan bahwa CVE itu sendiri melewati autentikasi. Google GTIG memasukkan CVE-2026-5027 dalam daftar kerentanan yang dikonfirmasi dieksploitasi di dunia nyata, tetapi ringkasan publiknya tidak membuktikan eksekusi kode universal. Dampak lebih lanjut dari arbitrary file write bergantung pada jalur yang dapat ditulis, hak proses, dan konfigurasi deployment; perlakukan sebagai dampak bersyarat, bukan RCE yang pasti. GHSA terkait Langflow mencantumkan CVE-2026-33309 dan juga menunjuk perbaikan 1.9.0. Artikel ini mengikuti CVE-2026-5027 menurut Tenable dan GTIG serta menjelaskan perbedaan ID secara terbuka. Patch Langflow yang digabung memvalidasi nama di API dan menerapkan pembatasan jalur kanonis di lapisan penyimpanan, termasuk sebelum membuat direktori.[1], [2], [3], [4], [5], [6]

Alur Serangan Langkah demi Langkah

Langkah 1

Pengguna dengan hak rendah mencapai API unggahan

Vektor CVSS CVE-2026-5027 mensyaratkan hak rendah. Rute yang terdampak adalah POST /api/v2/files; catatan ini tidak membuktikan bypass autentikasi.[1], [2]

Langkah 2

Permintaan membawa nama multipart

Nama berasal dari metadata Content-Disposition yang dikendalikan klien. Validasi parameter URL tidak membersihkan sumber input terpisah ini.[1], [2], [4]

Langkah 3

Jalur melewati batas penyimpanan

Tanpa pemeriksaan pembatasan kanonis, komponen traversal dapat terselesaikan di luar folder unggahan.[1], [2], [3], [7]

Langkah 4

File ditulis di luar akar

Dampak terdokumentasi adalah arbitrary file write. Eksekusi kode bergantung pada jalur yang dapat ditulis, hak proses, dan deployment; tidak setiap unggahan menghasilkan RCE.[1], [2], [6]

Langkah 5

Perbaiki kedua batas validasi

Langflow menggabungkan validasi nama di API dan pembatasan kanonis di penyimpanan ke lini rilis 1.9.0. Perbarui dan verifikasi paket serta image yang berjalan.[2], [3], [4]

Kode Sumber: Rentan vs Aman

Ini contoh ringkas yang mengikuti bentuk kode sumber, bukan diff upstream kata demi kata. Jalur rentan menggunakan nama dari klien sebagai jalur penyimpanan. Pola yang diperkuat memvalidasi nama lalu memeriksa tujuan kanonis terhadap akar kanonis di lapisan penyimpanan; PR upstream juga menolak pemisah dan karakter kontrol serta memeriksa containment sebelum membuat direktori. Pertahankan pemeriksaan penyimpanan meski lapisan HTTP sudah memvalidasi input. Contoh ini memerlukan Python dengan Path.is_relative_to dan tidak sendirian mencegah race kondisi check/use pada direktori yang dapat ditulis penyerang. Produksi memerlukan operasi file yang tahan race dan izin ketat. Perlindungannya adalah pembatasan jalur, bukan sekadar daftar nama terlarang.[3], [2], [4], [7]

Cuplikan sumber: Langflow api/v2/files.py dan services/storage/local.py — contoh ringkas batas keamanan

IMPLEMENTASI RENTAN
# Contoh ringkas alur data yang rentan.
new_filename = file.filename
file_path = folder_path / new_filename
await write_upload(file, file_path)
PERBAIKAN AMAN & KUAT
from pathlib import Path

def confined_upload_path(root: Path, client_name: str | None) -> Path:
    name = Path(client_name or "").name
    if not name or name in {".", ".."} or chr(0) in name:
        raise ValueError("invalid upload filename")

    base = root.resolve()
    target = (base / name).resolve()
    if not target.is_relative_to(base):
        raise ValueError("upload path escapes storage root")
    return target

# Panggil ini di batas penyimpanan tepat sebelum membuat atau menulis.
target = confined_upload_path(upload_root, file.filename)
await write_upload(file, target)

Daftar Periksa Penguatan Sistem Rekayasa

Sumber