GHSA-vvpg-rrww-wpmh: CSRF

Published Oct 28, 2026
·
Updated

Summary

The OpenAI-compatible server registers Starlette CORSMiddleware with allowedorigins defaulting to [""], and performs no authentication unless --api-key (or VLLMAPIKEY) is configured. A web page on any origin can send requests to a vLLM server that the victim's browser can reach (for example localhost or an internal/VPN address) and read the responses. The default allowcredentials=False blocks cookie-bearing cross-origin requests; because vLLM authenticates with a bearer header rather than cookies, the wildcard still permits untokenized access to an unauthenticated server and read access when the caller already holds a token.

Details

Affected components

- vllm/entrypoints/launchers/cliargs.py - allowedorigins default value. - vllm/entrypoints/serve/middleware/register.py - CORSMiddleware registration. - vllm/entrypoints/serve/middleware/authenticate.py - auth middleware and its guarded path prefixes.

Root cause

vllm/entrypoints/launchers/cliargs.py:

python allowcredentials: bool = False """Allow credentials.""" allowedorigins: list[str] = field(defaultfactory=lambda: [""]) """Allowed origins."""

vllm/entrypoints/serve/middleware/register.py:

python app.addmiddleware( CORSMiddleware, alloworigins=args.allowedorigins, allowcredentials=args.allowcredentials, allowmethods=args.allowedmethods, allowheaders=args.allowedheaders, )

The auth middleware is added only when a token is configured and guards only the /v1, /v2, /inference, and /cohere prefixes. /v1/loadloraadapter and /v1/unloadloraadapter are inside /v1 and therefore do require a key when one is set; they are open only when no key is configured and dynamic LoRA updating is enabled.

Impact

- A malicious page can enumerate models (GET /v1/models), issue POST /v1/chat/completions, consume GPU time, and read model output through the victim's browser. - When the server is reachable only from the victim's network, the browser acts as a proxy a remote website could not otherwise use. - With allowcredentials=False, cookie-based CSRF does not apply; the exposure is cross-origin request execution and response disclosure.

This advisory was fixed in MR61009.

Affected Software

1 affected componentFixes available
pip/vllm<0.32.0
0.32.0

Remediation

Recommended actions to resolve this vulnerability, in priority order.

  1. Upgrade

    Upgrade pip/vllm to a version that resolves this vulnerability.

    Fixed in 0.32.0
  2. Upgrade

    Upgrade to a fixed release to a version that resolves this vulnerability.

    Patch MR61009

Event History

Oct 28, 2026
Advisory Published
via GitHub·09:15 PM
Data Sourced
via GitHub·09:15 PM
DescriptionSeverityWeaknessAffected Software

Frequently Asked Questions

1

Which deployments are exposed to browser-based requests?

An OpenAI-compatible vLLM server is exposed when a victim's browser can reach it, such as on localhost or an internal or VPN-accessible address, and its CORS policy permits arbitrary origins. The default allowed-origins setting is ["*"].

2

What must an attacker do to exploit this?

The attacker needs to induce a victim to load a web page from any origin. That page can send requests to a reachable vLLM server and read its responses when the server permits unauthenticated access.

3

Does the default cookie restriction prevent this issue?

No. The default allow_credentials=False prevents cookie-bearing cross-origin requests, but vLLM uses bearer-header authentication rather than cookies. It does not prevent untokenized access to an unauthenticated server or response reading by a caller that already has a token.

4

How can I determine whether my deployment has the risky configuration?

Check whether the OpenAI-compatible server is running without --api-key or VLLM_API_KEY and whether allowed_origins is left at its default value of ["*"]. Also determine whether users' browsers can reach the server from localhost, internal, or VPN-connected networks.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203