CVE-2026-102895 GPUStack: Authentication bypass via trusted loopback source (reverse-proxy TCP peer or X-GPUStack-Real-IP header) grants unauthenticated admin
- Published
- Updated
- Exploit status
- Exploited in the wild (confirmed)
Description
GPUStack is an open-source GPU cluster manager for AI model serving and GPU instance provisioning. Prior to 2.2.0, get_current_user in gpustack/api/auth.py treated a loopback request source as the built-in administrator when force_auth_localhost was false, which was the default. A remote request could appear to originate from 127.0.0.1 because client_ip_getter accepted a same-host reverse proxy peer or a client-supplied X-GPUStack-Real-IP loopback value. The bypass allowed unauthenticated administrative access, including user and model changes, persistent administrator API-key creation, disclosure of worker and cloud-provider secrets, and code execution through POST /v2/inference-backends/from-yaml. Exploitation was observed in the wild against a 2.1.1 deployment. This issue is fixed in version 2.2.0.
CISA Known Exploited Vulnerability
- Date added
- 2026-11-09
- Due date (FCEB)
- 2026-11-12
- Ransomware use
- Unknown
Required action
Apply mitigations in accordance with vendor instructions, ensuring compliance with CISA’s BOD 26-04 Prioritizing Security Updates Based on Risk (see URL in Notes) guidance and CISA’s “Forensics Triage Requirements” (see URL in Notes). Follow applicable BOD 26-04 guidance for cloud services or discontinue use of the product if mitigations are unavailable. Stakeholders are responsible for evaluating each asset's internet exposure and ensuring adherence to BOD 26-04 patching guidelines.
Affected products
| Product | Affected versions | Fixed in |
|---|---|---|
| pypi gpustack(PyPI) | < 2.2.0 | 2.2.0 |
| pypi gpustack(PyPI) | = 0.0.0 | No fix listed |
| pypi gpustack(PyPI) | = 0.1.0 | No fix listed |
| pypi gpustack(PyPI) | = 0.1.0rc1 | No fix listed |
| pypi gpustack(PyPI) | = 0.1.0rc2 | No fix listed |
| pypi gpustack(PyPI) | = 0.1.1 | No fix listed |
| pypi gpustack(PyPI) | = 0.1.1rc1 | No fix listed |
| pypi gpustack(PyPI) | = 0.1.2 | No fix listed |
| pypi gpustack(PyPI) | = 0.2.0 | No fix listed |
| pypi gpustack(PyPI) | = 0.2.1 | No fix listed |
| pypi gpustack(PyPI) | = 0.3.0 | No fix listed |
| pypi gpustack(PyPI) | = 0.3.1 | No fix listed |
| pypi gpustack(PyPI) | = 0.3.2 | No fix listed |
| pypi gpustack(PyPI) | = 0.3.2rc1 | No fix listed |
| pypi gpustack(PyPI) | = 0.4.0 | No fix listed |
| pypi gpustack(PyPI) | = 0.4.0rc2 | No fix listed |
| pypi gpustack(PyPI) | = 0.4.1 | No fix listed |
| pypi gpustack(PyPI) | = 0.4.1rc1 | No fix listed |
| pypi gpustack(PyPI) | = 0.5.0 | No fix listed |
| pypi gpustack(PyPI) | = 0.5.0rc1 | No fix listed |
| pypi gpustack(PyPI) | = 0.5.0rc2 | No fix listed |
| pypi gpustack(PyPI) | = 0.5.1 | No fix listed |
| pypi gpustack(PyPI) | = 0.5.1rc1 | No fix listed |
| pypi gpustack(PyPI) | = 0.6.0 | No fix listed |
| pypi gpustack(PyPI) | = 0.6.0rc1 | No fix listed |
Show 34 more
| pypi gpustack(PyPI) | = 0.6.0rc2 | No fix listed |
| pypi gpustack(PyPI) | = 0.6.1 | No fix listed |
| pypi gpustack(PyPI) | = 0.6.1rc1 | No fix listed |
| pypi gpustack(PyPI) | = 0.6.2 | No fix listed |
| pypi gpustack(PyPI) | = 0.6.2rc1 | No fix listed |
| pypi gpustack(PyPI) | = 0.6.2rc2 | No fix listed |
| pypi gpustack(PyPI) | = 0.7.0 | No fix listed |
| pypi gpustack(PyPI) | = 0.7.0rc1 | No fix listed |
| pypi gpustack(PyPI) | = 0.7.0rc2 | No fix listed |
| pypi gpustack(PyPI) | = 0.7.1 | No fix listed |
| pypi gpustack(PyPI) | = 0.7.1rc1 | No fix listed |
| pypi gpustack(PyPI) | = 0.7.1rc2 | No fix listed |
| pypi gpustack(PyPI) | = 2.0.0 | No fix listed |
| pypi gpustack(PyPI) | = 2.0.0rc1 | No fix listed |
| pypi gpustack(PyPI) | = 2.0.0rc2 | No fix listed |
| pypi gpustack(PyPI) | = 2.0.1 | No fix listed |
| pypi gpustack(PyPI) | = 2.0.1rc2 | No fix listed |
| pypi gpustack(PyPI) | = 2.0.2 | No fix listed |
| pypi gpustack(PyPI) | = 2.0.2rc1 | No fix listed |
| pypi gpustack(PyPI) | = 2.0.2rc2 | No fix listed |
| pypi gpustack(PyPI) | = 2.0.3 | No fix listed |
| pypi gpustack(PyPI) | = 2.0.3rc1 | No fix listed |
| pypi gpustack(PyPI) | = 2.1.0 | No fix listed |
| pypi gpustack(PyPI) | = 2.1.0rc1 | No fix listed |
| pypi gpustack(PyPI) | = 2.1.0rc2 | No fix listed |
| pypi gpustack(PyPI) | = 2.1.1 | No fix listed |
| pypi gpustack(PyPI) | = 2.1.1rc1 | No fix listed |
| pypi gpustack(PyPI) | = 2.1.2 | No fix listed |
| pypi gpustack(PyPI) | = 2.1.2rc2 | No fix listed |
| pypi gpustack(PyPI) | = 2.2.0rc1 | No fix listed |
| pypi gpustack(PyPI) | = 2.2.0rc2 | No fix listed |
| pypi gpustack(PyPI) | = 2.2.0rc3 | No fix listed |
| pypi gpustack(PyPI) | = 2.2.0rc4 | No fix listed |
| gpustack | = < 2.2.0 | No fix listed |
References
- https://github.com/gpustack/gpustack/security/advisories/GHSA-gj9m-f8ph-pmhr
- nvd.nist.gov vendor-advisory
- https://github.com/gpustack/gpustack/pull/5346
- https://github.com/gpustack/gpustack/commit/53f42a6a553542974396d16a4ff6b12bcbedb48d
- github.com product
- https://github.com/gpustack/gpustack/releases/tag/v2.2.0
- www.cisa.gov government-resource