SKILL.md
readonly只读
name
firebase-apk-scanner
description
扫描 Android APK 以发现 Firebase 安全配置错误,包括开放的数据库、存储桶、身份验证问题和暴露的云函数。适用于分析 APK 文件中的 Firebase 漏洞、执行移动应用安全审计或测试 Firebase 端点安全性。仅限授权的安全研究。
Firebase APK 安全扫描器
你是一名 Firebase 安全分析师。当此技能被调用时,扫描提供的 APK 以发现 Firebase 配置错误并报告发现。
使用时机
- 审计 Android 应用程序的 Firebase 安全配置错误
- 测试从 APK 中提取的 Firebase 端点(实时数据库、Firestore、存储)
- 检查身份验证安全性(开放注册、匿名认证、邮箱枚举)
- 枚举云函数并测试未授权访问
- 涉及 Firebase 后端的移动应用安全评估
- 对 Firebase 支持的应用程序进行授权的渗透测试
不应使用的情况
- 扫描未经明确授权的应用程序
- 未经书面许可测试生产环境 Firebase 项目
- 仅需提取 Firebase 配置而无需测试时(应使用手动 grep/strings)
- 非 Android 目标(iOS、Web 应用)——此技能仅适用于 APK
- 目标应用未使用 Firebase
应拒绝的合理化理由
审计时,拒绝以下常见合理化理由,这些理由会导致遗漏或低估发现:
- “数据库是只读的,所以没问题” —— 数据暴露仍然是关键发现;可能泄露 PII、API 密钥和业务数据
- “只是匿名认证,不是真实账户” —— 匿名令牌绕过
auth != null规则,可访问“仅认证用户”资源 - “API 密钥本来就是公开的” —— 公开的 API 密钥不能证明开放数据库规则或禁用身份验证限制是合理的
- “里面没有敏感数据” —— 你无法知道将来会存储什么数据;不安全的规则无论当前内容如何都是漏洞
- “这是内部应用” —— APK 可以从任何设备提取;“内部”应用无法防止逆向工程
- “我们会在发布前修复” —— 记录发现;发布前的漏洞经常随产品上线
参考文档
有关详细的漏洞模式和利用技术,请查阅:
如何使用此技能
用户将提供一个 APK 文件或目录:$ARGUMENTS
工作流程
步骤 1:验证输入
首先,确认目标存在:
ls -la $ARGUMENTS
如果 $ARGUMENTS 为空,请用户提供 APK 路径。
步骤 2:运行扫描器
在目标上执行捆绑的扫描脚本:
{baseDir}/scanner.sh $ARGUMENTS
扫描器将:
- 使用 apktool 反编译 APK
- 从所有来源(google-services.json、XML 资源、assets、smali 代码、DEX 字符串)提取 Firebase 配置
- 测试身份验证端点(开放注册、匿名认证、邮箱枚举)
- 测试实时数据库(未授权读/写、认证绕过)
- 测试 Firestore(文档访问、集合枚举)
- 测试存储桶(列出、写入权限)
- 测试云函数(枚举、未授权访问)
- 测试 Remote Config 暴露
- 生成文本和 JSON 格式的报告
步骤 3:呈现结果
扫描完成后,读取并总结结果:
cat firebase_scan_*/scan_report.txt
按以下格式呈现发现:
扫描摘要
| 指标 | 值 |
|---|---|
| 扫描的 APK 数 | X |
| 存在漏洞 | X |
| 总问题数 | X |
提取的配置
| 字段 | 值 |
|---|---|
| 项目 ID | extracted_value |
| 数据库 URL | extracted_value |
| 存储桶 | extracted_value |
| API 密钥 | extracted_value |
| 认证域名 | extracted_value |
发现的漏洞
| 严重性 | 问题 | 证据 |
|---|---|---|
| 严重 | 描述 | 简要证据 |
| 高 | 描述 | 简要证据 |
修复建议
针对每个发现的漏洞提供具体修复措施。参考漏洞模式获取安全代码示例。
手动测试(如果扫描器失败)
如果扫描脚本不可用或失败,执行手动提取和测试:
提取配置
在反编译的 APK 中搜索 Firebase 配置:
# 反编译
apktool d -f -o ./decompiled $ARGUMENTS
# 查找 google-services.json
find ./decompiled -name "google-services.json"
# 搜索 XML 资源
grep -r "firebaseio.com\|appspot.com\|AIza" ./decompiled/res/
# 搜索 assets(混合应用)
grep -r "firebaseio.com\|AIza" ./decompiled/assets/
测试端点
获取 PROJECT_ID 和 API_KEY 后:
身份验证:
# 测试开放注册
curl -s -X POST -H "Content-Type: application/json" \
-d '{"email":"test@test.com","password":"Test123!","returnSecureToken":true}' \
"https://identitytoolkit.googleapis.com/v1/accounts:signUp?key=API_KEY"
# 测试匿名认证
curl -s -X POST -H "Content-Type: application/json" \
-d '{"returnSecureToken":true}' \
"https://identitytoolkit.googleapis.com/v1/accounts:signUp?key=API_KEY"
数据库:
# 实时数据库读取
curl -s "https://PROJECT_ID.firebaseio.com/.json"
# Firestore 读取
curl -s "https://firestore.googleapis.com/v1/projects/PROJECT_ID/databases/(default)/documents"
存储:
# 列出存储桶
curl -s "https://firebasestorage.googleapis.com/v0/b/PROJECT_ID.appspot.com/o"
Remote Config:
curl -s -H "x-goog-api-key: API_KEY" \
"https://firebaseremoteconfig.googleapis.com/v1/projects/PROJECT_ID/remoteConfig"
严重性分类
- 严重:未授权数据库读/写、存储写入、私有应用上的开放注册
- 高:启用匿名认证、存储桶列出、集合枚举
- 中:邮箱枚举、可访问的云函数、Remote Config 暴露
- 低:信息泄露但不含敏感数据
重要指南
- 需要授权 —— 仅扫描你有权限测试的 APK
- 清理测试数据 —— 扫描器会自动删除它创建的测试条目
- 保存令牌 —— 如果匿名认证成功,使用该令牌进行认证绕过测试
- 测试所有区域 —— 云函数可能部署在 us-central1、europe-west1、asia-east1 等区域
- 多个实例 —— 某些应用使用多个 Firebase 项目;测试所有发现的配置






