挖洞经验 | 发现任意Facebook非公开私密群组成员信息
字数 1185 2025-08-18 11:39:08
Facebook私密群组成员信息泄露漏洞分析报告
漏洞概述
本报告详细分析了2019年发现的Facebook私密群组成员信息泄露漏洞,该漏洞允许非群组成员查看任意私密(Secret)群组的成员信息。漏洞最终获得Facebook官方$3000美金奖励。
漏洞背景
在Facebook的群组系统中:
- 私密群组(Secret Group):只有群内成员或管理员才能查看群组成员信息
- 正常情况下,非群组成员无法获取这些私密信息
漏洞发现过程
初始发现
研究人员发现通过特定GraphQL查询,可以探测用户与私密群组之间的关系状态。
关键测试步骤
-
初始状态探测:
- 用户B与私密群组D无任何关系时,发送以下请求:
POST /api/graphql/?doc_id=2416329748453695 HTTP/1.1 Host: facebook.com variables={"groupID":"Group_D_ID","memberID":"User_B_ID"} - 响应中
"membership":null表明无关联
- 用户B与私密群组D无任何关系时,发送以下请求:
-
关系建立后探测:
- 当群组D某成员邀请用户B加入后,重复相同请求
- 响应中出现
membership字段及详细信息:"membership":{ "member_actions":[...], "member":{"id":"100038336371044"}, "id":"124632125491333" }
-
成员信息提取:
- 使用获取的membership ID构造新查询:
graphql?q=node(GroupMembershipID){ member, associated_group, invited_by{id, name} } - 响应中包含成员详细信息:
"124632125491333":{ "member":{ "name":"Sandra Alchccfcgajdd Lauescu", "url":"https://www.facebook.com/profile.php?id=100038336371044", "id":"100038336371044" }, "associated_group":{...}, "invited_by":null }
- 使用获取的membership ID构造新查询:
漏洞利用关键点
-
状态追踪:
invited_by字段是关键指标:null:用户未被批准或已退群- 包含信息:用户是正式成员且显示邀请者
-
信息泄露方式:
- 通过反复查询不同用户与群组的关系状态
- 利用
invited_by字段变化判断成员状态 - 组合多个查询结果可构建完整成员列表
漏洞影响
-
严重性:
- 完全绕过Facebook私密群组的隐私设计
- 非成员可枚举任意私密群组成员
- 获取成员姓名、个人主页链接等敏感信息
-
潜在滥用:
- 针对特定群组成员进行社工攻击
- 收集用户社交关系图谱
- 商业竞争对手情报收集
修复方案
Facebook最终通过以下方式修复了该漏洞:
- 从响应中完全移除
invited_by字段 - 加强私密群组成员信息的访问控制
- 对GraphQL查询实施更严格的权限检查
时间线
- 2019年8月15日:漏洞提交给Facebook
- 后续:Facebook调查并确认漏洞
- 修复后:发放$3000奖金
技术要点总结
-
GraphQL端点滥用:
- 利用Facebook内部API端点进行未授权查询
- 通过已知的doc_id参数绕过部分限制
-
状态推断技术:
- 利用API响应差异推断隐私信息
- 基于时间序列的状态变化分析
-
信息链式提取:
- 初始查询获取关系标识符
- 二次查询提取详细信息
防御建议
对于类似系统,建议:
-
API设计:
- 对所有查询实施严格的权限检查
- 避免通过响应差异泄露信息
-
隐私保护:
- 私密信息应完全隐藏,而非返回null
- 实施统一的"拒绝访问"响应模式
-
监控:
- 检测异常的GraphQL查询模式
- 限制高频关系状态查询
总结
该漏洞展示了即使在高安全性设计的系统中,通过API响应差异和状态追踪仍可能导致信息泄露。强调了在隐私设计中需要考虑所有可能的间接信息泄露途径的重要性。