FlawOpen

flawopen.com/AI Security/litellm-mcp-preview-command-injection-cve-2026-42271

● CVE-2026-42271 · CVSS v4 8.7[1] · Tinggi
Riset Keamanan · FlawOpen

Injeksi Perintah MCP LiteLLM: CVE-2026-42271

GTIG mengonfirmasi eksploitasi CVE-2026-42271: kunci LiteLLM valid dapat menjalankan perintah lewat pratinjau MCP. Perbarui ke 1.83.7+.[1], [6], [8]

Vektor CVSSCVSS:4.0/AV:N/AC:L/AT:P/PR:L/UI:N/VC:H/VI:H/VA:H/SC:H/SI:N/SA:N[1]
💡 Penjelasan Sederhana (ELI5)

Bengkel mengizinkan pengunjung mencoba alat sebelum menambahkannya. Meja pratinjau dapat menyalakan mesin bengkel yang kuat, jadi hanya pengawas yang boleh memberinya instruksi. Pada versi LiteLLM yang rentan, siapa pun dengan kartu akses yang diterima dapat mencapai meja itu. Cacat Starlette yang terpisah juga dapat mengecoh penjaga yang menentukan akses dari URL yang dibangun ulang. Setiap batas ini perlu diperbaiki sendiri. Di loket lain, pengunjung dapat menulis garis miring atau tanda tanya pada label paket. Petugas menempelkan teks itu saat menyusun ulang alamat dan mengiranya sebagai rute baru, padahal paket tetap melewati lorong semula. Inilah kebingungan Host dan path yang terpisah pada Starlette.[1], [3], [5]

Konsep Kunci & Istilah

Model Context Protocol (MCP)
Protokol yang memungkinkan aplikasi seperti gateway AI terhubung ke alat dan sumber data eksternal. Endpoint pratinjau LiteLLM menguji konfigurasi server MCP sebelum disimpan.[1]
Transport stdio
Mode koneksi MCP yang memulai proses anak lokal dan bertukar pesan melalui masukan serta keluaran standar. Proses berjalan pada host proxy LiteLLM dengan hak sistem operasi milik layanan proxy.[1], [2]
Otorisasi berbasis peran
Pemeriksaan di sisi server yang hanya mengizinkan identitas dengan peran yang disyaratkan untuk menjalankan operasi. CVE-2026-42271 tidak menerapkan pemeriksaan PROXY_ADMIN pada rute pratinjau, padahal pemeriksaan itu ada pada operasi penyimpanan.[1], [2]
CVE-2026-48710 (Starlette BadHost)
Cacat Starlette yang terpisah: header Host yang tidak valid dapat membuat request.url.path berbeda dari path yang dipakai perutean. Horizon3 melaporkan bahwa hal ini dapat melewati autentikasi berbasis path LiteLLM pada kombinasi dependensi tertentu; ini bukan bagian dari CVE-2026-42271.[3], [5], [4]
Allowlist perintah MCP stdio
Kumpulan basename executable yang diterima LiteLLM untuk transport stdio. Daftar ini diperiksa saat validasi konfigurasi dan sekali lagi sebelum membuat klien untuk catatan lama. Ini bukan sandbox karena runtime yang diizinkan dapat menafsirkan argumen yang diberikan.[8]

Pemetaan kerangka kerja

Alur Serangan Langkah demi Langkah

Langkah 1

Pastikan versi LiteLLM dan paparan endpoint

Advisory maintainer menyebut LiteLLM >=1.74.2 dan <1.83.7 terdampak serta mensyaratkan API key proxy yang valid; sebelum patch, semua pemegang key terautentikasi, termasuk key pengguna internal berhak rendah, dapat mengakses endpoint pratinjau. GTIG memasukkan CVE-2026-42271 dalam daftar eksploitasi terkonfirmasi; untuk prasyarat CVE ini, gunakan model ancaman terautentikasi dari advisory maintainer.[1], [6]

Langkah 2

Kunci berhak rendah mencapai operasi pratinjau administratif

Endpoint menerima konfigurasi server MCP lengkap, termasuk perintah stdio, argumen, dan variabel lingkungan. Server mengautentikasi kunci tetapi tidak memeriksa peran PROXY_ADMIN, sehingga pemegang kunci terautentikasi mana pun dapat menjalankan pratinjau.[1]

Langkah 3

Pratinjau memulai proses pada host proxy

Untuk menguji konfigurasi stdio yang dikirim, LiteLLM membuat klien MCP dan memulai proses anak yang dikonfigurasi dengan hak layanan proxy. Ini merupakan eksekusi perintah pada host gateway, bukan sekadar model AI mengembalikan teks yang tidak aman.[2], [8]

Langkah 4

Cacat Starlette yang terpisah dapat melemahkan batas autentikasi

Horizon3 melaporkan CVE-2026-48710 dapat membuat autentikasi berbasis path melihat request.url.path yang berbeda dari rute yang dipilih Starlette ketika versi terdampak digunakan. Peneliti melaporkan menggabungkannya dengan CVE-2026-42271 untuk menghapus prasyarat kunci API pada deployment terdampak. Atribusikan rantai ini kepada peneliti; akar masalah dan patch kedua CVE berbeda.[5], [3], [4]

Langkah 5

Perbaiki kedua batas dan verifikasi paket yang benar-benar terpasang

LiteLLM 1.83.7 memperbaiki endpoint pratinjau: keduanya kini memerlukan PROXY_ADMIN dan tools/list memiliki autentikasi eksplisit. Patch juga memvalidasi allowlist perintah pada permintaan pembuatan/pembaruan dan mengulanginya di _create_mcp_client untuk menangani konfigurasi lama. Allowlist bukan sandbox; runtime yang diizinkan tetap dapat menafsirkan argumen. Starlette secara terpisah memperbaiki CVE-2026-48710 pada 1.0.1; verifikasi kombinasi paket yang benar-benar terpasang dan nilai rantai yang dilaporkan secara terpisah.[1], [8], [4], [7]

Langkah 6

Konteks kampanye terbaru (dilaporkan 7 Oktober 2026)

Black Lotus Labs melaporkan bahwa sampel malware PoeLLM kemungkinan menargetkan /mcp-rest/test/connection; BleepingComputer juga melaporkan upaya eksploitasi CVE-2026-42271 dalam kampanye tersebut. Laporan itu tidak membuktikan bahwa semua host yang terinfeksi dikompromikan melalui CVE ini atau bahwa setiap target LiteLLM rentan. Perlakukan ini sebagai bukti penargetan terkini, bukan jumlah korban yang dapat dikaitkan dengan celah ini.[9], [10]

Analisis Akar Masalah (Root Cause)

Masalah LiteLLM berasal dari tidak adanya pemeriksaan peran pada kedua rute pratinjau MCP: setiap kunci API proxy yang valid dapat memanggilnya tanpa peran PROXY_ADMIN. Pratinjau koneksi menerima konfigurasi stdio dari pemanggil dan menjalankan perintah dengan hak proses proxy. Kerentanan Starlette yang terpisah memungkinkan header Host yang cacat membuat request.url.path berbeda dari jalur yang dirutekan Starlette; Horizon3 melaporkan bahwa validasi kunci API berbasis jalur dapat dilewati jika perilaku ini dirangkai dengan LiteLLM. Keduanya merupakan kerentanan terpisah: perbaiki batas otorisasi dan eksekusi perintah LiteLLM, lalu perbarui Starlette ke versi 1.0.1 atau yang lebih baru.[1], [8], [3], [4], [5]

Kode Sumber: Rentan vs Aman

Cuplikan ini menunjukkan patch LiteLLM yang sudah digabung pada batas eksekusi: basename perintah diperiksa sebelum klien stdio dibuat, sehingga catatan DB/konfigurasi lama juga melewati pemeriksaan. Patch juga memvalidasi permintaan pembuatan dan pembaruan server serta membatasi kedua endpoint pratinjau untuk PROXY_ADMIN; /test/tools/list juga mendapat dependensi user_api_key_auth secara eksplisit. Allowlist bukan sandbox: runtime yang diizinkan tetap dapat menafsirkan argumennya. Batasi pratinjau untuk admin dan jalankan proxy dengan hak minimum.[1], [2], [8]

Cuplikan sumber: Cuplikan validasi klien stdio LiteLLM

IMPLEMENTASI RENTAN
# _create_mcp_client sebelum pemeriksaan perintah stdio ditambahkan.
if server.command and server.args is not None:
    stdio_config = MCPStdioConfig(
        command=server.command,
        args=server.args,
        env=resolved_env,
    )
PERBAIKAN AMAN & KUAT
# _create_mcp_client: validasi ulang catatan DB/konfigurasi lama.
if server.command:
    base_command = os.path.basename(server.command)
    if base_command not in MCP_STDIO_ALLOWED_COMMANDS:
        raise HTTPException(
            status_code=403,
            detail="MCP stdio command is not in the allowlist",
        )

if server.command and server.args is not None:
    stdio_config = MCPStdioConfig(
        command=server.command,
        args=server.args,
        env=resolved_env,
    )

Daftar Periksa Penguatan Sistem Rekayasa

Sumber

← AI Security Directory →