`
globaldev
  • 浏览: 35526 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android权限机制总结与常见权限不足问题分析

阅读更多
Android权限机制总结与常见权限不足问题分析
2010-07-14 16:18

Android系统是运行在Linux内核上的,Android与Linux分别有自己的一套严格的安全及权限机制,
很多像我这样的新手,尤其是习惯了windows低安全限制的用户,很容易在这方面弄混淆,下面是我总结的Android系统权限相关的内容,
作为这段时间对android权限学习的总结,也希望能对大家有所帮助,不正确之处请指出。

首先分清两个概念:
要区分apk运行时的拥有的权限与在文件系统上被访问(读写执行)的权限两个概念。
apk程序是运行在虚拟机上的,对应的是Android独特的权限机制,只有体现到文件系统上时才使用linux的权限设置。


(一)linux文件系统上的权限
-rwxr-x--x system   system       4156 2010-04-30 16:13 test.apk
代表的是相应的用户/用户组及其他人对此文件的访问权限,与此文件运行起来具有的权限完全不相关。
比如上面的例子只能说明system用户拥有对此文件的读写执行权限;system组的用户对此文件拥有读、执行权限;其他人对此文件只具有执行权限。
而test.apk运行起来后可以干哪些事情,跟这个就不相关了。
千万不要看apk文件系统上属于system/system用户及用户组,或者root/root用户及用户组,就认为apk具有system或root权限。


(二)Android的权限规则

(1)Android中的apk必须签名
这种签名不是基于权威证书的,不会决定某个应用允不允许安装,而是一种自签名证书。
重要的是,android系统有的权限是基于签名的。比如:system等级的权限有专门对应的签名,签名不对,权限也就获取不到。

默认生成的APK文件是debug签名的。
获取system权限时用到的签名,见:如何使Android应用程序获取系统权限

(2)基于UserID的进程级别的安全机制
大家都知道,进程有独立的地址空间,进程与进程间默认是不能互相访问的,是一种很可靠的保护机制。
Android通过为每一个安装在设备上的包(apk)分配唯一的linux userID来实现,名称为"app_"加一个数字,比如app_43
不同的UserID,运行在不同的进程,所以apk之间默认便不能相互访问。

Android提供了如下的一种机制,可以使两个apk打破前面讲的这种壁垒。
在AndroidManifest.xml中利用sharedUserId属性给不同的package分配相同的userID,通过这样做,两个package可以被当做同一个程序,
系统会分配给两个程序相同的UserID。当然,基于安全考虑,两个package需要有相同的签名,否则没有验证也就没有意义了。

(这里补充一点:并不是说分配了同样的UserID,两程序就运行在同一进程, 下面为PS指令摘取的,
显然,system、app_2分别对应的两个进程的PID都不同,不知Android到底是怎样实现它的机制的)

User   PID PPID
system    953   883   187340 55052 ffffffff afe0cbcc S system_server
app_2     1072 883   100264 19564 ffffffff afe0dcc4 S com.android.inputmethod.
system    1083 883   111808 23192 ffffffff afe0dcc4 S android.process.omsservi
app_2     1088 883   156464 45720 ffffffff afe0dcc4 S android.process.acore


(3)默认apk生成的数据对外是不可见的
实现方法是:Android会为程序存储的数据分配该程序的UserID。
借助于Linux严格的文件系统访问权限,便实现了apk之间不能相互访问似有数据的机制。
例:我的应用创建的一个文件,默认权限如下,可以看到只有UserID为app_21的程序才能读写该文件。
-rw------- app_21   app_21      87650 2000-01-01 09:48 test.txt

如何对外开放?
<1> 使用MODE_WORLD_READABLE and/or MODE_WORLD_WRITEABLE 标记。
When creating a new file with getSharedPreferences(String, int), openFileOutput(String, int), or openOrCreateDatabase(String, int, SQLiteDatabase.CursorFactory), you can use the MODE_WORLD_READABLE and/or MODE_WORLD_WRITEABLE flags to allow any other package to read/write the file. When setting these flags, the file is still owned by your application, but its global read and/or write permissions have been set appropriately so any other application can see it.


(4)AndroidManifest.xml中的显式权限声明
Android默认应用是没有任何权限去操作其他应用或系统相关特性的,应用在进行某些操作时都需要显式地去申请相应的权限。
一般以下动作时都需要申请相应的权限:

A particular permission may be enforced at a number of places during your program's operation:

At the time of a call into the system, to prevent an application from executing certain functions.
When starting an activity, to prevent applications from launching activities of other applications.
Both sending and receiving broadcasts, to control who can receive your broadcast or who can send a broadcast to you.
When accessing and operating on a content provider.
Binding or starting a service.

在应用安装的时候,package installer会检测该应用请求的权限,根据该应用的签名或者提示用户来分配相应的权限。
在程序运行期间是不检测权限的。如果安装时权限获取失败,那执行就会出错,不会提示用户权限不够。
大多数情况下,权限不足导致的失败会引发一个 SecurityException, 会在系统log(system log)中有相关记录。
(5)权限继承/UserID继承
当我们遇到apk权限不足时,我们有时会考虑写一个linux程序,然后由apk调用它去完成某个它没有权限完成的事情,很遗憾,这种方法是行不通的。
前面讲过,android权限是经营在进程层面的,也就是说一个apk应用启动的子进程的权限不可能超越其父进程的权限(即apk的权限),
即使单独运行某个应用有权限做某事,但如果它是由一个apk调用的,那权限就会被限制。
实际上,android是通过给子进程分配父进程的UserID实现这一机制的。

(三)常见权限不足问题分析

首先要知道,普通apk程序是运行在非root、非system层级的,也就是说看要访问的文件的权限时,看的是最后三位。
另外,通过system/app安装的apk的权限一般比直接安装或adb install安装的apk的权限要高一些。

言归正传,运行一个android应用程序过程中遇到权限不足,一般分为两种情况:
(1)Log中可明显看到权限不足的提示。
此种情况一般是AndroidManifest.xml中缺少相应的权限设置,好好查找一番权限列表,应该就可解决,是最易处理的情况。

有时权限都加上了,但还是报权限不足,是什么情况呢?
Android系统有一些API及权限是需要apk具有一定的等级才能运行的。
比如 SystemClock.setCurrentTimeMillis()修改系统时间,WRITE_SECURE_SETTINGS权限 好像都是需要有system级的权限才行。
也就是说UserID是system.

(2)Log里没有报权限不足,而是一些其他Exception的提示,这也有可能是权限不足造成的。
比如:我们常会想读/写一个配置文件或其他一些不是自己创建的文件,常会报java.io.FileNotFoundException错误。
系统认为比较重要的文件一般权限设置的也会比较严格,特别是一些很重要的(配置)文件或目录。

-r--r----- bluetooth bluetooth      935 2010-07-09 20:21 dbus.conf
drwxrwx--x system   system            2010-07-07 02:05 data

dbus.conf好像是蓝牙的配置文件,从权限上来看,根本就不可能改动,非bluetooth用户连读的权利都没有。

/data目录下存的是所有程序的私有数据,默认情况下android是不允许普通apk访问/data目录下内容的,通过data目录的权限设置可知,其他用户没有读的权限。
所以adb普通权限下在data目录下敲ls命令,会得到opendir failed, Permission denied的错误,通过代码file.listfiles()也无法获得data目录下的内容。


上面两种情况,一般都需要提升apk的权限,目前我所知的apk能提升到的权限就是system(具体方法见:如何使Android应用程序获取系统权限),
至于是否有root级的,如何提升至root级不得而知,知道的朋友劳烦告知,感激不尽。
分享到:
评论

相关推荐

    Android各个主要手机机型跳转权限设置界面代码

    首先,Android权限分为运行时权限(Runtime Permissions)和安装时权限(Install-Time Permissions)。运行时权限是在应用运行过程中,当需要使用特定敏感权限时,系统会弹出请求用户授权的对话框。安装时权限则是在...

    android5.0权限问题解决办法

    随着Android系统的不断升级与完善,为了更好地保护用户数据的安全性,从Android 5.x版本开始,系统引入了更为严格的SELinux(Security Enhanced Linux)权限管理机制。这一机制有效地提高了Android系统的安全性,但...

    AndroidBinder机制总结[归纳].pdf

    在Android系统中,Binder机制是实现进程间通信(IPC)的核心工具,尤其在跨应用程序组件交互时至关重要。本文将深入探讨Android Binder机制及其在组件化思想中的应用。 1. Android组件化思想 Android应用的组件化...

    android6.0的新权限问题说明

    #### 一、新权限机制概述 在Android 6.0之前,应用在安装过程中会列出所需的所有权限,并要求用户同意这些权限才能完成安装过程。这种方式虽然简单明了,但用户往往无法了解每个权限的具体用途,也不清楚哪些权限是...

    Android权限检测

    总结来说,Android权限检测是保障应用安全性和用户体验的重要环节。开发者需要理解权限系统的原理,掌握正确的检测和申请权限的方法,并在设计和实现应用时充分考虑用户隐私和权限管理。通过有效的权限检测,可以...

    Android逆向分析权限和API提取工具

    首先,我们要明白Android权限系统是保护应用数据和资源的关键机制。每个Android应用在安装时都需要声明它所需的权限,这些权限控制着应用能够访问哪些系统资源和服务。例如,一个应用如果需要读取联系人信息,就需要...

    Android权限列表permission说明.

    Android权限机制通过一系列的权限声明和权限检查来实现这一目标。本文将详细介绍部分Android权限,并解释它们的作用与应用场景。 #### 二、详细权限介绍 1. **ACCESS_COARSE_LOCATION** - **定义**:此权限用于...

    Android软件安全与逆向分析_带书签_Android软件安全与逆向分析_带书签_android_

    在Android平台上,软件安全与逆向分析是极其重要的话题,因为随着移动设备的普及,恶意软件和隐私泄露问题日益严重。本篇文章将根据书中的关键知识点进行详细阐述。 一、Android系统安全基础 1. Android系统架构:...

    Android OS手机平台的安全机制分析和应用研究

    在实验部分,文章选取了一个常见的应用场景——媒体播放器,来具体分析Android安全机制的实际运作原理。通过这一示例,我们可以更直观地了解Android如何利用其安全特性来保护用户的数据安全和系统安全。 1. **权限...

    android常见面试题总结

    六、Android权限管理 理解Android的权限模型,尤其是针对6.0及以上版本的动态权限申请。 七、Android组件化和模块化 理解组件化开发的优势,如何实现模块间的解耦。 八、热修复与插件化 了解热修复技术(如腾讯的...

    Android Camera问题资料

    这个压缩包文件包含了一系列与Android Camera问题相关的文档,涵盖了从基础问题解决到深入的技术分析。以下是对这些文档内容的概览: 1. **解决Android 2.2 Camera问题**: 这份文档可能提供了针对Android 2.2版本...

    Android配置文件,所有权限

    在Android操作系统中,权限管理系统是保障应用安全性和用户隐私的关键机制。配置文件中列出的权限涉及到多个方面,包括位置访问、网络状态、账户管理、系统服务绑定、设备控制以及通信等。下面将详细解释这些权限的...

    Android5.X即以上系统权限解决方法

    自Android 5.0(Lollipop)以来,Google为了增强系统的安全性与稳定性,引入了一种更为严格的SELinux(Security Enhanced Linux)权限管理机制。这一机制的核心在于通过严格的访问控制策略来限制应用程序和其他系统...

    Android自定义权限

    在Android系统中,权限管理是保障应用程序安全性和用户隐私的关键机制。默认情况下,Android提供了大量预定义的权限,如访问互联网、读写存储等。然而,对于某些特定需求的应用,预定义的权限可能无法满足,这时就...

    Android权限大全

    ### Android权限详解 #### 1. Android权限概览 Android系统为了确保用户数据的安全与隐私保护,设计了一套详尽的权限管理系统。开发者在开发应用时必须明确声明所需权限,并在运行时请求敏感权限,以确保应用能...

    android安全机制文档

    Android 安全机制文档主要探讨了Android平台上的安全策略,尤其是围绕公钥、私钥和数字证书的加密与认证机制。这些机制是Android安全体系中的核心组成部分,用于保护应用程序的数据安全和用户隐私。 首先,加密和...

    玩转Android之-权限设置

    以上列举了一些常见的Android权限及其应用场景,这些权限是Android应用开发过程中必不可少的一部分。开发者在设计应用时需要根据实际需求合理选择所需的权限,同时也要注意遵循最小权限原则,避免申请不必要的权限,...

    180个Android开发常见问题、实用技巧及注意事项

    在Android开发过程中,开发者经常会遇到各种问题,这些挑战可能...以上只是部分Android开发中的常见问题、实用技巧和注意事项,实际开发中还有更多细节需要注意。不断学习和实践,才能成为一名优秀的Android开发者。

    Android——华为手机(G9)调用Camera需要手动申请权限

    在标题中提到的问题,即在华为G9上开发应用调用相机时,需要手动申请权限,这是Android 6.0(API级别23)引入的动态权限管理机制所导致的。 Android 6.0之前的版本,应用在安装时会一次性获取所有所需权限,而在6.0...

Global site tag (gtag.js) - Google Analytics