CVE-2025-12999: Open VSX vulnerability

Published Sep 21, 2026
·
Updated

UrlUtil.getBaseUrl builds the absolute URLs in a response — download links, icons, asset and API URLs — from the X-Forwarded-Host, X-Forwarded-Proto and X-Forwarded-Prefix request headers, with no check on whether the sender was a trusted proxy, falling back to the client-supplied Host header.

Those responses are cached under keys that do not include the host (extension.json since 0.6.0, namespace.details.json since 0.9.0, sitemap since 0.14.5, latest.extension.version.vscode since 0.34.2). A single request carrying a forged header therefore places attacker-chosen URLs into an entry served to every other client for the lifetime of that entry — one hour by default, and cluster-wide where ovsx.redis.enabled is set.

The VSIX download URL, its signature URL and the public key URL are all derived from the same base URL, so extension signing does not limit the impact: an attacker who poisons an entry supplies the package, the signature over it, and the key used to verify it.

Exploitability depends on deployment topology. A server reachable directly by clients, or fronted by a proxy that relays the client's X-Forwarded-Host rather than overwriting it, is exploitable by an unauthenticated remote attacker. A proxy that overwrites the header is not.

An unauthenticated attacker can poison Open VSX's per-extension metadata cache with attacker-controlled download, signature, and public-key URLs by supplying a crafted X-Forwarded-Host header, causing downstream VS Code-compatible editors to fetch and install a malicious VSIX.

Workarounds (unpatched versions)

1. Configure the reverse proxy to set rather than relay X-Forwarded-Host, X-Forwarded-Proto and X-Forwarded-Prefix — note that nginx's $host is the client's Host header and is not a safe value.

2. Ensure the server is not reachable except through that proxy.

3. Flush the caches afterwards; poisoned entries survive the configuration change.

Affected Software

1 affected component
Open VSX

Remediation

Recommended actions to resolve this vulnerability, in priority order.

  1. Configuration

    Configure the reverse proxy to set (override) X-Forwarded-Host, X-Forwarded-Proto, and X-Forwarded-Prefix rather than relaying the client-supplied values. In nginx, do not use $host as a safe value; set these headers based on the proxy’s known external scheme/host/prefix.

    Open VSX reverse proxy (e.g., nginx) X-Forwarded-Host / X-Forwarded-Proto / X-Forwarded-Prefix = Set (do not relay)
  2. Compensating control

    Ensure the Open VSX server is not reachable except through that reverse proxy (i.e., block direct client access; rely on the proxy path so untrusted clients cannot supply X-Forwarded-* headers directly).

  3. Operational

    Flush Open VSX caches after applying the proxy/config changes, because poisoned per-extension metadata cache entries survive configuration changes. (Poisoned entries are described for URLs in download, signature, and public-key fields; caches include extension.json since 0.6.0, namespace.details.json since 0.9.0, sitemap since 0.14.5, and latest.extension.version.vscode since 0.34.2.)

Event History

Sep 21, 2026
CVE Published
via MITRE·08:59 AM
Data Sourced
via MITRE·08:59 AM
Description

Frequently Asked Questions

1

Which deployments are exposed to unauthenticated cache poisoning?

Deployments reachable directly by clients are exposed. Deployments behind a proxy are also exposed if the proxy relays a client-provided X-Forwarded-Host instead of overwriting it with a trusted value.

2

How long can a poisoned response affect clients?

A poisoned cache entry is served for its lifetime, which is one hour by default. If ovsx.redis.enabled is set, the poisoned entry can be shared cluster-wide.

3

Which cached resources can carry attacker-controlled URLs?

Affected cached resources include extension.json since 0.6.0, namespace.details.json since 0.9.0, sitemap since 0.14.5, and latest.extension.version.vscode since 0.34.2. The generated URLs can include download links, icons, assets, and API URLs.

4

Does extension signing protect clients from a poisoned download URL?

No. The VSIX download URL, signature URL, and public-key URL are derived from the same attacker-controlled base URL, allowing a poisoner to provide the package, its signature, and the verification key together.

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