`
dengzhangtao
  • 浏览: 677562 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Android的权限机制之—— “沙箱”机制sharedUserId和签名

 
阅读更多

Android“沙箱”的本质是为了实现不同应用程序和进程之间的互相隔离,即在默认情况 下,应用程序没有权限访问系统资源或其它应用程序的资源。每个APP和系统进程都被分配唯一并且固定的User Id,这个uid与内核层进程的uid对应。每个APP在各自独立的Dalvik虚拟机中运行,拥有独立的地址空间和资源。运行于Dalvik虚拟机中的 进程必须依托内核层Linux进程而存在,因此Android使用Dalvik虚拟机和Linux的文件访问控制来实现沙箱机制,任何应用程序如果想要访 问系统资源或者其它应用程序的资源必须在自己的manifest文件中进行声明权限或者共享uid。

 

    安装在设备中的每一个apk文件,Android给每个APK进程分配一个单独的用户空间,其manifest中的userid就是对应一个Linux 用户都会被分配到一个属于自己的统一的Linux用户ID,并且为它创建一个沙箱,以防止影响其他应用程序(或者其他应用程序影响它)。用户ID 在应用程序安装到设备中时被分配,并且在这个设备中保持它的永久性。

 

通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中.所以默认就是可以互相访问任意数据. 也可以配置成运行成不同的进程, 同时可以访问其他APK的数据目录下的数据库和文件.就像访问本程序的数据一样.

 

PID:为Process Identifier, PID就是各进程的身份标识,程序一运行系统就会自动分配给进程一个 独一无二的PID。进程中止后PID被系统回收,可能会被继续分配给新运行的程序,但是在android系统中一般不会把已经kill掉的进程ID重新分 配给新的进程,新产生进程的进程号,一般比产生之前所有的进程号都要大。

UID:一般理解为User Identifier,UID在linux中就是用户的ID,表明时哪个用户运行了这个程序,主要用于权限的管理。而在android 中又有所不同,因为android为单用户系统,这时UID 便被赋予了新的使命,数据共享,为了实现数据共享,android为每个应用几乎都分配了不同的UID,不像传统的linux,每个用户相同就为之分配相 同的UID。(当然这也就表明了一个问题,android只能时单用户系统,在设计之初就被他们的工程师给阉割了多用户),使之成了数据共享的工具。

因此在android中PID,和UID都是用来识别应用程序的身份的,但UID是为了不同的程序来使用共享的数据。

在android 中要通过UID共享数据只需在程序a,b中的menifest配置即可,具体如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.perseus.a"
      android:versionCode="1"
      android:versionName="1.0"
          android:sharedUserId="com.share">
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.perseus.b"
      android:versionCode="1"
      android:versionName="1.0"
          android:sharedUserId="com.share">
   这样的话你也许会有疑问,如果让其他的开发这知道了我们的shareUserId知道了我们的ID,那我们的数据不是暴露了,放心吧google不会犯 这样的低级错误的,我们要使不同的程序能够相互访问,还需要拥有相同的签名,每个公司或者开发者的签名是唯一的,这样我们就不用担心了,另外两者能够访 问,别忘了权限。

 

总之

对于一个APK来说,如果要使用某个共享UID的话,必须做一下两部步:

 

1、相同的在Manifest节点中增加android:sharedUserId属性。

 

2、相同的在Android.mk中增加LOCAL_CERTIFICATE的定义。(既签名相同)

 

签名可以用eclipse或者手动或者源码下的mk文件三种来签名。

 

 

如果有看系统源码的同学,可以看到一些系统应用就是这样:

系统中所有使用android.uid.system作为共享UID的APK,都会首先在manifest节点中增加 android:sharedUserId="android.uid.system",然后在Android.mk中增加 LOCAL_CERTIFICATE := platform。可以参见Settings等

 

系统中所有使用android.uid.shared作为共享UID的APK,都会在manifest节点中增加 android:sharedUserId="android.uid.shared",然后在Android.mk中增加 LOCAL_CERTIFICATE := shared。可以参见Launcher等

 

系统中所有使用android.media作为共享UID的APK,都会在manifest节点中增加 android:sharedUserId="android.media",然后在Android.mk中增加LOCAL_CERTIFICATE := media。可以参见Gallery等。

 

 

另外,应用创建的任何文件都会被赋予应用的用户标识,并且正常情况下不能被其他包访问。当通过 getSharedPreferences(String,int)、openFileOutput(String、int)或者 openOrCreate Database(String、int、SQLiteDatabase.CursorFactory)创建一个新文件时,开发者可以同时或分别使用 MODE_WORLD_READABLE和MODE_WORLD_RITEABLE标志允许其他包读/写此文件。当设置了这些标志后,这个文件仍然属于自 己的应用程序,但是它的全局读/写和读/写权限已经设置,所以其他任何应用程序可以看到它。这个和上面的设置sharedUId想必更加不安全。

 

关于签名:

 

build/target/product/security目录中有四组默认签名供Android.mk在编译APK使用:

 

1、testkey:普通APK,默认情况下使用。

 

2、platform:该APK完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试,这种方式编译出来的APK所在进程的UID为system。

 

3、shared:该APK需要和home/contacts进程共享数据。

 

4、media:该APK是media/download系统中的一环。

 

签名部分:

 

应用程序的Android.mk中有一个LOCAL_CERTIFICATE字段,由它指定用哪个key签名,未指定的默认用testkey.

 

 

 

对于使用eclipse编译的apk,可以使用signapk.jar来手动进行签名,其源码在build/tools/signapk下,编译后 在out/host/linux-x86/framework/signapk.jar,也可以从网上下载。使用方法,以platform为例:java -jar ./signapk platform.x509.pem platform.pk8 input.apk output.apk  (platform.x509.pem platform.pk8在build/target/product/security获取)

 

 

附件是sharedUid的使用和openFileOutput的测试列子。

0
0
分享到:
评论

相关推荐

    我国区块链金融监管机制探究——以构建“中国式沙箱监管”机制为制度进路.pdf

    #资源达人分享计划#

    阿里技术分享 Android中的应用程序沙箱 共30页.pptx

    Android应用程序沙箱安全机制 Android 操作系统提供了一个安全的沙箱机制,以保护...Android 应用程序沙箱安全机制是一个多层次的安全控制机制,旨在保护用户数据和系统资源,确保应用程序之间的隔离和限制访问权限。

    Android智能手机安全机制解析.pdf

    论文首先介绍了Android智能手机安全机制的重要性,然后深入探讨了Linux内核层安全机制、权限机制、签名机制和沙箱机制等。 Android智能手机安全机制是Android操作系统的核心组件之一,对于保护用户的隐私和安全...

    《Android安全机制解析》

    《Android安全机制解析》这本书深入探讨了Android操作系统中的安全架构和机制,对于想要在Android安全领域深化理解的读者来说,是一本不可多得的参考文献。Android系统作为全球最受欢迎的移动操作系统之一,其安全性...

    Android操作系统安全机制研究.doc

    2. 签名机制:每个Android应用都需要签名,签名能确保应用的完整性和来源,防止恶意篡改。但签名验证并不强制,存在漏洞。 3. Linux内核:Android基于Linux内核,利用其强大的安全特性,如进程隔离、权限控制等。...

    沙箱支付+签名工具.zip

    "沙箱支付+签名工具.zip"这个压缩包文件提供了一套用于支付宝开发的测试环境和签名工具,这对于开发者来说是一个非常实用的资源。下面将详细讲解这个工具包中的关键知识点。 首先,"沙箱支付"是指支付宝提供的一个...

    Android 0day漏洞检测沙箱系统的设计与实现-v3.7.pdf

    Android平台是目前最广泛使用的移动操作系统之一,它的安全问题一直是研究人员和开发者的关注焦点。0day漏洞指的是那些厂商和公众尚未知悉的安全漏洞,它们通常被恶意攻击者利用来进行攻击,因此及时检测和修补这类...

    android系统入门了解——main.rar

    2. **权限管理**:Android采用基于权限的模型,每个应用都有自己的沙箱,互不干扰。 3. **组件**:Activity(活动)、Service(服务)、BroadcastReceiver(广播接收者)和ContentProvider(内容提供者)是Android...

    Android-安全架构及权限控制机制剖析

    Android系统作为一个开源的操作平台,其安全架构和权限控制机制对于保障用户数据安全和隐私保护至关重要。本文将深入探讨Android的安全模型,重点分析权限控制机制,旨在帮助开发者和安全研究人员理解并提升应用程序...

    Android安全机制 PPT版本

    Android应用程序在安装的过程中,安装服务PackageManagerService会为它们分配一个唯一的UID和GID,以及根据应用程序所申请的权限,赋予其它的GID。有了这些UID和GID之后,应用程序就只能限访问特定的文件,一般就是...

    Android系统概述——底层开发的资料

    7. **安全机制**:Android的安全模型基于权限系统,开发者需理解权限管理、签名策略、沙箱机制等,确保应用和系统的安全。 8. **系统启动流程**:从Bootloader到Zygote,再到System Server,理解Android系统启动的...

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

    这些安全措施包括但不限于基于Linux内核的安全模型、权限管理机制、沙箱环境和数字签名验证等。通过对这些机制的深入研究和应用,不仅可以提高Android平台的整体安全性,还能为开发更加安全的应用程序提供指导和支持...

    Android系统级深入开发——移植与调试

    8. **安全与权限管理**:Android的安全模型包括权限系统、签名机制、沙箱模型等,理解并能够调整这些机制是确保系统安全的重要环节。 9. **JNI与NDK开发**:了解Java Native Interface(JNI),利用Native ...

    Android安全机制

    2. **签名机制**:每个Android应用都需用数字签名,确保代码的完整性和来源。签名可以用来验证应用的开发者身份,同时允许不同应用间的交互,比如AIDL(Android Interface Definition Language)接口调用。 3. **...

    安卓Android源码——实用源码——屏幕锁源码.zip

    本压缩包"安卓Android源码——实用源码——屏幕锁源码.zip"提供了屏幕锁的源代码,这对于开发者来说是一个非常宝贵的资源,特别是对于那些希望自定义设备安全功能或者对安卓安全机制感兴趣的开发者。 屏幕锁是安卓...

    「勒索软件」Android 0day漏洞检测沙箱系统的设计与实现 - 安全架构.zip

    综上所述,构建一个针对Android 0day漏洞检测的沙箱系统是一项复杂的任务,涉及到多方面的技术和策略。通过这样的系统,我们可以更好地保护用户免受勒索软件和其他恶意软件的侵害,维护移动环境的稳定和安全。

    Android支付宝沙箱环境使用教程demo

    通过以上步骤,开发者可以在Android应用中成功地集成和测试支付宝的沙箱环境。"AliPayDemo"示例项目可以作为一个参考,帮助开发者快速理解和实践这个过程。在实际开发中,可以根据自己的需求进行适当的修改和扩展。

    Android操作系统的安全机制研究.doc

    Android采用权限管理系统,将权限分为普通、危险、签名和系统/签名四个级别。开发者在manifest文件中声明所需权限,用户在安装时需给予或拒绝这些权限。此外,per-URI权限允许对特定数据块进行临时访问控制,增强了...

    基于Android平台的访问权限机制优化方案.pdf

    在Android中,每个应用都有自己的安全沙箱,权限是这个沙箱的边界,决定了应用可以访问哪些系统资源和服务。Android将权限分为不同的类别,例如读写文件、访问网络、发送短信等,应用在安装时需要请求相应的权限,...

Global site tag (gtag.js) - Google Analytics