ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

OWASP MASTG 隐私测试:识别 Android 应用内嵌第三方服务(SDK 与独立库)的数据收集风险

OWASP MASTG 隐私测试:识别 Android 应用内嵌第三方服务(SDK 与独立库)的数据收集风险 文档教程网络安全【免费下载链接】mastgThe OWASP Mobile Application Security Testing Guide (MASTG) is a comprehensive manual for mobile app security testing and reverse engineering. It describes technical processes for verifying the OWASP Mobile Security Weakness Enumeration (MASWE) weaknesses, which are in alignment with the OWASP MASVS.项目地址https://gitcode.com/gh_mirrors/ow/mastg点击查看免费下载本文以 MASTG 知识条目 MASTG-KNOW-0026 为主线系统讲解移动应用内嵌第三方服务跟踪、广告、用户体验优化带来的隐私风险开发者无法获知第三方库内部代码行为因此必须遵循最少必要数据、绝不泄露敏感信息的原则。文章结合仓库中的 MASWE-0073 测试用例MASTG-TEST-0318 / 0319、Firebase Analytics 实战演示MASTG-DEMO-0081与配套测试技术给出从静态定位到动态 Hook 再到网络流量核验的完整验证流程。读完本文你将掌握在 Android 应用上识别第三方 SDK 数据收集入口、确认敏感数据是否外泄并对照商店隐私声明判定测试结论的完整方法。一、第三方服务的双重角色功能与风险的伴生体在移动应用中由第三方服务提供的功能通常包括三类跟踪服务Tracking Services监控用户在应用内的行为轨迹用于行为分析、用户画像广告投放Banner Advertisements在应用界面中出售横幅广告位换取营收用户体验优化User Experience Improvement崩溃上报、性能监控、A/B 实验、推送统计等改善体验类能力。这三类功能的共同特点是它们由第三方代码执行而执行细节对应用开发者并不透明。如 MASTG-KNOW-0026 所指出的The downside is that developers dont usually know the details of the code executed via third-party libraries. Consequently, no more information than is necessary should be sent to a service, and no sensitive information should be disclosed.这引出了两条对开发者以及测试者都成立的铁律最小化原则Data Minimization只向第三方服务发送完成任务所必需的信息杜绝顺手多传敏感信息零泄露任何情况下都不得把认证信息、PII、健康数据等敏感数据交给第三方。对安全测试者而言这意味着验证清单里必须包含一项专项检查应用内嵌的第三方服务到底收集了什么、收集的数据是否与商店隐私声明和隐私政策一致。这正是 MASWE-0073对应 MASVS-PRIVACY 类目要回答的问题——仓库中 MASTG-TEST-0318 与 MASTG-TEST-0319 均为maswe: [MASWE-0073]分别从静态与动态两个方向验证该弱点。二、两种集成形态独立库Standalone Library与完整 SDKMASTG-KNOW-0026 明确指出大多数第三方服务以两种方式嵌入应用集成形态典型特征隐私风险关注点独立库Standalone Library以单个 JAR/AAR 依赖形式打包通过少量公开 API 调用如崩溃上报库、简化版广告 SDK库体积小、API 少但内部可能自带网络上报逻辑需核查其请求端点与携带字段完整 SDKFull SDK提供完整能力栈初始化器、事件上报、用户标识、配置拉取、多渠道服务聚合如 Firebase、各类广告聚合平台集成面大常自动采集设备信息、广告 ID、用户行为事件数据出口多最易出现声明之外的数据收集从平台概念看Android 的 SDK 指基于 Java/Kotlin 的官方开发包而第三方 SDK 则是嵌入其中的独立二进制依赖——两者的边界在 Document/0x04a-Mobile-App-Taxonomy.md 中有详细阐述Android 应用可由 SDKJava/Kotlin与 NDKC/C 原生库共同构成第三方库正是以这种库 原生代码混合形态嵌入的。这提示测试者逆向第三方 SDK 时不能只看 Java 层还要留意其携带的 .so 原生库可能独立上报数据。无论哪种形态测试的核心问题只有一个数据入口SDK 方法在哪里调用时传入了什么。三、先界定敏感数据验证的前提条件在开始任何测试之前必须先回答什么是敏感数据。仓库的 prerequisites/identify-sensitive-data.md 给出了权威判定框架数据可处于三种状态——静态At Rest存于文件或存储中、使用中In Use已被应用加载进地址空间、传输中In Transit在应用与端点/进程间交换。敏感数据的判定优先级取决于其重要性与被访问的可能性当组织没有数据分类策略时以下信息通常被视为敏感用户认证信息凭据、PIN 等可用于身份盗用的 PII社保号、信用卡号、银行账号、健康信息可能识别个人的设备标识符泄露会导致声誉损害和/或财务损失的高敏感数据受法律保护必须保密的数据应用或其关联系统生成的、用于保护其他数据或系统本身的技术数据如加密密钥。如该文档强调必须在测试开始前确定敏感数据的定义因为没有定义就无法检测敏感数据泄露。原文A definition of sensitive data must be decided before testing begins because detecting sensitive data leakage without a definition may be impossible.实际测试中推荐的数据来源是应用隐私政策与商店隐私声明——Google Play 的Data Safety数据安全区、Apple App Store 的App Privacy应用隐私标签详见 Document/0x04i-Testing-User-Privacy-Protection.md。这两个平台自 2021 年 / 2020 年起先后推行隐私标签体系开发者必须在商店页面如实声明收集的数据类型与用途这正是测试者核对第三方服务实际收集的数据是否被声明的对照基准。四、静态验证定位已知处理敏感数据的 SDK API4.1 测试逻辑MASTG-TEST-0318References to SDK APIs Known to Handle Sensitive User Data类型[static, code]验证应用是否引用了已知会处理敏感用户数据的 SDK API。其判定的数据范围以 Google Play Data Safety 定义的数据类型及相关隐私法规为准。前置工作先研究第三方库的文档或代码找出它用于数据收集的 API 入口。测试文档给出了经典示例——Firebase AnalyticsGoogle Analytics for Firebase的FirebaseAnalytics类setUserId(String)设置用户 IDsetUserProperty(String, String)设置用户属性logEvent(String, Bundle)记录带参数的自定义事件。这三类方法都可能把用户标识、行为数据、自定义业务字段传给第三方因此是静态扫描的目标入口。4.2 执行步骤测试步骤引用仓库中的两个技术条目使用 MASTG-TECH-0013Reverse Engineering Android Apps 逆向应用——该技术概述了 Android 逆向的典型路线解包 APK、处理 Java 字节码与 JNI 原生代码并存的情况并推荐 MASTG-TECH-0016 / 0017 / 0018 等具体逆向手法使用 MASTG-TECH-0014Static Analysis on Android 在反编译代码中检索目标 API 调用点。MASTG-TECH-0014 特别示范了两种静态工具grep与semgrepMASTG-TOOL-0110。例如对AndroidManifest.xml提取minSdkVersion的 grep 用法同样适用于在反编译产物中检索 SDK 方法签名grep -r FirebaseAnalytics out_dir/sources/4.3 观察与判定观察Observation输出应列出 SDK 方法的所有调用位置判定Evaluation只要能在应用代码中找到这些 SDK 方法的使用测试即失败fail——说明应用正与第三方 SDK 共享可能敏感的用户数据。⚠️ 注意该测试只能检测出**潜在potential的敏感数据处理若要确认confirming**真实用户数据确实被共享必须转入下一节的动态测试 MASTG-TEST-0319。五、动态验证运行时 Hook SDK 方法抓取真实参数5.1 测试逻辑MASTG-TEST-0319Runtime Use of SDK APIs Known to Handle Sensitive User Data类型[dynamic, hooks]是 MASTG-TEST-0318 的动态对应物在运行时 Hook 已知处理敏感数据的 SDK 方法捕获真实传入参数与调用栈。执行步骤使用 MASTG-TECH-0005Installing Apps 安装应用adb install ./myApp.apk可用-d/-e/-s指定目标设备使用 MASTG-TECH-0043Method Hooking Hook 相关 API 调用充分操练应用尽可能触发所有业务流在所有能输入的地方输入敏感数据以最大化触发 SDK 上报。5.2 仓库实战演示MASTG-DEMO-0081仓库中的 MASTG-DEMO-0081Sensitive User Data Sent to Firebase Analytics with Frida完整演示了这条路径。演示应用收集两类敏感数据并调用logEvent上报 Firebase AnalyticsUser ID数据类型User IDs类别Personal infoBlood type 血型数据类型Health info类别Health and fitness。其 Kotlin 采样代码MastgTest.kt如下package org.owasp.mastestapp import android.content.Context import com.google.firebase.analytics.FirebaseAnalytics import com.google.firebase.analytics.logEvent import kotlin.random.Random class MastgTest(context: Context) { val analytics FirebaseAnalytics.getInstance(context) // Random arbitrary number for the sake of the demo val userId: String (1..8).map { Random.nextInt(0, 10) }.joinToString() fun mastgTest(bloodType: String): String { analytics.logEvent(user_blood_type) { param(user_id, userId) param(blood_type, bloodType) } return user_blood_type event was sent to Firebase Analytics. User id: $userId Blood type: $bloodType .trimIndent() } }可见logEvent(user_blood_type)同时携带了user_id用户标识与blood_type健康信息两个参数——正是需要抓取与判定的敏感载荷。Hook 配置hooks.json只声明了一个目标{ category: PRIVACY, hooks: [ { class: com.google.firebase.analytics.FirebaseAnalytics, method: logEvent } ] }运行脚本run.sh使用frookyMASTG-TOOL-0145以-UUSB 设备、-fspawn 指定包名模式启动应用并注入 Hook#!/bin/bash frooky -U -f org.owasp.mastestapp --platform android hooks.json演示步骤来自 MASTG-DEMO-0081.md在设备上安装应用MASTG-TECH-0005在主机安装 frookyMASTG-TOOL-0145并确保设备上运行着 frida-server执行run.sh以 Frida spawn 应用在界面下拉框选择血型点击Start按钮触发上报按CtrlC和/或q停止脚本、退出 Frida CLI。仓库还提供 auto.sh可将 run.sh 后台化并用 Maestro 驱动 UI 流程自动化完成触发。5.3 观察输出解读Hook 的运行时输出output.json包含两部分先是 Hook 注册摘要然后是每次触发产生的 hook 记录。摘要部分确认了 Hook 目标与签名{ type: summary, hooks: [ { class: com.google.firebase.analytics.FirebaseAnalytics, method: logEvent, overloads: [ { args: [ java.lang.String, android.os.Bundle ] } ] } ], totalHooks: 1, errors: [], totalErrors: 0 }单次调用记录则给出调用栈stackTrace、入参声明类型与运行时的真实值inputParameters{ id: c6b211de-9e7f-442b-952b-bddddf4b7baa, type: hook, category: PRIVACY, time: 2026-01-23T10:45:21.192Z, class: com.google.firebase.analytics.FirebaseAnalytics, method: logEvent, instanceId: 18729008, stackTrace: [ com.google.firebase.analytics.FirebaseAnalytics.logEvent(Native Method), org.owasp.mastestapp.MastgTest.mastgTest(MastgTest.kt:35), org.owasp.mastestapp.MainActivityKt.MainScreen$lambda$15$lambda$14(MainActivity.kt:107), org.owasp.mastestapp.MainActivityKt.$r8$lambda$REihytfpbfdEl1cb3dLDlSFXk5M(Unknown Source:0), org.owasp.mastestapp.MainActivityKt$$ExternalSyntheticLambda2.run(D8$$SyntheticClass:0), java.lang.Thread.run(Thread.java:1119) ], inputParameters: [ { declaredType: java.lang.String, value: user_blood_type }, { declaredType: android.os.Bundle, value: instance: android.os.Bundle, runtimeType: android.os.Bundle, instanceId: 30215337, instanceToString: Bundle[{blood_typeA, user_id90600554}] } ], returnValue: [ { declaredType: void, value: void } ] }这段输出极具价值instanceToString字段直接暴露了 Bundle 内真实载荷Bundle[{blood_typeA, user_id90600554}]——即血型与用户 ID 确实在运行时被传给了 FirebasestackTrace则把调用链定位回业务代码MastgTest.mastgTest采样代码中的对应逻辑。这正是确认实际共享的动态证据。5.4 判定测试失败条件在应用代码中运行时发现敏感用户数据被传给这些 SDK 方法。MASTG-DEMO-0081 的结论即为此例血型blood_type参数与用户 IDuser_id参数经logEvent发往 Firebase Analytics且该数据收集未在 Google Play 的 Data Safety 区披露演示场景假设应用已上架故测试失败fails。六、网络流量视角捕获声明之外泄露的 PIISDK 上报的数据最终必然经网络离境因此流量捕获是第三方服务隐私验证的第三个正交视角。MASTG-TEST-0206Undeclared PII in Network Traffic Capture类型[dynamic, network]专门验证即使流量已加密敏感数据PII也不应被发送到网络上——除非它已在隐私政策或商店隐私声明中声明。该测试尤其适合金融、健康类应用且应结合以下前置项执行identify-sensitive-data敏感数据识别、privacy-policy隐私政策、app-store-privacy-declarations商店隐私声明。执行步骤使用 MASTG-TECH-0005 安装应用使用 MASTG-TECH-0100Logging Sensitive Data from Network Traffic 捕获并记录网络流量——该方法基于 mitmproxyMASTG-TOOL-0097编写 Python 过滤器只有命中SENSITIVE_DATA字典中的数据才被记录避免日志噪声启动应用并遍历各业务流程在能输入敏感数据的地方尽量输入尤其要触发已知会产生网络流量的操作。mitmproxy 过滤器脚本示例来自 MASTG-TECH-0100节选# mitm_sensitive_logger.py from mitmproxy import http # This data would come from another file and should be defined after identifying the data that is considered sensitive for this application. # For example, by using the Google Play Store Data Safety section. SENSITIVE_DATA { precise_location_latitude: 37.7749, precise_location_longitude: -122.4194, name: John Doe, ... }仓库配套演示 MASTG-DEMO-0009 展示了同类场景应用通过HttpURLConnection把敏感数据 POST 到https://httpbin.org/post一个回显数据的测试端点测试者用预配置好敏感关键词的 mitm_sensitive_logger 脚本抓包后即可判定失败。其要点在于TLS 加密保证的是机密性并不代表隐私合规——即便请求/响应都加密只要数据外泄未在隐私政策中声明仍是隐私问题。判定若在流量日志中找到未在商店隐私声明如 Google Play Data Safety和/或隐私政策中声明的 PII测试失败。该测试不直接给出代码位置如需定位代码可用 MASTG-TECH-0014 / 0015 静态定位或分别参考 MASTG-TEST-0318 / 0319 的静态与动态方法。七、配套检查权限最小化与商店披露一致性第三方 SDK 收集数据的能力往往建立在应用授予的权限之上因此权限审查是与本主题配套的必要环节MASTG-TEST-0254Dangerous App Permissions类型[static, code]对应 MASWE-0066检查应用是否声明了危险权限先用 MASTG-TECH-0117 从 APK 中提取并解码AndroidManifest.xml如jadx --no-src -d out_dir MASTG-DEMO-0001.apk产物位于out_dir/resources/AndroidManifest.xml再用 MASTG-TECH-0126 列出全部uses-permission声明也可用aapt d permissions org.owasp.mastestapp.apk。将声明列表与 Android 官方危险权限清单比对并结合上下文评估例如扫码应用持有CAMERA权限合理而无相机功能的应用申请它则属多余又如可用系统相机 IntentACTION_IMAGE_CAPTURE替代直接申请CAMERA权限以最小化权限面。同目录的 MASTG-TEST-0255 / 0256 / 0257 尚为占位条目status: placeholder其中 0257Not Resetting Unused Permissions指向 Android 官方移除不再需要的权限访问实践属于该方向的延伸跟踪项。在披露一致性层面Document/0x04i-Testing-User-Privacy-Protection.md 归纳了数据保护三大目标可直接作为隐私验证的评价框架不可关联性Unlinkability用户的隐私相关数据不得与域外任何数据集关联涵盖数据最小化、匿名化、假名化透明度Transparency用户有权知晓应用掌握其哪些信息对应隐私政策、用户教育、日志与审计机制可干预性Intervenability用户应能更正个人信息、请求删除、随时撤回同意对应应用内隐私设置与联系渠道。Google Play Data Safety 区与 App Store 隐私标签正是透明度的落地载体——第三方 SDK 收集的数据类型必须与之一致这也是 MASTG-TEST-0318/0319/0206 三者共同的对照基准。八、测试流程整合从映射应用到形成结论将上述检查嵌入 Document/0x04b-Mobile-App-Security-Testing.md 描述的经典渗透测试流程中第三方服务验证应贯穿以下阶段准备Preparation界定范围依据隐私政策与商店隐私声明确定敏感数据定义prerequisites/identify-sensitive-data.md情报收集Intelligence Gathering梳理应用用到的第三方服务清单及其数据收集 API 入口应用映射Mapping the Application静态扫描MASTG-TEST-0318找出 SDK 方法调用点结合权限清单MASTG-TEST-0254评估数据获取面利用/验证Exploitation动态 HookMASTG-TEST-0319抓取真实参数与调用栈流量捕获MASTG-TEST-0206核实网络出口报告Reporting汇总哪些数据经哪个 SDK 方法、在哪个代码位置、以何值流出并对照商店声明给出失败结论。判定要点速查测试视角失败条件MASTG-TEST-0318静态代码引用找到已知处理敏感数据的 SDK 方法被调用MASTG-TEST-0319动态运行时 Hook运行时发现敏感数据被传给 SDK 方法MASTG-TEST-0206动态网络流量流量中发现未在商店声明/隐私政策中声明的 PIIMASTG-TEST-0254静态权限存在与功能上下文不符的危险权限结语第三方服务是移动应用的必要之恶它们带来跟踪、广告与体验优化能力却也引入了开发者无法掌控的代码行为。MASTG 给出的完整解法是以敏感数据定义 → 静态定位 API 入口 → 动态 Hook 抓取真实载荷 → 网络流量交叉验证 → 对照商店隐私声明为主线的五步验证法。本文所述的每一条测试均有仓库内对应实现测试用例见 tests-beta/android/MASVS-PRIVACY/MASTG-TEST-0318、0319、0206、0254完整可复现的演示见 MASTG-DEMO-0081前置知识可继续阅读 prerequisites/ 目录与 Document/0x04i-Testing-User-Privacy-Protection.md。测试者可据此在真实项目中按图索骥将第三方 SDK 是否越界收集从模糊的担忧变为可复现、可判定的测试结论。赞分享文档教程网络安全【免费下载链接】mastgThe OWASP Mobile Application Security Testing Guide (MASTG) is a comprehensive manual for mobile app security testing and reverse engineering. It describes technical processes for verifying the OWASP Mobile Security Weakness Enumeration (MASWE) weaknesses, which are in alignment with the OWASP MASVS.项目地址https://gitcode.com/gh_mirrors/ow/mastg点击查看免费下载相关推荐Morphic用户反馈收集内嵌表单与第三方服务集成Morphic用户反馈收集内嵌表单与第三方服务集成 1. 反馈收集系统设计背景 在AI驱动的答案引擎产品中用户反馈是迭代优化的核心依据。Morphic作为新人工智能AI 应用搜索引擎前端后端Salt Player椒盐音乐隐私协议全解读数据收集、第三方 SDK 与 Android 权限清单Salt Player椒盐音乐隐私协议全解读数据收集、第三方 SDK 与 Android 权限清单 导读 本文以仓库内的官方文档 椒盐音乐隐私协议 htSmartTube F-Droid 版隐私架构解析数据收集边界、第三方服务与合规设计SmartTube F Droid 版隐私架构解析数据收集边界、第三方服务与合规设计 导读 SmartTube 是一款面向 Android TV 的媒体浏览客音视频客户端上一篇OpenCode单元测试编写指南确保功能稳定性下一篇如何使用Bogus快速生成逼真测试数据从数据库模式到Faker类的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表