GPUStack CVE-2026-102895 exploited: proxy makes every request admin
GPUStack before 2.2.0 gives admin to any request behind a same-host reverse proxy. It's exploited and in CISA KEV. Upgrade and rotate your API keys.
If you self-host models on GPUStack behind Nginx, assume strangers had admin. GPUStack CVE-2026-102895 is a CVSS 9.8 authentication bypass, and the project's own advisory says it was exploited in the wild against a v2.1.1 deployment, with attackers creating custom backends that ran reverse shells. On November 9, CISA added it to the Known Exploited Vulnerabilities catalog.
What actually happened
From the GitHub security advisory GHSA-gj9m-f8ph-pmhr:
- The bug. Before 2.2.0, GPUStack promoted any request from a "loopback" source to the built-in administrator when
force_auth_localhostwasFalse, which was the default. - Path one: your reverse proxy. The standard self-hosted setup is GPUStack behind a same-host proxy with
proxy_pass http://127.0.0.1:<port>. Every remote request then arrives from 127.0.0.1, so every request gets admin. No header, no credential. - Path two: a header. A forged
X-GPUStack-Real-IP: 127.0.0.1header could do the same. - Impact. Full admin over the network: users, models, workers and configuration. Attackers can mint persistent admin API keys with scope
["*"], read worker credentials and cloud/provider secrets, and get code execution on worker hosts through admin-only endpoints such asPOST /v2/inference-backends/from-yaml. - Fix. Version 2.2.0 removes the loopback auto-admin path and hardens forwarding-header handling.
Why it matters for your business
"Run your own models" is a good cost and privacy play. It also means you own the patching. The setup that turns this bug from bad into wide open is the textbook one: app on localhost, Nginx in front, TLS on the proxy. "Localhost is trusted" stops being true the moment a proxy sits on the same box.
If you or a contractor stood up GPUStack:
- Upgrade to 2.2.0 or later today. Then check the repo's Security tab for other open advisories.
- Assume compromise if it was internet-facing. Upgrading doesn't revoke keys an attacker already minted. List and delete API keys you didn't create, review users, and look for inference backends you didn't add.
- Rotate the secrets it held. Worker credentials and any cloud or model-provider keys stored in GPUStack.
- Can't upgrade yet? Set
force_auth_localhost=true, stripX-GPUStack-Real-IPat the edge, and put the API behind a VPN.
Key takeaways
- GPUStack before 2.2.0 gives admin to any request that looks like it came from localhost
- A same-host reverse proxy makes every remote request look like localhost
- Exploitation is confirmed and CISA added the CVE to KEV on November 9
- Patching doesn't remove attacker-minted API keys. Audit keys, users and backends
- Rotate every cloud and provider secret the server stored
Self-hosted AI saves money until nobody owns the patch. We set up private model serving with authentication at the edge, secrets out of the app, and an update plan someone actually runs. See how we build it, or have us check your setup.
Sources: GPUStack advisory GHSA-gj9m-f8ph-pmhr, CISA.
- #gpustack
- #cve-2026-102895
- #self-hosted-ai
- #reverse-proxy
- #cisa-kev
Tommy Rush — Founder, Rush Commerce
Operator turned builder. 15+ years running operations — now shipping the systems businesses run on. More
Get The Rush Report weekly — one email, zero fluff.
Keep reading
Truffle Security will get your leaked API keys revoked
Truffle Security's Secrets Revocation Program sends 1.4M live leaked API keys to Twilio, Vercel, Resend and others to revoke. Make key rotation a five-minute job.
Read itSynology NAS ransomware: C3RB3R hits outdated DSM
Synology warns C3RB3R ransomware is encrypting NAS boxes on outdated DSM. Files get .L0CK3D. Update DSM, turn on auto-updates, and keep an offline backup.
Read it