android-权限分析

https://github.com/cheyiliu/All-in-One/wiki/android-%E6%9D%83%E9%99%90%E5%88%86%E6%9E%90


android permission

权限模型

  • 在用户端看到的权限是: permission+签名
  • 在linux端看到的权限是: uid+gid

权限如何生效

  • 在framework层检测屏蔽
    • 权限级别normal, dangerous等仅用于安装时提醒用户,让用户决定;签名级别会对比签名;系统级别会对比系统属性;有的权限定义的有gid属性,满足权限要求后(PackageManagerService.java grantPermissionsLPw()),在运行时app进程会被设置相应的gid, cat /proc/pid/status可查看。
  • 在linux层利用uid+gid等权限机制

permission+签名如何被映射成uid+gid的?

常量定义

  • http://androidxref.com/4.4.4_r1/xref/system/core/include/private/android_filesystem_config.h 在java解析platform.xml时通过jni调用涉及到
    • This is the master Users and Groups config for the platform. DO NOT EVER RENUMBER.
    • eg.
    #define AID_LOG           1007  /* log devices */
    static const struct android_id_info android_ids[] = {
    // some other
    { "log",           AID_LOG, },
    // some other
    
  • http://androidxref.com/4.4.4_r1/xref/frameworks/base/data/etc/platform.xml 这个文件将会被拷贝到android系统的/etc/permissions目录下,供映射时解析,形成BasePermission。
    • The following tags are associating low-level group IDs with
      permission names. By specifying such a mapping, you are saying
      that any application process granted the given permission will
      also be running with the given group ID attached to its process,
      so it can perform any filesystem (read, write, execute) operations
      allowed for that group.
      (译: 如果apk申请READ_LOGS权限,则会在安装apk时,给此进程增加一个组,组名为log,使用的接口为setgid())
    • eg.
    <permission name="android.permission.READ_LOGS" >
        <group gid="log" />
    </permission>
    
  • http://androidxref.com/4.4.4_r1/xref/frameworks/base/core/res/AndroidManifest.xml 该文件负责系统所有权限的定义
  • /data/system/packages.xml, created byhttp://androidxref.com/4.4.4_r1/xref/frameworks/base/services/java/com/android/server/pm/Settings.java#205 其他相关信息: /data/system/packages.xml文件用于记录系统中所安装的Package信息;/data/system/packages-backup.xml文件是/data/packages.xml文件的备份。在PackageManagerService扫描完目标文件夹后会创建该文件,当系统进行程序安装卸载时会更新该文件。/data/system/packages-stopped.xml文件用于记录系统中强制停止运行的Package信息。/data/system/packages-stopped-backup.xml是/data/packages-stopped.xml文件的备份。在强制停止某个应用时,会将应用相关信息记录到该文件中。 /data/system/packages.list保存系统中存在的所有非系统自带的APK信息,即UID大于1000的apk。当系统第一次开机时,这些文件并不存在,而在以后的开机中,扫描到的这些XML文件是上一次运行过程中创建的。

从应用端经过framework到linux的映射过程

  • call stack (粗略分析)

    // 系统开机后  解析/etc/permissions目录下的配置,包括platform.xml,形成BasePermission
    see http://blog.csdn.net/yangwen123/article/details/9464779
    
    // 安装apk时解析
    PackageParser.java, parsePackage()//解析tag "uses-permission"等
    PackageManagerService.java, grantPermissionsLP()//获得权限对应的group_id
    
    // start app
    ActivityManagerService.java, startProcessLocked()//会去获取gid, mContext.getPackageManager().getPackageGids(        app.info.packageName);
    int pid = Process.start("android.app.ActivityThread",
            mSimpleProcessManagement ? app.processName : null, uid, uid,
            gids, debugFlags, null);  
    
    dalvik_system_Zygote.cpp, forkAndSpecializeCommon()//gid等传递过来 fork, setgid(gid)
    
  • see this for more info http://blog.csdn.net/yangwen123/article/details/9464779 orhttp://blog.csdn.net/andyhuabing/article/details/7464680

例子

  • 例子1, app申请了android.permission.WRITE_EXTERNAL_STORAGE权限,该权限的保护等级是dangerous仅用来提醒用户。应用获得该权限,并根据platform.xml中的定义,对应的gid是“sdcard_rw”, 在android_filesystem_config.h中查找到int型值是1015。故当app运行时,cat /proc/app_pid/status 查看groups项得知Groups:1015。 进入android设备查看sdcard文件夹权限,d---rwxr-x system sdcard_rw 1970-01-01 08:00 sdcard,可知sdcard_rw组有rwx的权限,故此app能读写sdcard了。

  • 例子2,同一个apk(申请一个system级别的android.permission.READ_LOGS权限)分别安装到/data/app和/system/app/下, cat /proc/pid/status的差异在groups。 用例1的步骤验证即可。

    /system/app, 
    u0_a49    28218 1159  483984 23932 ffffffff 40046ee4 S com.ccdt.crashreport
    root@android:/ # cat /proc/28218/status
    Name:   cdt.crashreport
    State:  S (sleeping)
    Tgid:   28218
    Pid:    28218
    PPid:   1159
    TracerPid:  0
    Uid:    10049   10049   10049   10049
    Gid:    10049   10049   10049   10049
    FDSize: 256
    Groups: 1007 1028 3003 50049 
    
    
    /data/app, 
    u0_a49    5850  1159  482936 24156 ffffffff 40046ee4 S com.ccdt.crashreport
    root@android:/ # cat /proc/5850/status
    Name:   cdt.crashreport
    State:  S (sleeping)
    Tgid:   5850
    Pid:    5850
    PPid:   1159
    TracerPid:  0
    Uid:    10049   10049   10049   10049
    Gid:    10049   10049   10049   10049
    FDSize: 256
    Groups: 1028 3003 50049 
    

system app vs 3rd part app

  • The only thing special about a system application beyond this is that there are a handful of signature permissions that can also be granted to any app on the system image.

ref


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 11 权限申请源码分析主要涉及到 Android 系统中的权限管理和权限申请流程。Android 11 引入了一些新的改进和特性,以加强对应用程序权限的控制。 首先,在 Android 11 中,权限管理变得更加细粒度化。应用程序需要请求所需的每个权限,而不再有"一次性"请求所有权限的方式。这使得用户更加容易了解应用程序的访问和使用权限,并且能够更好地管理自己的数据安全和隐私。 其次,Android 11 改进了用户权限请求流程。当应用程序需要某个权限时,会弹出一个权限请求对话框,而不是之前的全屏对话框。这使得用户能够更加方便地查看和选择是否授予该权限。此外,Android 11 还引入了一种新的权限模型,即"一次性权限"。一次性权限可临时授予应用程序某个权限,用户退出应用程序后该权限将自动回收,这有助于进一步提高用户对隐私和安全的控制。 在源码分析方面,可以深入研究 Android 11 权限管理相关的类和方法。例如,可以分析 PackageManager 和 PackageInstaller 类,它们提供了许多接口和方法用于处理应用程序的权限申请和管理。另外还可以研究 Activity 类中与权限相关的生命周期方法,如onRequestPermissionsResult() 方法,用于处理用户对权限请求的响应。 此外,源码分析还可以探索 Android 11 中新增的权限特性,如自动重置不再使用的权限权限请求的崩溃恢复等。这些特性都涉及到一些新的类和方法,如 AutoResetPermissionPolicy 和 PrivacyDialog 类,可以通过分析源码来了解其实现细节和内部逻辑。 总之,Android 11 权限申请源码分析是一项深入了解 Android 系统权限管理和权限申请流程的工作,可以通过研究相关类和方法,了解 Android 11 中的权限特性和改进,并为开发者提供更好的指导和帮助,以确保应用程序在权限使用上更加安全和合规。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值