一个完整的 Android 实验室环境,用于重现和研究 CVE-2026-0023。
此仓库演示了 CVE-2026-0023 如何允许普通安装程序影响仅应由系统控制的内部 Android 安装标志,从而导致应用程序更新期间 Android 的“更新所有权”警告被抑制。
该项目包含三个 Android 应用程序,它们模拟了一个真实的更新所有权工作流程,并提供了一个可重现的环境来观察有漏洞的行为。
Android 引入了更新所有权,以帮助应用程序、应用商店和企业环境维护可信的更新链。
当应用程序拥有已注册的更新所有者时,如果另一个安装程序尝试更新该应用程序,Android 会警告用户。
在正常情况下,此警告告知用户该应用程序通常从不同的来源接收更新。
CVE-2026-0023 影响 PackageInstallerService#createSessionInternal 内部的 Android 包安装流程。
该问题与内部 INSTALL_FROM_MANAGED_USER_OR_PROFILE 安装标志的处理有关。
在有漏洞的版本中,在 Android 检查安装是否实际上与托管用户或托管配置文件关联之前,此标志没有被显式清除。
结果,普通安装程序可以影响更新所有权行为,并导致 Android 抑制预期的更新所有权警告。
此仓库使用受控的概念验证环境,展示了预期行为和有漏洞行为之间的差异。
| 预期行为 | 有漏洞行为 |
|---|---|
| Android 显示更新所有权警告。 | Android 仅显示通用更新对话框。 |
![]() | ![]() |
| 字段 | 值 |
|---|---|
| CVE | CVE-2026-0023 |
| 组件 | Framework / PackageInstaller |
| 受影响文件 | PackageInstallerService.java |
| 受影响方法 | createSessionInternal |
| 漏洞类型 | 权限提升 |
| 严重性 | 高 |
| CVSS v3.1 | 7.8 |
| CVSS 向量 | CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| 攻击向量 | 本地 |
| 攻击复杂度 | 低 |
| 所需权限 | 低 |
| 用户交互 | 无 |
| 范围 | 未改变 |
| 影响 | 通过未授权的更新所有权行为实现权限提升 |
| Android 安全公告 | 2026 年 3 月 |
| Android 漏洞参考 | A-459461121 |
| Google 列出的受影响 AOSP 版本 | Android 14、15、16、16-qpr2 |
| 事件 | 值 |
|---|---|
| Android 安全公告 | 2026 年 3 月 |
| 公告发布日期 | 2026 年 3 月 2 日 |
| 安全补丁级别部分 | 2026-03-01 |
| 公告范围完全修复的补丁级别 | 2026-03-05 或更高 |
| Android 漏洞参考 | A-459461121 |
| AOSP 补丁 | 09055276288a68cf35b0f84ba32e28822f74ecf9 |
| 补丁标题 | 显式取消设置 INSTALL_FROM_MANAGED_USER_OR_PROFILE 标志 |
CVE-2026-0023 列在 2026 年 3 月 Android 安全公告的 2026-03-01 安全补丁级别漏洞详情中。
Android 安全补丁级别为 2026-03-01 或更高版本解决了与 2026-03-01 安全补丁级别相关的所有问题。
Android 安全补丁级别为 2026-03-05 或更高版本解决了与 2026-03-05 安全补丁级别以及所有先前补丁级别相关的所有问题。
有漏洞的行为与内部 INSTALL_FROM_MANAGED_USER_OR_PROFILE 标志的处理有关。
此标志旨在表示与托管用户或托管配置文件关联的安装行为。
官方的 AOSP 补丁在 Android 检查安装是否实际属于组织管理用户之前,显式清除了此标志。
修复后的逻辑确保只有系统才能根据 DevicePolicyManagerInternal#isUserOrganizationManaged(userId) 的结果设置此标志。
简化的补丁逻辑:
final var dpmi = LocalServices.getService(DevicePolicyManagerInternal.class);
+ // 只有系统才能设置此标志 - 因此确保在不必要时取消设置。
+ params.installFlags &= ~PackageManager.INSTALL_FROM_MANAGED_USER_OR_PROFILE;
if (dpmi != null && dpmi.isUserOrganizationManaged(userId)) {
params.installFlags |= PackageManager.INSTALL_FROM_MANAGED_USER_OR_PROFILE;
}
在补丁之前,标志在托管配置文件检查之前没有被显式清除。
补丁之后,Android 首先移除该标志,并且仅当系统确定用户实际为组织管理时才重新设置它。
这阻止了普通安装程序影响此内部安装会话状态。
此仓库包含三个 Android 应用程序:
CVE-2026-0023-Update-Ownership-PoC
├── Safe Mart
├── Unsafe Mart
└── Ownership Inspector
Safe Mart 是一个参考安装程序应用程序。
它安装目标应用程序,并在初始安装期间请求更新所有权。
其目的是模拟一个合法的应用商店,该商店成为目标应用程序的注册更新所有者。
Unsafe Mart 是第二个安装程序应用程序,用于重现 CVE-2026-0023。
它支持两种安装路径:
正常路径触发 Android 预期的更新所有权警告。
CVE 路径抑制所有权警告,并导致 Android 显示一个通用更新确认对话框。
Ownership Inspector 是演示中使用的目标应用程序。
该应用程序声明支持更新所有权,并显示 Android 的 PackageManager 报告的与安装程序相关的元数据。
其目的是便于观察在概念验证的每个阶段,目标应用程序是如何安装或更新的。
| CVE-2026-0023 之前 | CVE-2026-0023 之后 |
![]() |
![]() |
概念验证演示了两种不同的更新流程:
flowchart LR
A["Safe Mart<br/>参考安装程序"] -->|"安装目标应用<br/>+ 请求更新所有权"| B["Ownership Inspector<br/>目标应用"]
C["Unsafe Mart<br/>替代安装程序"] --> D{"更新路径"}
D -->|"正常更新路径"| E["Android 显示<br/>更新所有权警告"]
D -->|"CVE-2026-0023 路径"| F["Android 仅显示<br/>通用更新对话框"]
E --> G["用户被警告:<br/>Safe Mart 是更新所有者"]
F --> H["所有权警告<br/>被抑制"]
在测试设备上安装两个安装程序应用程序。
当 Android 请求时,允许这两个应用程序安装未知应用。
打开 Safe Mart 并选择 Ownership Inspector APK。
Safe Mart 安装目标应用程序,并在初始安装会话期间请求更新所有权。
此时,Safe Mart 作为参考安装程序,并成为目标应用的预期更新来源。
打开 Ownership Inspector。
应用程序显示 Android 的 PackageManager 报告的与安装程序相关的元数据。
此步骤有助于在尝试从 Unsafe Mart 更新之前确认初始安装状态。
打开 Unsafe Mart 并选择 Ownership Inspector APK。
选择正常更新路径。
由于 Ownership Inspector 最初是通过 Safe Mart 安装并启用了更新所有权,因此 Android 会显示更新所有权警告。
这是预期的 Android 行为。