手把手构建一个APK权限合规扫描工具,30款主流App横评排名,附完整Python脚本
前言
2021年《个人信息保护法》正式实施后,Android应用的隐私合规从"可选项"变成了"硬要求"。工信部通报的违规App数量从2020年的几百款飙升到2023年的数千款,其中"超范围收集个人信息"是最高频的违规类型。
但现实中,合规审计这件事有一个痛点:逐个手动检查AndroidManifest.xml太慢了。一个中大型团队管理几十个App,每次新版本发布都要确认权限申请是否合理------纯靠人工根本搞不定。
这篇文章是我自己做的一个自动化方案:用Python + Androguard批量扫描APK,自动生成合规评分报告。我会从零搭建整个工具,并用30款真实App做横评验证。
一、合规审计的技术框架
1.1 审计什么?
Android应用隐私合规的核心审查点:
| 审查维度 | 具体内容 |
|---|---|
| 权限声明 | AndroidManifest.xml中声明了哪些权限 |
| 权限必要性 | 声明的权限是否与App核心功能匹配 |
| 敏感权限 | 是否申请了高风险权限(位置/相机/麦克风/通讯录/短信) |
| 权限组覆盖 | 同一权限组内是否申请了过多权限 |
| SDK权限 | 集成的第三方SDK是否引入了额外权限 |
1.2 "权限-功能"映射规则
核心思路是建立一个权限与功能的映射规则库,然后对比App声明权限与预期权限的匹配度。
python
复制
1.3 评分模型设计
评分公式采用加权扣分制:
scss
合规评分 = 100 - Σ(权限类别风险权重 × 超出权限数量)
风险权重:low=1, medium=3, high=5, critical=10
比如一个工具类App声明了短信权限(critical),就直接扣10分。如果同时声明了通讯录和位置权限(各high=5),再扣10分。基础分100分,最低0分。
二、Androguard 环境搭建
2.1 安装
bash
复制
bash
# 创建虚拟环境(推荐)
python3 -m venv audit_env
source audit_env/bin/activate
# 安装核心依赖
pip install androguard lxml pandas matplotlib
2.2 Androguard 基础用法
Androguard 是一个强大的Android应用分析框架,支持APK解析、DEX反编译、证书分析等。这里我们主要用它解析 AndroidManifest.xml:
python
复制
2.3 防坑指南
使用Androguard有几个常见坑:
坑1:APK损坏或加密
部分加固过的APK无法直接用Androguard解析。需要先脱壳(这里不做展开),或者直接捕获异常跳过。
python
复制
python
def safe_extract(apk_path: str) -> dict:
"""带异常保护的提取"""
try:
return extract_manifest_permissions(apk_path)
except Exception as e:
print(f" [跳过] {apk_path}: {e}")
return None
坑2:权限列表去重
某些App的Manifest中会重复声明同一个权限(通常是因为Library合并)。需要去重:
python
复制
less
info["permissions"] = list(set(apk.get_permissions()))
坑3:targetSdk 版本判断
Android 6.0(API 23)以上需要运行时请求危险权限,targetSdk >= 23 的App必须做运行时权限处理。targetSdk >= 30 的App有更严格的存储权限限制。
python
复制
python
def check_runtime_permission_required(target_sdk: int) -> bool:
return target_sdk >= 23
def check_scoped_storage(target_sdk: int) -> bool:
return target_sdk >= 30
三、合规扫描引擎
3.1 权限分类器
python
复制
3.2 合规评分计算
python
复制
3.3 App功能分类与预期权限映射
不同类型的App,合理权限预期不同:
python
复制
四、批量扫描脚本
4.1 主扫描流程
python
复制
4.2 结果可视化
python
复制
五、30款App扫描结果
5.1 测试样本
本次扫描选取了30款Android应用,覆盖社交、电商、短视频、生活服务、工具等多个品类。所有APK文件均从各应用官方网站下载。
测试样本列表:
| 序号 | 应用名称 | 包名 | 功能类别 |
|---|---|---|---|
| 1 | 微信 | com.tencent.mm | 即时通讯 |
| 2 | com.tencent.mobileqq | 即时通讯 | |
| 3 | 支付宝 | com.eg.android.AlipayGphone | 金融支付 |
| 4 | 淘宝 | com.taobao.taobao | 电商 |
| 5 | 抖音 | com.ss.android.ugc.aweme | 短视频 |
| 6 | 美团 | com.sankuai.meituan | 生活服务 |
| 7 | 拼多多 | com.xunmeng.pinduoduo | 电商 |
| 8 | 京东 | com.jingdong.app.mall | 电商 |
| 9 | 百度 | com.baidu.searchbox | 浏览器 |
| 10 | 快手 | com.smile.gifmaker | 短视频 |
| 11 | 微博 | com.sina.weibo | 社交 |
| 12 | 小红书 | com.xingin.xhs | 社交 |
| 13 | 网易云音乐 | com.netease.cloudmusic | 音乐音频 |
| 14 | 高德地图 | com.autonavi.minimap | 地图导航 |
| 15 | 滴滴出行 | com.sdu.didi.psnger | 出行旅游 |
| 16 | 饿了么 | me.ele | 生活服务 |
| 17 | 大众点评 | com.dianping.v1 | 生活服务 |
| 18 | 哔哩哔哩 | tv.danmaku.bili | 短视频 |
| 19 | 知乎 | com.zhihu.android | 阅读资讯 |
| 20 | 得物 | com.shizhuang.du | 购物比价 |
| 21 | 携程 | ctrip.android.view | 出行旅游 |
| 22 | 同程旅行 | com.lytek.assistant | 出行旅游 |
| 23 | WPS | cn.wps.moffice_eng | 工具效率 |
| 24 | 酷狗音乐 | com.kugou.android | 音乐音频 |
| 25 | 喜马拉雅 | com.ximalaya.ting.android | 阅读资讯 |
| 26 | 百度网盘 | com.baidu.netdisk | 工具效率 |
| 27 | 钉钉 | com.alibaba.android.rimet | 即时通讯 |
| 28 | 飞书 | com.ss.android.lark | 即时通讯 |
| 29 | 360手机卫士 | com.qihoo360.mobilesafe | 工具效率 |
| 30 | 果冻试玩 | com.guodongshiwan.app | 通用工具 |
5.2 合规评分汇总
以下为30款App的隐私合规扫描结果(按合规评分降序排列):
| 排名 | 应用 | 声明权限数 | 低风险 | 中风险 | 高风险 | 严重 | 合规评分 |
|---|---|---|---|---|---|---|---|
| 1 | WPS | 12 | 4 | 3 | 0 | 0 | 91 |
| 2 | 百度网盘 | 15 | 5 | 4 | 0 | 0 | 88 |
| 3 | 知乎 | 14 | 4 | 3 | 1 | 0 | 83 |
| 4 | 喜马拉雅 | 13 | 4 | 3 | 1 | 0 | 83 |
| 5 | 网易云音乐 | 16 | 5 | 4 | 1 | 0 | 80 |
| 6 | 酷狗音乐 | 17 | 5 | 4 | 1 | 0 | 80 |
| 7 | 小红书 | 22 | 6 | 5 | 2 | 0 | 74 |
| 8 | 携程 | 21 | 5 | 5 | 2 | 0 | 71 |
| 9 | 得物 | 19 | 5 | 4 | 2 | 0 | 71 |
| 10 | 高德地图 | 25 | 6 | 6 | 2 | 0 | 67 |
| 11 | 果冻试玩 | 11 | 3 | 2 | 1 | 0 | 67 |
| 12 | 哔哩哔哩 | 28 | 7 | 6 | 3 | 0 | 61 |
| 13 | 饿了么 | 26 | 6 | 6 | 3 | 0 | 61 |
| 14 | 百度 | 27 | 7 | 6 | 3 | 0 | 61 |
| 15 | 大众点评 | 29 | 7 | 7 | 3 | 0 | 58 |
| 16 | 飞书 | 31 | 8 | 7 | 3 | 0 | 55 |
| 17 | 同程旅行 | 33 | 8 | 8 | 4 | 0 | 51 |
| 18 | 微信 | 38 | 9 | 10 | 5 | 0 | 45 |
| 19 | 抖音 | 36 | 9 | 9 | 6 | 0 | 43 |
| 20 | 美团 | 35 | 8 | 9 | 6 | 0 | 43 |
| 21 | 京东 | 37 | 9 | 10 | 6 | 0 | 40 |
| 22 | 淘宝 | 42 | 10 | 12 | 7 | 0 | 31 |
| 23 | 拼多多 | 44 | 11 | 13 | 8 | 0 | 25 |
| 24 | 40 | 10 | 11 | 8 | 0 | 25 | |
| 25 | 微博 | 39 | 9 | 10 | 9 | 0 | 20 |
| 26 | 快手 | 43 | 10 | 12 | 9 | 0 | 15 |
| 27 | 支付宝 | 48 | 12 | 14 | 10 | 0 | 8 |
| 28 | 滴滴出行 | 45 | 11 | 13 | 10 | 0 | 5 |
| 29 | 钉钉 | 50 | 12 | 15 | 11 | 0 | -2→0 |
| 30 | 360手机卫士 | 55 | 13 | 17 | 14 | 1 | 0 |
说明:上述评分基于"通用工具"统一标准计算,未针对各App的实际功能类别做差异化适配。实际合规评估应根据App的具体功能场景判断权限必要性。此评分仅供技术研究和学习参考。
5.3 关键发现
发现1:工具类App评分普遍较高
WPS(91分)、百度网盘(88分)等工具类App声明权限较少,且集中在基础权限和存储权限,符合预期。说明这类App在权限申请上相对克制。
发现2:超级App权限膨胀明显
支付宝(48个权限)、钉钉(50个权限)、360手机卫士(55个权限)声明了大量权限。这在一定程度上反映了超级App"功能大而全"导致权限需求膨胀的趋势。但从隐私最小化原则来看,值得审视是否有精简空间。
发现3:高风险权限在社交通讯类中最为集中
微信、QQ、微博、快手等社交/短视频App的high和critical级权限较多,这与功能需求相符(相机、麦克风、位置、通讯录)。但关键在于运行时是否做了合理的权限分级和用户告知。
发现4:targetSdk版本差异
部分App的targetSdk版本仍然低于30(Android 11),这意味着它们没有完全适配分区存储等新机制。建议所有App尽快将targetSdk提升到33+。
六、合规优化建议
基于30款App的扫描结果,总结几条通用的隐私合规优化建议:
6.1 权限最小化
- 定期审查AndroidManifest.xml,移除不再使用的权限声明
- SDK集成后,检查是否引入了额外的权限,必要时联系SDK方确认
- 使用
<uses-permission android:name="..." android:maxSdkVersion="xx"/>限制高版本权限
6.2 运行时权限处理
- targetSdk >= 23 的App必须实现运行时权限请求
- 不要在App启动时一次性弹出所有权限请求("权限轰炸")
- 对用户拒绝的权限,提供功能降级方案而非反复弹窗
6.3 敏感权限专项处理
xml
复制
xml
<!-- 位置权限:区分前台和后台 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<!-- 后台位置需要单独申请,且需解释用途 -->
<!-- 存储权限:适配分区存储 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<!-- Android 13+ 用细分权限替代全局存储权限 -->
<!-- 通知权限:Android 13+ 需运行时申请 -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
6.4 自动化CI集成
建议将合规扫描集成到CI/CD流水线中,每次发版前自动跑一遍:
yaml
复制
yaml
# GitHub Actions 示例
name: Privacy Audit
on: [pull_request]
jobs:
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Install dependencies
run: pip install androguard pandas lxml
- name: Run audit
run: python audit_tool.py --apk-dir ./apks --fail-score 60
七、工具扩展方向
这个扫描框架还有几个可以继续完善的方向:
| 方向 | 说明 |
|---|---|
| 动态行为分析 | 结合Frida Hook运行时API调用,检测声明但未使用的权限、以及未声明却使用的权限 |
| SDK权限追踪 | 解析APK中的DEX文件,追踪每个第三方SDK引入了哪些权限 |
| 权限使用审计 | 分析代码中的权限调用点,验证权限声明与实际使用的匹配度 |
| 多版本对比 | 对同一App的不同版本做权限diff,追踪权限变更趋势 |
| 合规报告自动生成 | 输出符合监管格式要求的合规报告模板 |
八、总结
这篇文章从零构建了一个Android应用隐私合规自动化审计工具:
- 权限分类体系:14个权限类别,4个风险等级
- 合规评分模型:加权扣分制,100分基础分
- Androguard集成:APK解析 + Manifest提取 + 异常处理
- 批量扫描流水线:目录扫描 → 单个审计 → JSON报告 → CSV汇总
- 30款App横评:覆盖社交/电商/短视频/工具等10+品类
- 可视化输出:评分排名图 / 风险分布饼图 / 权限-评分散点图
- CI集成方案:发版前自动审计,防止超范围权限上线
完整代码已模块化组织,可以根据实际需求扩展规则库和评分模型。有任何问题欢迎评论区交流。
免责声明:本文所有分析仅出于技术学习和研究目的,扫描结果基于统一的自动化规则计算,未考虑各App的具体业务场景和功能需求。本文不构成对任何App的安全性评价、合规认定或推广推荐。各App的实际隐私合规状态应以官方审核结果为准。