事件经过
gpustack/api/auth.py中的get_current_user在force_auth_localhost为false(默认值)时,将回环源视为内置管理员。由于客户端IP获取器信任同主机反向代理对端或客户端提供的X-GPUStack-Real-IP回环值,纯远程请求可伪装为本地主机。这授予了未认证的完全管理员访问权限,包括密钥泄露和通过inference-backends-from-yaml端点实现远程代码执行。
影响分析
GPUStack用于在GPU集群上提供和配置AI模型。远程未认证攻击者可接管AI服务集群的控制平面,读取云/工作节点凭据,并在管理器上执行代码——将单个开放端口转变为对AI模型服务基础设施的完全攻陷。
攻击途径
远程请求可被伪装为源自127.0.0.1,因为client_ip_getter接受同主机反向代理对端或客户端提供的X-GPUStack-Real-IP回环值。未认证攻击者随后即以管理员身份访问get_current_user,从而能够修改用户/模型、创建持久的管理员API密钥、泄露工作节点和云提供商密钥,并通过POST /v2/inference-backends/from-yaml执行代码。
受影响系统
GPUStack < 2.2.0(另包括0.7.1–2.2.2中的CVE-2026-102894 SAML绕过和2.2.0–2.2.2中的CVE-2026-103002 cluster_apiserver_proxy授权缺口)
缓解措施
升级到GPUStack 2.2.0(对于SAML/代理问题则升级到2.2.2);参见GHSA-gj9m-f8ph-pmhr和v2.2.0标签。检查升级前创建的管理员API密钥和工作节点/云密钥。