CVE-2026-120492: Chainlit: SSRF via semicolon bypass of MCP allowed_urls
MEDIUMChainlit 2.12.0 fails to reject the semicolon character when validating MCP URLs, so an unauthenticated attacker can submit '..;' path segments to the /mcp endpoint and escape the path scope an operator granted, but only on origins that strip semicolon path parameters. Exploitation is rated high complexity because it depends on the backend's path normalization, and the impact is limited to low confidentiality and integrity with a changed scope (CVSS 5.4). There is no KEV listing, no public exploit, no Nuclei template and no EPSS data, so near-term mass exploitation looks unlikely. It still matters for any internet-facing Chainlit deployment that connects to internal MCP servers or APIs, because the server can be made to reach paths the operator never approved. Review the GHSA advisory for the fixed version and upgrade, and until then broaden or tighten allowed_urls to origin-level entries you trust, or put a proxy in front of /mcp that rejects semicolons in URLs.
What is the risk?
Medium overall. The attack is network-reachable, needs no privileges and no user interaction, and the scope change reflects that requests cross an authorization boundary. High attack complexity lowers likelihood, because the target origin must strip semicolon path parameters (as Tomcat-style or some proxy stacks do). No known exploitation, no public PoC and no scanner template exist. Risk rises sharply where Chainlit is exposed to the internet and the permitted MCP origin also serves sensitive internal paths such as admin or metadata endpoints.
How does the attack unfold?
What systems are affected?
| Package | Ecosystem | Vulnerable Range | Patched |
|---|---|---|---|
| Chainlit | pip | — | No patch |
Do you use Chainlit? You're affected.
How severe is it?
What is the attack surface?
What should I do?
1 step1) Upgrade Chainlit to the fixed release named in GHSA-hvfh-5mj3-5f3j, since 2.12.0 is the version identified as affected. 2) Until patched, avoid path-scoped allowed_urls entries as a security boundary and rely on origin-level controls instead. 3) Block or reject any request to /mcp whose submitted URL contains ';' or '..' at a WAF or reverse proxy. 4) Restrict network egress from the Chainlit host so it can reach only the intended MCP servers. 5) Require authentication in front of /mcp where possible. 6) Detect by searching access and application logs for /mcp requests containing ';' or '..;' and for unexpected outbound requests from the Chainlit host.
How is it classified?
Which compliance frameworks are affected?
This CVE is relevant to:
Frequently Asked Questions
What is CVE-2026-120492?
Chainlit 2.12.0 fails to reject the semicolon character when validating MCP URLs, so an unauthenticated attacker can submit '..;' path segments to the /mcp endpoint and escape the path scope an operator granted, but only on origins that strip semicolon path parameters. Exploitation is rated high complexity because it depends on the backend's path normalization, and the impact is limited to low confidentiality and integrity with a changed scope (CVSS 5.4). There is no KEV listing, no public exploit, no Nuclei template and no EPSS data, so near-term mass exploitation looks unlikely. It still matters for any internet-facing Chainlit deployment that connects to internal MCP servers or APIs, because the server can be made to reach paths the operator never approved. Review the GHSA advisory for the fixed version and upgrade, and until then broaden or tighten allowed_urls to origin-level entries you trust, or put a proxy in front of /mcp that rejects semicolons in URLs.
Is CVE-2026-120492 actively exploited?
No confirmed active exploitation of CVE-2026-120492 has been reported, but organizations should still patch proactively.
How to fix CVE-2026-120492?
1) Upgrade Chainlit to the fixed release named in GHSA-hvfh-5mj3-5f3j, since 2.12.0 is the version identified as affected. 2) Until patched, avoid path-scoped allowed_urls entries as a security boundary and rely on origin-level controls instead. 3) Block or reject any request to /mcp whose submitted URL contains ';' or '..' at a WAF or reverse proxy. 4) Restrict network egress from the Chainlit host so it can reach only the intended MCP servers. 5) Require authentication in front of /mcp where possible. 6) Detect by searching access and application logs for /mcp requests containing ';' or '..;' and for unexpected outbound requests from the Chainlit host.
What systems are affected by CVE-2026-120492?
This vulnerability affects the following AI/ML architecture patterns: LLM chat application front ends, Agent frameworks using MCP, MCP client integrations.
What is the CVSS score for CVE-2026-120492?
CVE-2026-120492 has a CVSS v3.1 base score of 5.4 (MEDIUM).
What is the AI security impact?
Affected AI Architectures
MITRE ATLAS Techniques
AML.T0049Exploit Public-Facing ApplicationAML.T0053AI Agent Tool InvocationCompliance Controls Affected
What are the technical details?
Original Advisory
Chainlit 2.12.0 contains a server-side request forgery vulnerability that allows unauthenticated attackers to bypass path-scoped MCP allowed_urls entries because validate_mcp_url does not reject the semicolon character. Attackers can submit MCP URLs with '..;' segments to the /mcp endpoint, causing requests to paths outside the operator's grant on origins that strip semicolon path parameters.
Exploitation Scenario
An attacker finds an internet-facing Chainlit app whose operator allows MCP connections only under https://tools.internal.example/public/. The attacker posts an MCP URL such as https://tools.internal.example/public/..;/admin/ to the /mcp endpoint. Chainlit's validation accepts it because it does not reject semicolons, and the upstream server strips the ';' segment, resolves the traversal and serves content from /admin/. The attacker then reads or triggers limited actions on resources the operator never meant to expose.
Weaknesses (CWE)
CWE-918 — Server-Side Request Forgery: The web server receives a URL or similar request from an upstream component and retrieves the contents of this URL, but it does not sufficiently ensure that the request is being sent to the expected destination.
- [Implementation, Operation] If there is a known list of applications, IP, hostname, and/or domains to which the product is allowed to communicate, then use allowlists to ensure that outgoing requests are restricted to these known entities. The allowlists could be in the application code or possibly enforced by firewalls or network segmentation [REF-1511].
- [Implementation, Operation] If the product is expected to be able to connect to arbitrary IP addresses or domains, consider using a denylist that includes private network addresses, internal domain names, etc. The denylist could be in the application code or possibly enforced by firewalls or network segmentation [REF-1511].
Source: MITRE CWE corpus.
CVSS Vector
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:C/C:L/I:L/A:NReferences
Timeline
Related Vulnerabilities
CVE-2026-450189.8Chainlit: unauth RCE via MCP stdio cmd injection
Same package: chainlitCVE-2026-860998.2Chainlit: path traversal via sessionId wipes directories
Same package: chainlitCVE-2026-561048.2Chainlit: session hijacking via WebSocket restoration
Same package: chainlitCVE-2026-222197.7chainlit: SSRF allows internal network access
Same package: chainlitCVE-2026-450197.2Chainlit: unauth SSRF via MCP url/header injection
Same package: chainlit