目录
  1. 1. 一、权限分级体系
  2. 2. 二、如何分析应用的权限使用
  3. 3. 三、最小权限原则
  4. 4. 面试常考问题
【逆向安全技术-防护篇】常用权限分析

一、权限分级体系

Android 权限分为三个保护级别:Normal(普通权限,安装时自动授予)、Dangerous(危险权限,需运行时动态申请)、Signature(签名权限,仅与系统同签名的应用可获取)。权限声明在 AndroidManifest.xml 中,但声明不等于获得——系统会根据保护级别分派处理逻辑。

从实现原理上看,权限检查分为两层:Framework 层通过 PackageManagerService 管理权限注册与检查,调用路径为 PackageManager.checkPermission()ActivityManagerService.checkComponentPermission()Kernel 层则基于 Linux DAC(Discretionary Access Control,自主访问控制)和 MAC(Mandatory Access Control,强制访问控制,即 SELinux),通过 UID/GID 映射实现进程级隔离。

二、如何分析应用的权限使用

使用 aapt dump permissions app.apk 可以列出应用声明的所有权限。分析时重点关注:应用是否声明了大量非必要权限(权限泛滥),是否声明了 signature 级别的系统权限(可能利用漏洞提权),以及自定义权限的 protectionLevel 设置是否正确。

AOSP 中权限定义的源码路径:/frameworks/base/core/res/AndroidManifest.xml 定义了所有系统权限;/frameworks/base/services/core/java/com/android/server/pm/permission/PermissionManagerService.java 实现了权限检查逻辑。阅读这些源码有助于深入理解权限检查的完整调用链。

// 运行时权限检查示例(Framework 内部调用链简化)
// ContextImpl.checkPermission() ->
// ActivityManager.getService().checkPermission()
public int checkPermission(String permission, int pid, int uid) {
if (permission == null) return PackageManager.PERMISSION_DENIED;
// 系统 UID 或 root 直接通过
if (uid == Process.SYSTEM_UID || uid == 0) {
return PackageManager.PERMISSION_GRANTED;
}
// 遍历该 uid 下所有包,逐一检查
// ... 详见 PermissionManagerService
}

三、最小权限原则

每个应用仅应请求实现其功能所必需的权限。过度申请权限不仅触犯用户隐私预期,也增大了攻击面——一旦应用自身存在漏洞被利用,攻击者即可借助已授予的权限扩大危害。从逆向分析的角度看,权限列表本身就是攻击的”菜单”:通过权限清单可以初步判断应用的功能边界和可能的漏洞攻击点。

面试常考问题

Q1: Normal、Dangerous、Signature 权限的区别?
A: Normal 权限安装时静默授予,不弹出确认框(如 INTERNET)。Dangerous 权限涉及隐私数据,Android 6.0+ 需运行时通过 requestPermissions() 弹窗获取用户授权(如 CAMERA、CONTACTS)。Signature 权限仅在请求应用的签名与声明该权限的系统应用签名相同时授予,用于系统级组件保护(如 BIND_DEVICE_ADMIN)。

Q2: 权限检查在 Framework 和 Kernel 层分别如何实现?
A: Framework 层在 PackageManager.checkPermission() 中检查 manifest 声明和动态授权状态;Kernel 层通过 UID/GID 实现 DAC,通过 SELinux 策略实现 MAC。每个应用的 Linux UID 唯一,权限最终映射为进程对内核资源的访问能力。AOSP 路径:/frameworks/base/core/java/android/app/ApplicationPackageManager.java 中的 checkPermission 方法,以及 /frameworks/base/services/core/java/com/android/server/pm/permission/PermissionManagerService.java 中的授权逻辑。

Q3: 如何检测一个应用是否存在权限提升漏洞?
A: 检查其导出的组件(Activity、Service、BroadcastReceiver、ContentProvider)是否有权限保护(android:permission 属性)。恶意应用可调用无权限保护的导出组件间接获取资源。另外检查自定义权限的 protectionLevel 是否为 signature——如果设为 normal 且未正确校验调用者身份,则存在权限提升风险。

打赏
  • 微信
  • 支付宝

评论