(一)各层安全措施
位置 | 安全措施 | |
1 | 应用程序层 | 权限声明机制 |
2 | 应用程序框架层 | 应用程序签名机制 |
3 | 系统运行库层 | 安全沙箱、网络加密通信SSL |
4 | 内核层 | 内核安全:文件系统安全、地址空间布局随机化、SELinux |
(二)权限声明机制
在操作权限和对象之间设定限制,只有两者绑定才有权操作。
权限声明机制还制定了不同级别不同认证方式的制度。
默认情况下Android应用不会被授予权限,权限分配由APK安装包中的AndroidManifest.xml文件确定。
(1)AndroidManifest.xml
(2)声明权限和对外提供权限
<permission />:用于声明和定义一个权限,表明应用提供给其他应用的访问能力。
开发者可以使用<permission>节点来自定义权限保护应用的组件,确保只有拥有相应权限的应用才能访问这些组件。
<uses-permission:用于申请一个已声明的权限,表明应用需要使用其他应用提供的某些功能。
开发者在<uses-permission>节点中声明所需权限,应用在安装时系统会询问用户是否授权这些权限。
系统:<uses-permission android:name="android.permission.INTERNET" />
第三方应用<uses-permission android:name="com.demo.service" />
(3)权限等级
android:protectionLevel=[“normal” | “dangerous” | “signature” | “signatureOrSystem”]
应用层权限 | 说明 | |
1 | normal权限 | 不会带来实质性伤害,只要申请就能使用。 在AndroidManifest.xml 中添加uses-permission |
2 | dangerous权限 | 可能带来潜在威胁(安装时提醒用户),如读取位置、电话簿等 |
3 | signature权限 | 具有同一签名的应用才能访问 |
4 | signatureOrSystem权限 | 主要由设备商使用。签名相同,或者申请权限的应用为系统应用(在system image中) |
(三)应用程序签名机制
APK文件数字签名,标识开发者和程序之间存在信任关系。
所有安装到Android系统中的程序都必须拥有一个数字证书。
目前有三种签名方案:
(1)v1 方案:基于 JAR 签名。
(2)v2 方案:APK 签名方案 v2,在 Android 7.0 引入。
(3)v3 方案:APK 签名方案 v3,在 Android 9.0 引入。
在引入 v3 方案后,Android 9.0 及更高版本中,可以根据 APK 签名方案,v3 -> v2 -> v1 依次尝试验证 APK。而较旧的平台会忽略 v3 签名并尝试 v2 签名,最后才去验证 v1 签名。
(四)沙箱机制
沙箱隔离机制:使应用程序和其相应运行的Dalvik虚拟机都运行在独立Linux进程空间,不与其他应用程序交叉,实现完全隔离。
应用程序默认没有访问系统资源或其他应用资源的权限。
每个App和系统进程都被分配唯一且固定的User ID(与内核层进程的UID对应)。
Android使用Dalvik虚拟机和Linux文件访问控制来实现沙箱机制,要访问系统资源或其他APP资源,必须在自身Manifest文件中声明权限或者共享UID。
(五)网络通信加密
使用SSL/TSL协议加密传输网络数据,防止敏感数据泄露。
(六)内核安全机制
内核安全 | 说明 | |
1 | Linux ACL权限控制机制 | 每个文件访问控制权限都由其拥有者、所属组、读写执行共同控制。 文件创建时被赋予不同程序ID,只有拥有相同程序ID或被设置为全局可读写才能被其他程序所访问。 每个应用均具有自身用户ID和私有文件目录。 |
2 | 分区 | 最外层安全保护由Linux提供 ①system.img分区:只读,不允许用户写入 ②data.img分区:可读写,用于存放用户数据 |
安全措施(Linux自身安全措施之外)
- 不允许在堆栈中执行代码
- 地址空间布局随机化
- 支持SELinux