美文网首页
Android安全性

Android安全性

作者: 9283856ddec1 | 来源:发表于2020-02-05 12:38 被阅读0次

    应用程序沙箱

    作为一种传统,在操作系统中,应用程序被视为由用户执行的一些代码。这个行为是从命令行时代继承下来的。在命令行中,如果你输入ls指令,那么它是由你的身份(UID)运行的,拥有和你相同的系统权限。同样,当你用图形用户界面来运行一个想玩的游戏时,这个游戏将会以你的身份运行,可以访问你的文件,包括很多它其实并不需要访问的东西。

    然而这并不是我们现在使用计算机的普遍方式,我们会运行一些从可信度较低的第三方来源得到的应用 程序,很难控制它们的运行环境中进行的诸多种类的大量操作。所有的程序以用户的权限运行,如果它们产生了误操作,则会带来用户很大损失。例如可以泄露用户可获得的一切信息,恶意程序会加密文件进行勒索。

    Android的解决理念:应用程序作为访客运行在用户的设备上,在没有得到用户的确切允许前,应用程序在接触任何敏感信息时是不受信任的。在Android的实现中,通过用户ID的方式体现出来。当安装一个Android应用程序时,为其新创造一个独特的Linux用户ID(也称UID),该应用程序的所有源码是以该新“用户”的名义运行的。这样,Linux用户ID为每个用户程序创造一个沙箱,配备各自的隔离区来存储文件系统,如同为用户在桌面系统中创造沙箱一样。换言之,Android创新的活用了Linux中已有的一个功能,造成了隔离性更好的结果。

    Android为系统底层预先定了一些列标准UID,大多数应用程序是在其第一次运行或安装时,从“应用程序UID”范围中获得动态分配的UID的。如下表所示:

    UID值 用途
    0
    1000 核心系统(system_server进程)
    1001 电话服务
    1013 底层媒体进程
    2000 命令行界面访问
    10000~19999 动态分配应用程序UID
    100000 多用户由此开始

    说明:小于10000的UID是固定分配给系统的,专门用于硬件或系统实现的具体部件。处于10000~19999范围的UID是在应用程序第一次安装时,这表示一个系统上最多可安装10000个应用程序。从100000开始的范围是用来实现Android的传统多用户模型的:如果一个应用程序自身的UID是10002,那么当第二个用户运行该应用程序时,它被标识为110002。

    当一个应用程序首次被分配一个UID时,随之将创造一个新的存储目录,用来存储这个UID拥有的文件。应用程序可以自由访问该目录中它的私有文件,但不能访问其他应用程序的文件。即使拥有UID 1000(system_server进程)也不能访问应用程序拥有的文件。installd进程拥有特殊权限,运行时可以在其他应用程序的目录中访问和创造文件
    。installd进程向封装管理器提供十分有限的应用程序编程接口,以便后者创建和管理应用程序需要的数据目录。

    应用程序权限

    权限是在应用程序安装时,赋予给它的详细定义的权力。应用程序列出它需要的权限清单,在安装之前通知用户,使用户得知应用程序在此基础上可进行哪些操作。例如电子邮件应用程序访问相机应用程序中的图片,当相机应用程序收到电子邮件应用程序的IPC时,通过向包管理器询问该UID是否已拥有相应的权限,便可进行权限检查。下图所示为无权限情况下的操作:


    无权限情况下试图访问数据.png

    1> 浏览器应用程序正试图直接访问用户的图片,但它只拥有一个关于互联网操作的权限。
    2> 相机进程的内容提供者PicturesProvider由包管理器查询浏览器应用的权限;
    3> 检查浏览器应用并未拥有所需的READ_PICTURES权限;
    4> PicturesProvider向浏览器调用者抛出一个安全性异常;

    细粒度URI访问控制

    隐式安全数据访问
    给应用程序赋予程序权限在很多时候不大现实,例如相机期望使用邮件发送图片,音频期望使用邮件发送音频,文本期望使用邮件发送文字,如此邮件需要赋予各种权限,此时会造成如下问题:
    1> 我们不希望邮件应用程序访问它并不实际需要的大量数据;
    2> 期望邮件访问来自任何数据源的数据,包括那些它们没有先验知识的数据;
    为解决这种问题Android支持存在意图和内容提供器之间的隐式安全数据访问,通过操作系统的参与,在两个应用程序沙箱上打开洞口,运行数据的传递。如下图所示:

    用内容提供器来分享图片.png
    1> 相机应用程序创建了一个分享图片content://pics/1的意图;
    2> 启动邮件应用程序的同时,在“已授权URI”列表中添加[To:ComposeActivity URI:content://pics/1]数据,表示新的ComposeActivity现已获得此URI的访问权限。
    3> 电子邮件应用ComposeActivity试图访问并读取它被赋予的此URI时,进行访问权限检查;
    4> 相机应用程序中PicturesProvider向包管理器询问权限;
    5> 包管理器检查已授权URI列表,发现具备访问数据权限,通知PicturesProvider;
    6> PicturesProvider返回图片给邮件用户程序;

    用户选择数据返回
    应用程序可以通过使用android_intent_action.GET_CONTENT来让用户选择数据并返回给它。例如:用户在邮件应用程序中要求添加一个附件,这将在相机应用程序中启动一个活动,让用户选择一副图片。如下图所示:

    用内容提供器来添加一副图片.png
    说明:这种方法允许系统来维护每个应用程序的数据的严格控制,在用户不知情的情况下允许所需数据的精确访问,因而它是十分强力的。

    允许/禁止特定类型访问的用户界面

    告知用户其 可提供一些功能,并通过一个受系统支持的可信任用户界面来让用户控制这些访问权限。这种措施的一个典型例子是Android的输入法架构,输入法是一种由第三方应用程序提供的服务,允许用户对应用程序提供输入,尤其是以屏幕键盘的形式。这是操作系统中一种高度敏感的交互行为,因为很多个人信息都会经过输入法应用程序,包括用户输入的密码。

    Android的系统设定中包括一个选择输入法的用户界面,这个界面显示所有已安装的应用程序中可用的输入法,以及它们是否被启用。如果用户希望使用一种新的输入法,那么在完成安装相应的应用程序后,用户需要进入这个系统设定用户界面来启用它。启用时,系统同时也会通知用户此行为会允许该应用程序执行何种操作。

    即使一个应用程序已经启用为输入法,Android使用细粒度访问控制技术来限制它带来的影响。例如,仅有正在被使用为当前输入法的应用程序可以进行特殊交互行为。如果用户启用了多种输入法,那么只有正处于活动状态的输入法能在其沙箱中拥有这些功能。甚至正在被使用的当前输入法也被附加的条件限制了它可进行的操作,如限制它只能和当前具有输入光标的窗口进行互动。

    相关文章

      网友评论

          本文标题:Android安全性

          本文链接:https://www.haomeiwen.com/subject/pcfgthtx.html