事件经过
Chainlit的MCP stdio传输仅验证了调用者提供的命令字符串的可执行文件名,而不验证其参数,并将未设置的允许列表视为允许所有,使未认证的网络攻击者能够通过POST /mcp实现操作系统命令注入(CWE-78)。一个相关的漏洞(CVE-2026-45019,CVSS 7.2)影响SSE/streamable-HTTP传输,存在SSRF风险,因为同一端点接受攻击者选择的上游MCP URL,而不验证环回/内部地址。
影响分析
这是流行的AI应用框架中的未认证预认证RCE(CVSS 9.8),只要启用了MCP功能——越来越多成为将LLM代理连接到工具的默认方式。没有任何凭证的攻击者可以获得具有Chainlit进程权限的shell执行权限,该进程通常还持有LLM提供商API密钥和后端数据源的访问权限。
攻击途径
backend/chainlit/mcp.py中的validate_mcp_command()仅检查攻击者提供的fullCommand字符串中的可执行文件名是否在config.features.mcp.stdio.allowed_executables中,然后将剩余参数未经检查地传递给StdioServerParameters。如果allowed_executables未设置(默认情况),它允许所有可执行文件而不是都拒绝,使未认证的调用者能够提交一个允许的可执行文件与执行任意shell命令的标志相结合的命令。
受影响系统
Chainlit (Python对话式AI框架) 2.4.0rc0 – 2.11.x
缓解措施
升级到Chainlit 2.12.0;明确设置并限制features.mcp.stdio.allowed_executables;如不需要,禁用MCP;查看Chainlit自己的安全通告。