浅析Android怎样从不同的层次保证安全性问题
Android上的安全机制可以基本都是从两个方面来进行:1.应用沙盒2.权限约束
先了解一下基本知识:
Android是一个分层操作系统,由个4层组成,分别是:Linux Kernel、Native Userspace、Android Framework、Application
Android的核心安全原则是,应用程序不应该损害操作系统资源、用户和其他应用程序。
1.Linux Kernel层
Linux内核负责配置配置应用沙盒以及规范一些权限。
为每个应用配置应用沙箱,每个应用运行在自己的沙盒中,在安装过程中,每个包都会被分配一个唯一的UID(用户标识符)和GID(组标识符),并且在设备的应用生命周期内部会更改。因此每一个应用都有一个对应的Linux用户。用户名遵循格式app_x,并且该用户的UID等于Process.FIRST_APPLICATION_UID+x。因为每个应用都有自己的UID和GID,Linux内核强制应用在自己的隔离地址空间内执行,并且应用唯一的UID和GID由Linux内核使用,以实现不同应用直接的资源的公平分离,并且每个应用都基于Linux可选访问控制模型(DAC)的验证。除此之外,使用相同证书签名的应用能够在彼此之间共享数据,可以拥有相同的UID或甚至可以在相同的进程中运行。我们可以使用adb命令 adb shell ps 来查看手机中所有进程的一些信息。
通过将Linux用户和组所有者分配给实现该功能的组件,限制应用对某些系统功能的访问。使用文件系统权限访问文件和设备驱动程序,限制进程对设备某些功能的访问。/dev/cam设备驱动程序属于root所有者和摄像机所有者组,这就表示只有以root身份运行或包含在摄像机组中的进程才能使用这个驱动,也就是我们说的拍照功能。如果你同意安装的应用程序使用相机功能,那么就会为这个应用程序分配一个相机的Linux组GID,标识该应用程序可以从/dev/cam设备驱动程序读取信息,这些权限标签和相应组之间的映射在文件框架/base/data/etc/platform.xml中定义。
2. Native Userspace层
构建文件系统结构以及文件权限
Android设备的引导顺序大概可以分以下几步,Boot Rom - Boot Loader - Linux Kernel - Init
当用户打开手机时,设备的CPU尚未初始化,这种情况下,处理器从硬连线地址开始执行命令,该地址指向Boot ROM所在的CPU的写保护存储器中的一段代码,这些代码主要目的是坚持Boot Loader(引导加载程序)所在的介质。检测完成后,Boot ROM将引导加载程序加载到内存中,并且开始执行Boot Loader的加载代码,Boot Loader负责建立外部RAM,文件系统和网络的支持。之后,Linux开始加载,内核初始化环境来运行C代码,开始做加载驱动和挂载文件系统以及运行用户空间进程等操作。在Android中,第一个用户进程是init,它以root权限启动(UID=0),它是所有进程的祖先。init有一个配置文件init.rc,它之中预定义了一些事件,init运行的时候会按照它预定义的事件执行,主要是负责基本文件结构的创建,设置内核参数以及启动ueventd守护进程,ServiceManager的启动、Zygote进程的启动等。第一个守护进程是ueventd守护进程,主要设置不同设备的所有者和权限,ServiceManager在Android中充当所有服务的索引。Zygote是所有进程的祖先,我们所有的应用都是由Zygote fork出来的。
/system,/data,/cache是Android的文件系统核心目录,都是由init程序安装到预定义的点。/system分区包含了除了Linux内核的整个Android系统,此文件夹包含子目录/system/bin和system/lib,它们相应包含核心本地可执行文件和共享库以及由系统映像预先构建的所有系统应用,并且映像以只读模式安装,所以此分区的内容不能在运行时更改。由于/system被挂载为只读,所以它不能用于存储数据,所以另一个单独的分区/data负责存储随时间改变的用户数据或信息。/cache分区负责存储经常访问的数据和应用程序组件。这些文件夹的默认权限必须在编译时定义。
3. Android Framework层
应用程序框架级别上的安全性由IPC引用监视器实现
由于应用程序都是在相互隔离的沙箱中通过带有不同的Linux身份的不同进程中运行着,因此需要进程间通信(IPC)框架来管理不同进程之间的数据和信号交换。在Android中,进程间的通信主要由Binder来实现,Binder是一个特殊的框架,它在Android中重新开发用来支持进程间通信,它提供了管理Android操作系统中的进程之间的所有类型的通信所需的功能。
在Android中,服务的每个关键功能(服务的方法)被称为权限的特殊标签保护。也就是说,在执行这样的功能之前,会检查刁红进程是否被分配了权限。如果有权限,则允许其调用,否则就会抛出安全检查异常。我们必须把相应的权限写到AndroidManifest.xml中,并且在6.0以后被列为dangerous的权限还需在代码中动态申请。Android中有4个权限级别,分别是normal,dangerous,signature和signatureOrSystem。默认情况下,第三方应用程序开发人员无法访问受signture和signatureOrSystem级别的系统权限保护的功能。因此,需要使用这些级别的权限保护的功能的应用程序必须使用相同的平台证书进行签名。然而,仅有操作系统的构建者才可以访问该证书的私匙。这我们就明白了为什么华为手机的华为应用市场可以静默安装应用,而应用宝只能跳转到应用安装页面了。同时,Android Framework中提供了一个类PackageManagerService负责Android中的应用程序管理,此服务的一个重要作用是权限管理,并且负责应用程序安装和升级中执行检查是否符合权限模型。
4.Application层
四大组件和应用权限在AndroidManifest中声明。
Android应用以Android软件包(.apk)文件的形式分发。一个包由一个Dalvik/ART可执行文件,资源文件,清单文件和本地库组成,并由应用的开发人员使用自签名证书签名。每个应用又四个组件类型的几个组件组成:Activity,Service,Boardcast Reciver,Content Provider,每个组件(除了BoardcastReciver)都需要在AndroidManifest.xml中声明,BoardcastReciver也可以在代码中动态声明,组件间通过Intent通信,Intent是基于Binder框架的特殊通信手段。
应用还可以使用自定义权限来保护对此应用的组件的访问,类似于系统权限之一。也就是说,如果应用1希望保护自己其中的访问A1,需要声明一个权限标签P1,此时如果应用2想要访问C1,就必须在AndroidManfest.xml中声明P1权限。
上一篇: 去中心化存储或重构边缘存储技术