Android 不断改进其安全能力和产品。请参阅左侧导航栏中按版本列出的增强功能列表。
Android 14
每个 Android 版本都包含数十项安全增强功能,以保护用户。以下是 Android 14 中提供的一些主要安全增强功能
- 硬件辅助 AddressSanitizer (HWASan) 在 Android 10 中引入,是一种类似于 AddressSanitizer 的内存错误检测工具。Android 14 对 HWASan 进行了重大改进。了解它如何帮助防止错误进入 Android 版本,HWAddressSanitizer
- 在 Android 14 中,从与第三方共享位置数据的应用开始,系统运行时权限对话框现在包含一个可点击的部分,突出显示应用的数据共享做法,包括应用可能决定与第三方共享数据的原因等信息。
- Android 12 引入了一个在调制解调器级别禁用 2G 支持的选项,这可以保护用户免受 2G 过时安全模型带来的固有安全风险。考虑到禁用 2G 对于企业客户的重要性,Android 14 在 Android 企业版中启用了此安全功能,引入了对 IT 管理员限制托管设备降级到 2G 连接的能力的支持。
- 增加了对拒绝空密码蜂窝连接的支持,确保电路交换语音和短信流量始终加密,并受到被动空中拦截的保护。详细了解 Android 强化蜂窝网络连接的计划。
- 增加了对多个 IMEI 的支持
- 自 Android 14 起,AES-HCTR2 是具有加速加密指令的设备的文件名加密首选模式。
- 蜂窝网络连接
- 为 Android 安全中心 添加了文档
- 如果您的应用以 Android 14 为目标平台并使用动态代码加载 (DCL),则所有动态加载的文件都必须标记为只读。否则,系统会抛出异常。我们建议应用尽可能避免动态加载代码,因为这样做会大大增加应用可能因代码注入或代码篡改而受到破坏的风险。
Android 13
每个 Android 版本都包含数十项安全增强功能,以保护用户。以下是 Android 13 中提供的一些主要安全增强功能
- Android 13 添加了多文档演示支持。这个新的 Presentation Session 接口使应用能够进行多文档演示,这在使用现有 API 时是不可能的。如需了解更多信息,请参阅 身份凭据
- 在 Android 13 中,来自外部应用的 Intent 仅当 Intent 与其声明的 intent-filter 元素匹配时,才会被传递到导出的组件。
- 开放移动 API (OMAPI) 是一种用于与设备的安全元件通信的标准 API。在 Android 13 之前,只有应用和框架模块才能访问此接口。通过将其转换为供应商稳定接口,HAL 模块也能够通过 OMAPI 服务与安全元件通信。如需了解更多信息,请参阅 OMAPI 供应商稳定接口。
- 从 Android 13-QPR 开始,共享 UID 已被弃用。Android 13 或更高版本的用户应在其清单中添加行 `android:sharedUserMaxSdkVersion="32"`。此条目可防止新用户获得共享 UID。如需了解有关 UID 的更多信息,请参阅 应用签名。
- Android 13 增加了对密钥库对称加密原语(如 AES(高级加密标准)、HMAC(密钥哈希消息身份验证码))和非对称加密算法(包括椭圆曲线、RSA2048、RSA4096 和 Curve 25519)的支持
- Android 13(API 级别 33)及更高版本支持用于从应用发送非豁免通知的运行时权限。这让用户可以控制他们看到的权限通知。
- 为请求访问所有设备日志的应用添加了每次使用提示,让用户能够允许或拒绝访问。
- 引入了 Android 虚拟化框架 (AVF),它将不同的虚拟机监控程序整合到一个框架下,并使用标准化的 API。它为执行虚拟机监控程序隔离的工作负载提供了安全且私密的执行环境。
- 引入了 APK 签名方案 v3.1。默认情况下,所有使用 apksigner 的新密钥轮替都使用 v3.1 签名方案,以针对 Android 13 及更高版本进行轮替。
Android 12
每个 Android 版本都包含数十项安全增强功能,以保护用户。以下是 Android 12 中提供的一些主要安全增强功能
- Android 12 引入了 BiometricManager.Strings API,它为使用 BiometricPrompt 进行身份验证的应用提供本地化字符串。这些字符串旨在感知设备,并提供有关可能使用的身份验证类型的更多详细信息。Android 12 还包括对屏下指纹传感器的支持
- 增加了对屏下指纹传感器的支持
- 引入了 指纹 Android 接口定义语言 (AIDL)
- 支持新的 面容 AIDL
- 引入 Rust 作为平台开发语言
- 为用户添加了仅授予对其大致位置的访问权限的选项
- 当应用正在使用摄像头或麦克风时,在状态栏上添加了隐私指示器
- Android 的 Private Compute Core (PCC)
- 添加了禁用 2G 支持的选项
Android 11
每个 Android 版本都包含数十项安全增强功能,以保护用户。如需查看 Android 11 中提供的一些主要安全增强功能列表,请参阅 Android 版本说明。
Android 10
每个 Android 版本都包含数十项安全增强功能,以保护用户。Android 10 包含多项安全和隐私增强功能。请参阅 Android 10 版本说明,了解 Android 10 中的完整变更列表。
安全
BoundsSanitizer
Android 10 在蓝牙和编解码器中部署了 BoundsSanitizer (BoundSan)。BoundSan 使用 UBSan 的边界清理器。此缓解措施在每个模块级别启用。它有助于保持 Android 关键组件的安全,不应禁用。BoundSan 在以下编解码器中启用
libFLAC
libavcdec
libavcenc
libhevcdec
libmpeg2
libopus
libvpx
libspeexresampler
libvorbisidec
libaac
libxaac
仅执行内存
默认情况下,AArch64 系统二进制文件的可执行代码段标记为仅执行(不可读),作为针对即时代码重用攻击的强化缓解措施。混合数据和代码的代码以及有意检查这些段(在未首先将内存段重新映射为可读的情况下)的代码将不再起作用。如果目标 SDK 为 Android 10(API 级别 29 或更高版本)的应用尝试读取内存中启用了 仅执行内存 (XOM) 的系统库的代码段,而未先将该段标记为可读,则会受到影响。
扩展访问权限
信任代理(三级身份验证机制(如智能锁)使用的底层机制)只能在 Android 10 中延长解锁时间。信任代理不再能够解锁锁定的设备,并且只能将设备保持解锁状态最多四个小时。
面容身份验证
面容身份验证允许用户只需查看设备正面即可解锁设备。Android 10 增加了对面容身份验证堆栈的支持,该堆栈可以安全地处理摄像头帧,在受支持的硬件上面容身份验证期间保持安全性和隐私性。Android 10 还为符合安全要求的实现提供了一种简单的方式,以启用应用集成以进行在线银行或其他服务等交易。
整数溢出清理
Android 10 在软件编解码器中启用了 整数溢出清理 (IntSan)。确保对于设备硬件中不支持的任何编解码器,播放性能都可以接受。IntSan 在以下编解码器中启用
libFLAC
libavcdec
libavcenc
libhevcdec
libmpeg2
libopus
libvpx
libspeexresampler
libvorbisidec
模块化系统组件
Android 10 模块化了一些 Android 系统组件,并使它们能够在正常的 Android 版本发布周期之外进行更新。一些模块包括
- Android 运行时
- Conscrypt
- DNS 解析器
- DocumentsUI
- ExtServices
- 媒体
- ModuleMetadata
- 网络
- PermissionController
- 时区数据
OEMCrypto
Android 10 使用 OEMCrypto API 版本 15。
Scudo
Scudo 是一种动态用户模式内存分配器,旨在更有效地抵御与堆相关的漏洞。它提供了标准的 C 分配和释放原语,以及 C++ 原语。
ShadowCallStack
ShadowCallStack (SCS)
是一种 LLVM instrumentation 模式,通过将函数的返回地址保存到单独分配的 ShadowCallStack
实例(在非叶函数的函数序言中)并在函数后记中从 ShadowCallStack
实例加载返回地址,来防止返回地址覆盖(如堆栈缓冲区溢出)。
WPA3 和 Wi-Fi Enhanced Open
Android 10 增加了对 Wi-Fi Protected Access 3 (WPA3) 和 Wi-Fi Enhanced Open 安全标准的支持,以针对已知攻击提供更好的隐私性和稳健性。
隐私
以 Android 9 或更低版本为目标平台的应用访问权限
如果您的应用在 Android 10 或更高版本上运行,但以 Android 9(API 级别 28)或更低版本为目标平台,则平台会应用以下行为
- 如果您的应用为
ACCESS_FINE_LOCATION
或ACCESS_COARSE_LOCATION
声明了<uses-permission>
元素,则系统会在安装期间自动为ACCESS_BACKGROUND_LOCATION
添加<uses-permission>
元素。 - 如果您的应用请求
ACCESS_FINE_LOCATION
或ACCESS_COARSE_LOCATION
,则系统会自动将ACCESS_BACKGROUND_LOCATION
添加到请求中。
后台 activity 限制
从 Android 10 开始,系统对从后台启动 activity 施加了限制。此行为变更有助于最大限度地减少对用户的中断,并使用户可以更好地控制屏幕上显示的内容。只要您的应用启动 activity 是用户直接交互的结果,您的应用很可能不会受到这些限制的影响。
要详细了解从后台启动 activity 的推荐替代方案,请参阅有关如何在应用中提醒用户注意时间敏感事件的指南。
相机元数据
Android 10 更改了 getCameraCharacteristics()
方法默认返回的信息广度。特别是,您的应用必须具有 CAMERA
权限,才能访问此方法返回值中包含的可能特定于设备的元数据。
要详细了解这些变更,请参阅有关需要权限的相机字段的部分。
剪贴板数据
除非您的应用是默认输入法编辑器 (IME),或者应用当前具有焦点,否则您的应用无法访问 Android 10 或更高版本上的剪贴板数据。
设备位置
为了支持用户对应用访问位置信息的额外控制,Android 10 引入了 ACCESS_BACKGROUND_LOCATION
权限。
与 ACCESS_FINE_LOCATION
和 ACCESS_COARSE_LOCATION
权限不同,ACCESS_BACKGROUND_LOCATION
权限仅影响应用在后台运行时对位置信息的访问权限。除非满足以下条件之一,否则应用被视为在后台访问位置信息
- 属于应用的 activity 可见。
- 应用正在运行声明了 前台服务类型 为
location
的前台服务。
要为应用中的服务声明前台服务类型,请将应用的目标 SDK 版本 (targetSdkVersion
) 或编译 SDK 版本 (compileSdkVersion
) 设置为29
或更高版本。详细了解前台服务如何继续需要访问位置信息的用户发起的操作。
外部存储
默认情况下,以 Android 10 及更高版本为目标平台的应用被赋予外部存储的范围访问权限,或称为作用域存储空间。此类应用无需请求任何与存储相关的用户权限即可查看外部存储设备中的以下类型的文件
- 应用专用目录中的文件,使用
getExternalFilesDir()
访问。 - 应用从 媒体存储 创建的照片、视频和音频片段。
要详细了解作用域存储空间,以及如何共享、访问和修改保存在外部存储设备上的文件,请参阅有关如何管理外部存储中的文件以及访问和修改媒体文件的指南。
MAC 地址随机化
在运行 Android 10 或更高版本的设备上,系统默认传输随机 MAC 地址。
如果您的应用处理企业用例,则平台为与 MAC 地址相关的多项操作提供 API
- 获取随机 MAC 地址:设备所有者应用和个人资料所有者应用可以通过调用
getRandomizedMacAddress()
来检索分配给特定网络的随机 MAC 地址。 - 获取实际出厂 MAC 地址:设备所有者应用可以通过调用
getWifiMacAddress()
来检索设备的实际硬件 MAC 地址。此方法对于跟踪设备群非常有用。
不可重置的设备标识符
从 Android 10 开始,应用必须具有 READ_PRIVILEGED_PHONE_STATE
特权权限才能访问设备的不可重置标识符,其中包括 IMEI 和序列号。
构建
TelephonyManager
如果您的应用没有权限,并且您尝试请求有关不可重置标识符的信息,则平台的响应会因目标 SDK 版本而异
- 如果您的应用以 Android 10 或更高版本为目标平台,则会发生
SecurityException
。 - 如果您的应用以 Android 9(API 级别 28)或更低版本为目标平台,则如果应用具有
READ_PHONE_STATE
权限,则该方法会返回null
或占位符数据。否则,会发生SecurityException
。
身体活动识别
Android 10 引入了 android.permission.ACTIVITY_RECOGNITION
运行时权限,适用于需要检测用户的步数或对用户的身体活动(例如步行、骑自行车或在车辆中移动)进行分类的应用。这旨在让用户了解设备传感器数据如何在“设置”中使用。
Google Play 服务中的某些库(例如 Activity Recognition API 和 Google Fit API)除非用户已授予您的应用此权限,否则不会提供结果。
设备上唯一内置传感器需要您声明此权限的是步数计数器和步数检测器传感器。
如果您的应用以 Android 9(API 级别 28)或更低版本为目标平台,则如果您的应用满足以下每个条件,系统会自动授予您的应用 android.permission.ACTIVITY_RECOGNITION
权限(如果需要)
- 清单文件包含
com.google.android.gms.permission.ACTIVITY_RECOGNITION
权限。 - 清单文件不包含
android.permission.ACTIVITY_RECOGNITION
权限。
如果系统自动授予 android.permission.ACTIVITY_RECOGNITION
权限,则在您将应用更新为以 Android 10 为目标平台后,您的应用仍会保留该权限。但是,用户可以随时在系统设置中撤消此权限。
/proc/net 文件系统限制
在运行 Android 10 或更高版本的设备上,应用无法访问 /proc/net
,其中包含有关设备网络状态的信息。需要访问此信息的应用(例如 VPN)应使用 NetworkStatsManager
或 ConnectivityManager
类。
从界面中移除权限组
从 Android 10 开始,应用无法查找 权限在界面中的分组方式。
移除联系人亲密度
从 Android 10 开始,平台不再跟踪联系人亲密度信息。因此,如果您的应用对用户的联系人进行搜索,则结果不会按互动频率排序。
关于 ContactsProvider
的指南包含一个通知,其中描述了从 Android 10 开始在所有设备上已过时的特定字段和方法。
限制对屏幕内容的访问
为了保护用户的屏幕内容,Android 10 通过更改 READ_FRAME_BUFFER
、CAPTURE_VIDEO_OUTPUT
和 CAPTURE_SECURE_VIDEO_OUTPUT
权限的范围,来阻止对设备屏幕内容的静默访问。从 Android 10 开始,这些权限仅为签名访问权限。
需要访问设备屏幕内容的应用应使用 MediaProjection
API,该 API 会显示一个提示,要求用户提供同意。
USB 设备序列号
如果您的应用以 Android 10 或更高版本为目标平台,则在用户授予您的应用访问 USB 设备或配件的权限之前,您的应用无法读取序列号。
要详细了解如何使用 USB 设备,请参阅有关如何配置 USB 主机的指南。
Wi-Fi
以 Android 10 或更高版本为目标平台的应用无法启用或停用 Wi-Fi。WifiManager.setWifiEnabled()
方法始终返回 false
。
如果您需要提示用户启用和停用 Wi-Fi,请使用设置面板。
限制直接访问配置的 Wi-Fi 网络
为了保护用户隐私,手动配置 Wi-Fi 网络列表仅限于系统应用和设备策略控制器 (DPC)。给定的 DPC 可以是设备所有者或个人资料所有者。
如果您的应用以 Android 10 或更高版本为目标平台,并且它不是系统应用或 DPC,则以下方法不会返回有用的数据
getConfiguredNetworks()
方法始终返回一个空列表。- 每个返回整数值的网络操作方法(
addNetwork()
和updateNetwork()
)始终返回 -1。 - 每个返回布尔值的网络操作(
removeNetwork()
、reassociate()
、enableNetwork()
、disableNetwork()
、reconnect()
和disconnect()
)始终返回false
。
Android 9
每个 Android 版本都包含数十项安全增强功能,以保护用户。有关 Android 9 中提供的一些主要安全增强功能的列表,请参阅Android 版本说明。
Android 8
每个 Android 版本都包含数十项安全增强功能,以保护用户。以下是 Android 8.0 中提供的一些主要安全增强功能
- 加密。增加了在工作资料中驱逐密钥的支持。
- Verified Boot。添加了 Android Verified Boot (AVB)。将支持回滚保护的 Verified Boot 代码库添加到 AOSP,以用于引导加载程序。建议引导加载程序支持 HLOS 的回滚保护。建议引导加载程序只能由用户通过物理方式与设备交互来解锁。
- 锁屏。增加了使用防篡改硬件来验证锁屏凭据的支持。
- KeyStore。要求所有搭载 Android 8.0+ 的设备都进行密钥认证。添加了ID 认证支持,以改进零接触注册。
- 沙盒。使用 Project Treble 的框架和设备特定组件之间的标准接口,更严格地沙盒化了许多组件。对所有不受信任的应用应用了 seccomp 过滤,以减少内核的攻击面。WebView 现在在隔离的进程中运行,对系统其余部分的访问权限非常有限。
- 内核加固。实现了加固的用户空间复制、PAN 模拟、init 后只读和 KASLR。
- 用户空间加固。为媒体堆栈实现了 CFI。应用叠加层不再能覆盖系统关键窗口,并且用户有办法关闭它们。
- 流式操作系统更新。在磁盘空间不足的设备上启用了更新。
- 安装未知应用。用户必须授予权限才能安装来自非第一方应用商店来源的应用。
- 隐私。Android ID (SSAID) 对于设备上的每个应用和每个用户都有不同的值。对于网络浏览器应用,Widevine Client ID 对于每个应用软件包名称和网络来源返回不同的值。
net.hostname
现在为空,并且 dhcp 客户端不再发送主机名。android.os.Build.SERIAL
已被Build.SERIAL
API 取代,后者受到用户控制的权限保护。改进了某些芯片组中的 MAC 地址随机化。
Android 7
每个 Android 版本都包含数十项安全增强功能,以保护用户。以下是 Android 7.0 中提供的一些主要安全增强功能
- 基于文件的加密。基于文件级别进行加密,而不是将整个存储区域作为一个单元进行加密,可以更好地隔离和保护设备上各个用户和配置文件(例如个人和工作)。
- Direct Boot。Direct Boot 由基于文件的加密启用,允许某些应用(如闹钟和辅助功能)在设备开机但未解锁时运行。
- Verified Boot。现在严格强制执行 Verified Boot,以防止受损设备启动;它支持纠错,以提高针对非恶意数据损坏的可靠性。
- SELinux。更新了 SELinux 配置并增加了 seccomp 覆盖范围,进一步锁定了应用沙盒并减少了攻击面。
- 库加载顺序随机化和改进的 ASLR。增加随机性使得一些代码重用攻击的可靠性降低。
- 内核加固。通过将内核内存的某些部分标记为只读、限制内核对用户空间地址的访问以及进一步减少现有攻击面,为较新的内核添加了额外的内存保护。
- APK 签名方案 v2。引入了全文件签名方案,提高了验证速度并加强了完整性保证。
- 受信任的 CA 存储。为了使应用更容易控制对其安全网络流量的访问,用户安装的证书颁发机构和通过设备管理 API 安装的证书颁发机构默认不再受以 API Level 24+ 为目标的应用信任。此外,所有新的 Android 设备都必须附带相同的受信任 CA 存储。
- 网络安全配置。通过声明性配置文件配置网络安全和 TLS。
Android 6
每个 Android 版本都包含数十项安全增强功能,以保护用户。以下是 Android 6.0 中提供的一些主要安全增强功能
- 运行时权限。应用在运行时请求权限,而不是在应用安装时授予权限。用户可以为 M 和 pre-M 应用切换权限的开和关。
- Verified Boot。在执行系统软件之前进行一组加密检查,以确保手机从引导加载程序一直到操作系统都是健康的。
- 硬件隔离的安全。指纹 API、锁屏、设备加密和客户端证书使用新的硬件抽象层 (HAL),以保护密钥免受内核泄露和/或本地物理攻击
- 指纹。现在只需触摸即可解锁设备。开发者还可以利用新的 API 使用指纹来锁定和解锁加密密钥。
- SD 卡扩展。可移动介质可以扩展到设备,并扩展应用本地数据、照片、视频等的可用存储空间,但仍然受到块级加密的保护。
- 明文流量。开发者可以使用新的 StrictMode 来确保他们的应用不使用明文。
- 系统加固。通过 SELinux 强制执行的策略来加固系统。这在用户之间提供更好的隔离、IOCTL 过滤、减少暴露服务的威胁、进一步收紧 SELinux 域以及极其有限的 /proc 访问。
- USB 访问控制: 用户必须确认允许 USB 访问手机上的文件、存储或其他功能。默认现在是仅充电,访问存储需要用户的明确批准。
Android 5
5.0
每个 Android 版本都包含数十项安全增强功能,以保护用户。以下是 Android 5.0 中提供的一些主要安全增强功能
- 默认加密。 在出厂时搭载 L 版本的设备上,默认启用全盘加密,以提高对丢失或被盗设备上数据的保护。更新到 L 版本的设备可以在设置 > 安全 中加密。
- 改进的全盘加密。 使用
scrypt
保护用户密码免受暴力破解攻击,并且在可用的情况下,密钥绑定到硬件密钥库以防止设备外攻击。与往常一样,Android 屏幕锁密码和设备加密密钥不会发送到设备外或暴露给任何应用。 - 使用 SELinux 增强的 Android 沙盒 。Android 现在要求所有域都以强制模式运行 SELinux。SELinux 是 Linux 内核中的强制访问控制 (MAC) 系统,用于增强现有的自主访问控制 (DAC) 安全模型。这个新层为潜在的安全漏洞提供了额外的保护。
- 智能锁。 Android 现在包含 trustlet,为解锁设备提供了更大的灵活性。例如,trustlet 可以允许设备在靠近另一个受信任设备(通过 NFC、蓝牙)或被具有受信任面孔的人使用时自动解锁。
- 手机和平板电脑的多用户、受限配置文件和访客模式。 Android 现在为手机提供多用户支持,并包括访客模式,该模式可用于提供对设备的简易临时访问,而无需授予对您的数据和应用的访问权限。
- 无需 OTA 即可更新 WebView。 现在可以独立于框架且无需系统 OTA 更新 WebView。这允许更快地响应 WebView 中潜在的安全问题。
- 更新了 HTTPS 和 TLS/SSL 的密码学。 现在启用 TLSv1.2 和 TLSv1.1,现在首选前向保密,现在启用 AES-GCM,并且现在禁用弱密码套件(MD5、3DES 和导出密码套件)。有关更多详细信息,请参阅 https://developer.android.com.cn/reference/javax/net/ssl/SSLSocket.html。
- 非 PIE 链接器支持已移除。 Android 现在要求所有动态链接的可执行文件都支持 PIE(位置无关可执行文件)。这增强了 Android 的地址空间布局随机化 (ASLR) 实现。
- FORTIFY_SOURCE 改进。 以下 libc 函数现在实现了 FORTIFY_SOURCE 保护:
stpcpy()
、stpncpy()
、read()
、recvfrom()
、FD_CLR()
、FD_SET()
和FD_ISSET()
。这提供了针对涉及这些函数的内存损坏漏洞的保护。 - 安全修复。 Android 5.0 还包括针对 Android 特定漏洞的修复。有关这些漏洞的信息已提供给开放手机联盟成员,并且修复程序已在 Android 开源项目中提供。为了提高安全性,一些运行早期版本 Android 的设备也可能包含这些修复程序。
Android 4 及更低版本
每个 Android 版本都包含数十项安全增强功能,以保护用户。以下是 Android 4.4 中提供的一些安全增强功能
- 使用 SELinux 增强的 Android 沙盒。 Android 现在以强制模式使用 SELinux。SELinux 是 Linux 内核中的强制访问控制 (MAC) 系统,用于增强现有的基于自主访问控制 (DAC) 的安全模型。这为潜在的安全漏洞提供了额外的保护。
- 每个用户的 VPN。 在多用户设备上,VPN 现在按用户应用。这可以允许用户通过 VPN 路由所有网络流量,而不会影响设备上的其他用户。
- AndroidKeyStore 中的 ECDSA 提供程序支持。 Android 现在有一个密钥库提供程序,允许使用 ECDSA 和 DSA 算法。
- 设备监控警告。 如果任何证书已添加到设备证书存储中,可能允许监控加密的网络流量,Android 会向用户发出警告。
- FORTIFY_SOURCE。 Android 现在支持 FORTIFY_SOURCE level 2,并且所有代码都使用这些保护进行编译。FORTIFY_SOURCE 已经过增强,可以与 clang 一起使用。
- 证书固定。 Android 4.4 检测并防止在安全 SSL/TLS 通信中使用欺诈性 Google 证书。
- 安全修复。 Android 4.4 还包括针对 Android 特定漏洞的修复。有关这些漏洞的信息已提供给开放手机联盟成员,并且修复程序已在 Android 开源项目中提供。为了提高安全性,一些运行早期版本 Android 的设备也可能包含这些修复程序。
每个 Android 版本都包含数十项安全增强功能,以保护用户。以下是 Android 4.3 中提供的一些安全增强功能
- 使用 SELinux 增强的 Android 沙盒。 此版本使用 Linux 内核中的 SELinux 强制访问控制系统 (MAC) 加强了 Android 沙盒。SELinux 增强对用户和开发者是不可见的,并在保持与现有应用兼容性的同时,为现有的 Android 安全模型增加了稳健性。为了确保持续的兼容性,此版本允许在 permissive 模式下使用 SELinux。此模式记录任何策略违规,但不会破坏应用或影响系统行为。
- 没有
setuid
或setgid
程序。 为 Android 系统文件添加了文件系统功能支持,并移除了所有setuid
或setgid
程序。这减少了 root 攻击面以及潜在安全漏洞的可能性。 - ADB 身份验证。 从 Android 4.2.2 开始,与 ADB 的连接使用 RSA 密钥对进行身份验证。这可以防止在攻击者可以物理访问设备的情况下未经授权使用 ADB。
- 限制 Android 应用的 Setuid。
/system
分区现在为 zygote 派生的进程挂载 nosuid,从而阻止 Android 应用执行setuid
程序。这减少了 root 攻击面以及潜在安全漏洞的可能性。 - 功能边界。 Android zygote 和 ADB 现在使用
prctl(PR_CAPBSET_DROP)
在执行应用之前删除不必要的功能。这可以防止 Android 应用和从 shell 启动的应用获得特权功能。 - AndroidKeyStore 提供程序。 Android 现在有一个密钥库提供程序,允许应用创建独占使用密钥。这为应用提供了一个 API 来创建或存储其他应用无法使用的私钥。
- KeyChain
isBoundKeyAlgorithm
。 Keychain API 现在提供了一种方法 (isBoundKeyType
),允许应用确认系统范围的密钥是否绑定到设备的硬件信任根。这提供了一个创建或存储无法从设备导出的私钥的位置,即使在 root 泄露事件中也是如此。 NO_NEW_PRIVS
。 Android zygote 现在使用prctl(PR_SET_NO_NEW_PRIVS)
在执行应用代码之前阻止添加新特权。这可以防止 Android 应用执行可以通过 execve 提升特权的操作。(这需要 Linux 内核版本 3.5 或更高版本)。FORTIFY_SOURCE
增强功能。 在 Android x86 和 MIPS 上启用了FORTIFY_SOURCE
,并强化了strchr()
、strrchr()
、strlen()
和umask()
调用。这可以检测潜在的内存损坏漏洞或未终止的字符串常量。- 重定位保护。 为静态链接的可执行文件启用了只读重定位 (relro),并移除了 Android 代码中的所有文本重定位。这为防御潜在的内存损坏漏洞提供了纵深防御。
- 改进的 EntropyMixer。 EntropyMixer 现在在关机或重启时写入熵,以及定期混合。这允许保留设备开机时生成的所有熵,对于在配置后立即重启的设备尤其有用。
- 安全修复。 Android 4.3 还包括针对 Android 特定漏洞的修复。有关这些漏洞的信息已提供给开放手机联盟成员,并且修复程序已在 Android 开源项目中提供。为了提高安全性,一些运行早期版本 Android 的设备也可能包含这些修复程序。
Android 提供了一个多层安全模型,在Android 安全概览中进行了描述。每个 Android 更新都包含数十项安全增强功能,以保护用户。以下是 Android 4.2 中引入的一些安全增强功能
- 应用验证: 用户可以选择启用“验证应用”,并在安装前让应用验证程序筛选应用。应用验证可以在用户尝试安装可能有害的应用时发出警报;如果应用特别糟糕,它可以阻止安装。
- 对高级短信的更多控制: 如果应用尝试向使用高级服务的短代码发送 SMS,可能会导致额外费用,Android 会提供通知。用户可以选择是否允许应用发送消息或阻止它。
- 始终开启的 VPN: VPN 可以配置为在 VPN 连接建立之前,应用无法访问网络。这可以防止应用通过其他网络发送数据。
- 证书固定: Android 核心库现在支持 证书固定。如果证书未链接到一组预期的证书,则固定域会收到证书验证失败。这可以防止证书颁发机构可能被泄露。
- 改进的 Android 权限显示: 权限被组织成用户更容易理解的组。在查看权限期间,用户可以单击权限以查看有关权限的更详细信息。
- installd 加固:
installd
守护程序不以 root 用户身份运行,从而减少了 root 权限提升的潜在攻击面。 - init 脚本加固: init 脚本现在应用
O_NOFOLLOW
语义以防止与符号链接相关的攻击。 FORTIFY_SOURCE
: Android 现在实现了FORTIFY_SOURCE
。系统库和应用使用它来防止内存损坏。- ContentProvider 默认配置: 以 API level 17 为目标的应用,默认情况下,每个 Content Provider 的
export
都设置为false
,从而减少了应用的默认攻击面。 - 密码学: 修改了 SecureRandom 和 Cipher.RSA 的默认实现以使用 OpenSSL。添加了使用 OpenSSL 1.0.1 的 TLSv1.1 和 TLSv1.2 的 SSL Socket 支持
- 安全修复: 使用安全修复升级的开源库包括 WebKit、libpng、OpenSSL 和 LibXML。Android 4.2 还包括针对 Android 特定漏洞的修复。有关这些漏洞的信息已提供给开放手机联盟成员,并且修复程序已在 Android 开源项目中提供。为了提高安全性,一些运行早期版本 Android 的设备也可能包含这些修复程序。
Android 提供了一个多层安全模型,在Android 安全概览中进行了描述。每个 Android 更新都包含数十项安全增强功能,以保护用户。以下是 Android 1.5 到 4.1 版本中引入的一些安全增强功能
- Android 1.5
- ProPolice,用于防止堆栈缓冲区溢出 (-fstack-protector)
- safe_iop,用于减少整数溢出
- OpenBSD dlmalloc 的扩展,用于防止 double free() 漏洞和防止块合并攻击。块合并攻击是利用堆损坏的常用方法。
- OpenBSD calloc,用于防止内存分配期间的整数溢出
- Android 2.3
- 格式字符串漏洞保护 (-Wformat-security -Werror=format-security)
- 基于硬件的 No eXecute (NX),用于防止在堆栈和堆上执行代码
- Linux mmap_min_addr,用于缓解空指针取消引用特权提升(在 Android 4.1 中进一步增强)
- Android 4.0
- 地址空间布局随机化 (ASLR),用于随机化内存中的关键位置
- Android 4.1
- PIE(位置无关可执行文件)支持
- 只读重定位/立即绑定 (-Wl,-z,relro -Wl,-z,now)
- 已启用 dmesg_restrict(避免泄露内核地址)
- 已启用 kptr_restrict(避免泄露内核地址)