12、权限安全:权限提升攻击、最小权限原则、权限滥用检测
权限这东西,说简单也简单,说复杂真能坑死人。
我见过太多应用,明明只需要一个拍照权限,却非要把通讯录、定位、短信全要了。用户一看,心里咯噔一下:「这破游戏要我通讯录干嘛?」——嗯,这就是典型的权限滥用。
但更可怕的,是那些利用权限漏洞搞攻击的。权限提升攻击,说白了就是「以小博大」——一个普通应用,通过系统漏洞或设计缺陷,拿到了本不该属于它的高级权限。我在项目中就遇到过,一个第三方输入法,居然能偷偷读取剪贴板里的密码。你说吓不吓人?
核心观点:权限安全不是「给不给」的问题,而是「该不该给、给了之后怎么管」的问题。
12.1 权限提升攻击:那些「越狱」的权限
权限提升攻击,英文叫 Privilege Escalation。分两种:
- 纵向提升:从普通用户变成 root 或 system 用户。比如利用内核漏洞拿到 root shell。
- 横向提升:从普通应用 A 拿到应用 B 的权限。比如通过 Content Provider 漏洞读取另一个应用的数据库。
我记得有一次,一个客户的应用被爆出「权限提升漏洞」。原因是他们用了一个自定义的 Content Provider,没有做权限校验。结果隔壁应用直接通过这个 Provider 读取了用户的支付密码。嗯,那晚我们加班到凌晨三点。
常见的攻击手法
| 攻击类型 | 原理 | 典型案例 |
|---|---|---|
| 内核漏洞利用 | 利用 Linux 内核或驱动漏洞获取 root 权限 | CVE-2015-6639(Stagefright) |
| 组件劫持 | 利用未导出的 Activity/Service 被外部调用 | Activity 劫持钓鱼攻击 |
| 权限重授权 | 利用系统权限升级机制缺陷 | Android 6.0 之前的「权限一次授予永久有效」 |
| IPC 欺骗 | 伪造 Binder 调用方身份 | 恶意应用冒充系统服务 |
⚠️ 避坑指南:我曾经遇到一个案例,开发者把 android:protectionLevel="signature" 写成了 signatureOrSystem。结果系统级应用都能访问,差点酿成大祸。权限声明一定要精确,别偷懒。
12.2 最小权限原则:少即是多
最小权限原则(Principle of Least Privilege, PoLP)听起来高大上,说白了就是:只给应用完成功能所必需的最少权限。
你想想看,一个手电筒应用,需要什么权限?打开闪光灯就够了。但你去应用商店搜一下,多少手电筒应用要了「读取联系人」「获取位置」「访问相机」?这不是功能需要,这是数据收集。
如何落地最小权限原则?
- 权限清单审计:每加一个权限,问自己三次「真的需要吗?」
- 运行时权限:Android 6.0+ 的运行时权限机制,让用户可以在使用中拒绝权限。
- 权限分组:把权限按「核心功能」「可选功能」「分析功能」分类管理。
- 权限降级:如果某个功能不需要权限了,记得在代码中移除权限声明。
💡 我的习惯:在项目初期,我会先列一个「权限需求表」,和产品经理、后端一起过一遍。每多一个权限,就要多一份安全责任。这个习惯帮我挡掉了至少 30% 的权限滥用风险。
12.3 权限滥用检测:怎么抓「坏蛋」?
权限滥用,就是应用拿到了权限,却干了不该干的事。比如:
- 后台偷偷录音
- 频繁读取位置信息上传服务器
- 读取通讯录后卖给第三方
怎么检测?我总结了三个层面:
静态检测:看代码
用工具扫描 AndroidManifest.xml 和代码中的权限调用。比如:
// 检查是否声明了不必要的权限
// 工具:Androguard、QARK、MobSF
// 手动检查:搜索 getSystemService()、ContentResolver.query() 等敏感 API
动态检测:看行为
运行时监控应用的权限使用情况。Android 10+ 提供了 AppOpsManager,可以记录权限使用日志。
// 示例:监控位置权限使用
AppOpsManager appOps = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
appOps.startWatchingMode(
AppOpsManager.OPSTR_FINE_LOCATION,
packageName,
new AppOpsManager.OnOpChangedListener() {
@Override
public void onOpChanged(String op, String packageName) {
// 权限被使用了,记录日志
Log.w("PermissionMonitor", packageName + " 使用了位置权限");
}
}
);
行为分析:看模式
有些权限滥用是「低频高敏感」的。比如一个天气应用,每天凌晨 3 点读取一次位置——这正常吗?不正常。正常天气应用应该是用户打开时才获取位置。
检测思路:建立「权限使用基线」。比如:拍照应用在拍照时使用相机权限是正常的,但在后台频繁使用就是异常。用机器学习做异常检测,效果更好。
12.4 知识体系总览
下面这张图,是我自己梳理的权限安全知识体系。你看一眼,就能把这一章的内容串起来。
12.5 实战建议:从今天开始能做什么?
别光看不练。我给你三个立刻能上手的动作:
- 打开你的 AndroidManifest.xml,把每个权限旁边写上「为什么需要」。写不出来的,删掉。
- 用
adb shell dumpsys appops看看你手机上每个应用的权限使用情况。你会发现很多「惊喜」。 - 在 CI/CD 流程中加入权限扫描。我推荐用
gradle插件或者MobSF,自动检测权限滥用。
💡 一个小技巧:Android 11 引入了「自动重置权限」功能。如果用户长时间不用某个应用,系统会自动撤销授予的权限。这个功能很实用,建议在应用中适配。
权限安全,说到底就是「信任管理」。你给应用一个权限,就是给了它一份信任。别让这份信任被滥用。
嗯,这一章就到这里。记住:权限不是越多越好,够用就行。
公众号:蓝海资料掘金营,微信deep3321