Skip to content

CVE-2026-102895 GPUStack: Authentication bypass via trusted loopback source (reverse-proxy TCP peer or X-GPUStack-Real-IP header) grants unauthenticated admin

CriticalCVSS 9.8 EPSS 0.56% CISA KEV added 2026-11-09 · due 2026-11-12 Exploited in the wild
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

ProductAffected versionsFixed 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