flawopen.com/Teardowns/cve-2026-105697-langflow-mcp-stdio-command-injection
CVE-2026-105697: injeksi perintah MCP Langflow
Sebelum versi 1.10.3, Langflow meneruskan konfigurasi MCP stdio ke proses yang dijalankan melalui shell. Pada instance yang terekspos dengan LANGFLOW_AUTO_LOGIN=true, penyerang dapat memperoleh token tanpa kredensial; saat auto-login dinonaktifkan, pengguna terautentikasi non-admin tetap dapat mencapai eksekusi perintah pada host. Versi 1.10.3 memvalidasi setiap jalur hingga tepat sebelum proses dimulai dan menjalankan program tanpa shell.[1], [2], [3]
Bayangkan seorang petugas menerima kalimat yang tanda bacanya dapat mengubah tugas: satu tanda bisa mengubah instruksi pengiriman menjadi perintah kedua. Langflow meneruskan perintah yang dikonfigurasi ke shell yang menafsirkan sintaks tersebut sebagai kendali, alih-alih memperlakukan program dan argumennya sebagai data terpisah. Perbaikan memvalidasi perintah yang diizinkan lalu menjalankan program secara langsung tanpa shell.[1], [2]
Konsep Kunci & Istilah
Transport MCP stdio- Menjalankan server MCP sebagai proses anak lokal dan bertukar pesan melalui input serta output standar.[1], [2]
Injeksi perintah (CWE-78)- Teks yang dipengaruhi pihak luar mengubah perintah sistem operasi yang diberikan ke shell atau peluncur proses.[1], [5]
Pemetaan kerangka kerja
- Referensi CWE untuk kelemahan yang dijelaskan dalam panduan ini: CWE-78
Analisis Akar Masalah (Root Cause)
Sebelum versi 1.10.3, konfigurasi MCP stdio menggabungkan perintah dan argumen menjadi string, lalu menjalankannya dengan bash -c. API pengaturan mendapat daftar izin serta pemeriksaan argumen dan lingkungan pada versi 1.9.0, tetapi konfigurasi MCP Tools di dalam flow atau tweak dapat melewati validasi model karena titik eksekusi tidak menerapkan kebijakan bersama. Langflow 1.10.3 memusatkan validasi pada lfx.base.mcp.security.validate_mcp_stdio_config, menerapkannya pada API, flow, tweak, komponen lama, dan tepat sebelum proses dimulai, lalu menghapus shell perantara. CVE-2026-105697 adalah CWE-78 dengan CVSS 3.1 sebesar 9.9. Jika auto-login dinonaktifkan, penyerang tetap memerlukan pengguna terautentikasi non-admin yang dapat mengonfigurasi atau menjalankan jalur MCP terkait; auto-login bawaan dapat membuat instance pengembangan yang terekspos dapat dijangkau tanpa kredensial.[1], [2], [4], [5]
Alur Serangan Langkah demi Langkah
Pengguna mencapai jalur konfigurasi MCP
Advisori menjelaskan akses melalui pengaturan server MCP atau flow yang memakai komponen MCP Tools. Pada instance yang terekspos dengan nilai default pengembangan LANGFLOW_AUTO_LOGIN=true, penyerang dapat memperoleh token tanpa kredensial. Jika auto-login dinonaktifkan, pengguna terautentikasi non-admin masih dapat mencukupi.[1]
Konfigurasi mencapai persiapan proses
Perintah dan argumen menjadi command_str saat Langflow menyiapkan koneksi MCP stdio.[1]
Shell menafsirkan string
Sebelum 1.10.3, jalur peluncuran memakai bash -c; perintah berjalan saat percobaan koneksi, sebelum handshake MCP berhasil.[1]
Pemeriksaan jalur masuk belum lengkap
Versi 1.9.0 memvalidasi pengaturan REST, tetapi konfigurasi flow dan tweak dapat melewati validasi model tersebut.[1]
Proses host berjalan dengan hak Langflow
Perintah berjalan sebagai pengguna layanan Langflow. UI masih dapat melaporkan bahwa server MCP gagal dimulai.[1]
Kode Sumber: Rentan vs Aman
Cuplikan rentan menunjukkan pola peluncuran melalui shell yang dijelaskan dalam advisori; ini bukan exploit yang dapat dijalankan. Cuplikan perbaikan merangkum desain 1.10.3: kebijakan bersama memvalidasi konfigurasi pada setiap jalur masuk dan sekali lagi tepat sebelum proses dibuat, sedangkan API menerima executable dan argumen secara terpisah. Peluncuran langsung menghilangkan interpretasi shell, tetapi tidak otomatis membuat semua executable atau paket yang diizinkan aman; operator juga perlu menerapkan kontrol sumber paket dan isolasi yang sesuai.[1], [2]
Cuplikan sumber: lfx/base/mcp/util.py — cuplikan kode terarah
# Bentuk peluncuran terdampak dalam advisori (cuplikan terfokus):
server_params = StdioServerParameters(
command="bash",
args=["-c", f"exec {command_str}"],
env=env_data,
)
# Ringkasan berbasis sumber 1.10.3: validasi kebijakan, lalu jalankan proses secara langsung.
command_parts = shlex.split(command_str)
if not command_parts:
raise ValueError("MCP stdio command is required")
command, args = command_parts[0], command_parts[1:]
validate_mcp_stdio_config(command, args, env_data) # Repeat at the execution boundary.
server_params = StdioServerParameters(
command=command,
args=args,
env=env_data,
) # No shell wrapper. The shared validator rejects disallowed configurations.
Daftar Periksa Penguatan Sistem Rekayasa
- ✓Perbarui
langflowke 1.10.3+,langflow-baseke 0.10.3+, danlfxke 1.10.3+; verifikasi versi paket yang benar-benar diterapkan.[1], [3] - ✓Jangan anggap pemeriksaan model REST 1.9.0 sebagai perbaikan lengkap; tinjau konfigurasi MCP di dalam flow dan tweak pada versi lama.[1]
- ✓Validasi perintah, argumen, lingkungan, sumber paket, dan kebijakan isolasi pada setiap jalur masuk serta tepat sebelum proses dibuat.[1], [2]
- ✓Kirim executable dan vektor argumen secara terpisah ke API proses; hindari menyusun string perintah shell.[2]
- ✓Untuk deployment multi-tenant, tetapkan paket
npx/uvxyang diizinkan dan aktifkan penguatan interpreter serta Docker yang didokumentasikan.[1] - ✓Rekomendasi respons insiden FlawOpen: Tinjau siapa yang dapat mengonfigurasi atau menjalankan koneksi MCP stdio selama versi rentan terekspos; periksa telemetri host untuk proses anak Langflow yang tidak terduga.[1]
- ✓Tambahkan pengujian regresi bagi REST API, flow, tweak, komponen lama, dan jalur sebelum spawn; pastikan konfigurasi yang ditolak tidak membuat proses.[2]