Apa yang terjadi
Chainlit's MCP stdio transport hanya memvalidasi nama executable dari string perintah yang disuplai oleh pemanggil, bukan argumennya, dan menganggap allowlist yang tidak disetel sebagai permit-all, memungkinkan penyerang jaringan yang tidak terautentikasi mencapai OS command injection (CWE-78) melalui POST /mcp. Kelemahan pendamping (CVE-2026-45019, CVSS 7.2) mempengaruhi transports SSE/streamable-HTTP dengan SSRF karena endpoint yang sama menerima URL MCP upstream pilihan penyerang tanpa memvalidasi terhadap alamat loopback/internal.
Mengapa penting
Ini adalah pre-auth RCE yang tidak terautentikasi (CVSS 9.8) dalam framework aplikasi AI yang populer kapan pun fitur MCP — semakin menjadi cara default untuk menghubungkan agen LLM ke tools — diaktifkan. Penyerang tanpa kredensial dapat memperoleh eksekusi shell dengan privilege proses Chainlit, yang biasanya juga menyimpan kunci API penyedia LLM dan akses ke sumber data backend.
Vektor serangan
validate_mcp_command() dalam backend/chainlit/mcp.py hanya memeriksa nama executable dalam string fullCommand yang disuplai penyerang terhadap config.features.mcp.stdio.allowed_executables, kemudian meneruskan argumen sisa tanpa diperiksa ke StdioServerParameters. Jika allowed_executables tidak disetel (default), ini mengizinkan setiap executable daripada tidak ada, memungkinkan pemanggil yang tidak terautentikasi mengirimkan perintah seperti executable yang diizinkan dikombinasikan dengan flag yang mengeksekusi perintah shell arbitrer.
Sistem yang terdampak
Chainlit (framework conversational-AI Python) 2.4.0rc0 – 2.11.x
Mitigasi
Upgrade ke Chainlit 2.12.0; atur secara eksplisit dan batasi features.mcp.stdio.allowed_executables; nonaktifkan MCP jika tidak diperlukan; lihat security advisory Chainlit sendiri.