CVE-2026-45018 是 Chainlit Python 框架中的一个关键非认证远程代码执行(RCE)漏洞。当启用模型上下文协议(MCP)功能时,攻击者可以通过端点注入任意操作系统命令。现成可用的概念验证已公开。然而,自 2.7.0 版本起,Chainlit 部署默认禁用了 MCP 功能,造成配置障碍。该漏洞被归类为TIER 2,因为非默认前提条件阻止了TIER 1的资格,尽管典型AI聊天部署的影响大且面向公众,因此应及时缓解和补丁处理。/mcp

2026 年 8 月 25 日,Chainlit 发布 2.12.0 安全版本,修复 CVE-2026-45018:开启 MCP 后,未认证攻击者可能通过 stdio 连接参数在服务器执行系统命令。漏洞 CVSS 为 9.8,影响 2.4.0rc02.11.1

理由

  • (a) 野生利用状态:无法确认野外开发。没有CISA KEV列表、威胁情报源,也没有厂商确认活跃的野生利用。

  • (b)面向公众的默认部署:是的。Chainlit 是一个用于构建对话式 AI 应用的框架,这些应用通常作为互联网可访问的网页界面或内部 Web 服务部署。

  • (c) 所有利用先决条件默认存在?不。利用严格要求在 中。厂商明确表示,自2.7.0版本起,MCP默认被禁用。这是一道屏障。features.mcp.enabled = true.chainlit/config.tomlnicheConfig

  • (d) 可采取的缓解措施:是的。禁用MCP()、启用认证或升级到v2.12.0可以完全缓解这个问题。features.mcp.enabled = false

  • (e) PoC 质量:即用即用。供应商公告包含一个完整的、经过测试的基于 curl 的漏洞利用脚本。

  • (f) 路径匹配:TIER 2(情况3:面向公众,高影响,PoC可用,但存在配置障碍)。TIER 1路径A被明确排除,因为默认禁用了所需的利用条件。

  • (g) 最后一级:第二层。Decisive Signals:未经认证的RCE,具有现成的PoC,通常面向公众的框架,仅因默认关闭MCP功能而从TIER 1降级。

漏洞概述

  • 根本原因:函数中的操作系统命令注入(CWE-78)。validate_mcp_command()

  • 机制:该函数仅验证可执行名与允许列表的关联,但将用户控制的参数未勾选传递给子进程。

  • CVSS:9.8(关键)——网络,低复杂度,无权限,无交互,范围未变,高C/I/A。

受影响的系统

  • 产品:Chainlit(用于对话式AI的Python框架)。

  • 版本:v2.4.0rc0 到 v2.11.x。

  • 部署背景:通常部署为面向网页的AI聊天应用或内部开发工具。需要明确选择加入MCP功能才会有漏洞。

利用机制

  1. 攻击者建立一个 Socket.IO 会话以获得一个 。sessionId

  2. 攻击者发送了带有 和 的恶意请求。POST /mcpclientType: "stdio"fullCommand

  3. 有效载荷示例:。可执行文件通过了允许列表检查,但参数执行任意壳命令。"npx -y -c 'id > /tmp/rce_proof'"npx-c

  4. 服务器在MCP握手完成前生成子进程,并以Chainlit进程权限执行该有效载荷。

攻击路径 / 杀戮链

  • 位置:初始访问。

  • 实用性:高。在主机上提供未经认证的RCE。

  • 障碍:——需要。启用此功能后无需身份验证或用户交互。nicheConfigfeatures.mcp.enabled = true

  • 米特尔·阿特&克:初始访问(T1190),执行(T1059)。

通过MCP streamable-http / SSE实现SSRF

描述

端点接受任意的,客户端在 是 或 时接受的。该URL直接传递给MCP SDK的 没有方案检查、没有主机名验证、也没有允许列表的 HTTP 客户端。攻击者还 控制所有HTTP头,使头注入攻击成为可能。POST /mcpurlheadersclientType"sse""streamable-http"

攻击者可以强制 Chainlit 服务器向内部发送 HTTP 请求 服务(云元数据端点、内部API、数据库)和Forge敏感头部 (, , ) 在这些请求中:AuthorizationCookieX-Internal-Secret

{
  "sessionId": "<valid session>",
  "clientType": "streamable-http",
  "url": "http://169.254.169.254/latest/meta-data/iam/security-credentials/",
  "headers": { "Authorization": "Bearer attacker-controlled-token" }
}