0098.直接在Facebook上给任何人打电话/发消息,绕过消息请求($$+$$$)

admin 2025-12-22 04:10:38 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 这篇文章详细介绍了FacebookMessengerKids平台上的一个严重漏洞,允许攻击者通过GraphQLmutation绕过正常消息请求流程,直接给任何Facebook用户打电话或发送消息。作者首先发现可以通过ADD_PARENT操作将非好友用户添加为儿童账户的家长,从而直接通信。在Meta修复此问题后,作者又发现了使用REMOVE_PARENT_AND_KEEP_AS_CONTACT操作的新绕过方法,使受害者无法察觉攻击且无法屏蔽。文章还指出MessengerKids账户名称字段缺乏验证,可能被用于冒充他人。Meta最终实施了全局修复,强制执行好友关系要求和家长存在性验证。 综合评分: 87 文章分类: 漏洞分析,WEB安全,渗透测试,社会工程学,威胁情报


cover_image

0098.直接在 Facebook 上给任何人打电话/发消息,绕过消息请求($$+$$$)

原创

Samip Aryal

Rsec

2025年12月16日 17:08 贵州

本文章仅用网络安全研究学习,请勿使用相关技术进行违法犯罪活动。

声明:本文搬运自互联网,如你是原作者,请联系我们!

类型:Graphql

一个并不那么有趣的元平台——Messenger Kids——上的一个有趣漏洞

我是来自尼泊尔的 Samip Aryal,今天想和大家分享一个我比较不寻常的漏洞发现,这个漏洞是在 BountyCon 2024 上发现的(这是第一份报告) 。它结合了一些有趣的 GraphQL mutation 和业务逻辑缺陷,而这些缺陷来自一个几乎被人遗忘的 Meta 产品——Messenger Kids。

背景

Messenger Kids 账号(“Neo 账号”)专为 13 岁以下儿童设计。每个儿童账号均可由以下人员管理:

  • 一位主要父母
  • 一位额外的家长

家长账户与普通 Facebook 用户账户相同。家长管理功能直接嵌入在 Facebook 应用内,可通过 Messenger Kids 控制面板或访问 https://www.facebook.com/messenger_kids 进行管理 (更多信息请点击此处)。

从一开始,这种亲子关系背后的某些商业逻辑就让我觉得非常不寻常:

  1. Messenger Kids 允许在未经本人同意的情况下,将任何好友添加为 Neo 账号的辅助家长。添加后,孩子可以直接与该用户聊天。而且,家长永远无法屏蔽 Neo 账号。
  2. Facebook 和 Facebook Lite 应用程序经常出现一些容易发生的漏洞,导致被添加为家长的用户由于错误或部分 DOS 状态而无法删除自己或阻止通信。

这些方面让我对这段亲子关系产生了怀疑。我很好奇是否可以随意添加一个非好友用户作为这个孩子账号的家长。这样我是否就能通过 Messenger Kids 应用直接与他们沟通?我尝试修改 Graph API 请求。

NeoApprovedUserUpdateManagingParentsMutation

虽然没有完全达到预期效果,但还是取得了一些容易实现的成果。

时间快进到 2024 年的 BountyCon 大会,当我重新连接到 Facebook 应用测试 Messenger 儿童家长控制面板界面时,我意识到我从未在 GraphQL 端点本身上对其进行过全面评估。因此,我立即着手进行评估。

#

BUG

正如预期的那样,当我使用此 AJAX 调用发出 POST 请求,并将账managing_parent_id 设置为任何用户的 userID 时,我能够将该用户添加到我的 Neo 帐户的父级。

MessengerKidsCometUpdateManagingParentsMutation:

new AsyncRequest('api/graphql/').setData({  doc_id: 5247402565289912,  variables: '{"input":{"managing_parent_id":"VICTIM_ID","mutation_action":"ADD_PARENT","neo_approved_user_id":"TEST_KID_ID","actor_id":null}}'}).send()

结果: 任何 Facebook 用户——即使不是好友——都会被添加为攻击者控制的儿童帐户的家长。

由于父母会自动出现在孩子的已批准联系人中,攻击者可以直接使用 Messenger Kids 应用程序给受害者打电话或发消息,完全绕过正常的消息请求流程。

// 我最初报告了这个漏洞,几天后该漏洞就被修复了,而且赏金也出乎意料地高。

— 出乎意料的是,这个漏洞存在一些明显的缺点,使其无法扩大规模以发挥最大影响:

  1. 被添加为家长的受害者会收到通知,他可以前往 Messenger 儿童控制面板,将自己从该儿童的家长列表中移除。之后,他就可以屏蔽 Neo 账号和该聊天记录。(不过,他们仍然可以再次被添加。)

  1. 但是,受害者也可以看到是哪个用户添加了他们,从而可以轻松阻止攻击者的帐户,并(某种程度上)阻止他再次将自己添加到父角色。

修复 → 如果 managing_parent_id(受害者用户 ID)与 actor(actor_id)不相等,则抛出错误。

绕行路!

第一次修复之后,我重新审视了同一个 GraphQL mutation,并重点关注了这个特定的参数:

"mutation_action":"ADD_PARENT"

此外,要移除添加的父级,只需对同一个 POST 请求稍作修改。在测试 REMOVE_PARENT 变更时,我注意到了一些奇怪的事情:

观察结果 1 — 删除不存在的父级(而非添加的父级)仍然返回成功

我可以发送:

"mutation_action":"REMOVE_PARENT"

…使用任意随机的 managing_parent_id ,即使受害者根本不是家长

这暗示着缺少父节点存在性验证

我开始进行模糊测试/探索不同的变异操作,并发现了一个有趣的变异操作:


"mutation_action":"REMOVE_PARENT_AND_KEEP_AS_CONTACT"

不出所料,情况也是如此:

  • 不需要好友关系(之前的修复方法不适用)
  • 没有核实受害者是否已经是父母。
  • 已自动将其转换为 Messenger Kids 联系人

#

旁路有效载荷

因此,以下是修改后的带有新 mutation_action 的 AJAX 调用:

MessengerKidsCometUpdateManagingParentsMutation:

new AsyncRequest('api/graphql/').setData({  doc_id: 5247402565289912,  variables: '{"input":{"managing_parent_id":"VICTIM_ID","mutation_action":"REMOVE_PARENT_AND_KEEP_AS_CONTACT","neo_approved_user_id":"TEST_KID_ID","actor_id":null}}'}).send()

这次的漏洞利用方式再次允许攻击者直接与 Facebook 上的任何人进行通话或聊天,就像以前一样。

此外…

  • 通过这种绕过方法,受害用户将不会收到任何通知,这与之前(被 X 添加为家长时)的情况不同,几乎完全隐藏了其身份。这次无法像之前那样自行移除家长身份(因为这次受害用户不是被添加为家长,而是被添加为联系人)。
  • 此外,在创建 Messenger Kids 帐户时,我发现名称字段中没有任何验证或清理措施,任何内容(< > “ ‘ / \ ( ) { } [ ] ; : = % & + — * ! ? $ @ # ^ |)都可以作为其名称。

  • 所以这意味着,结合这个绕过漏洞,我可以冒充他们的朋友或任何人发送消息/拨打电话,受害者通常会收到来自表面上的个人资料的消息或电话(直接进入他们的聊天)。
  • 可怕的是,这次收信人(受害者)根本无法查明对方的真实身份。既无法查看对方的个人资料,也无法屏蔽对方的信息。这个孩子的账号几乎是无懈可击的——无法屏蔽,也无法追踪

最后,综合以上所有情况,我提高了事件的影响级别并上报了绕过漏洞。我也收到了 Facebook 安全团队的积极回应 😉

这个问题一天之内就被排查并修复了,而且出乎意料的是,奖励竟然是第一次举报的两倍。我以前从来没见过绕过漏洞还能拿到双倍赏金,哈哈。

最终定稿

Meta 针对 Messenger Kids 家长管理相关的 GraphQL mutation 和 Graph API 端点部署了全局修复。多个 doc_id 变体和相关 API 接口已更新,以强制执行好友关系要求和正确的家长存在性验证, 之后才允许执行任何家长管理操作,从而彻底解决了所有端点的根本问题。

唯一尚未解决的问题是 Messenger Kids 帐户缺乏名称清理功能——这可能是一个有趣的线索!


查看原文:《0098.直接在 Facebook 上给任何人打电话/发消息,绕过消息请求($$+$$$)》

评论:0   参与:  2