
Environnement de laboratoire Android reproductible démontrant CVE-2026-0023, un contournement de confiance de propriété de mise à jour dans PackageInstaller. Inclut trois applications pour observer le comportement vulnérable et comprendre le correctif.
Un environnement de laboratoire Android complet pour reproduire et étudier CVE-2026-0023.
Ce dépôt montre comment CVE-2026-0023 permet à un installateur classique d'influencer un indicateur d'installation interne Android qui ne devrait être contrôlé que par le système, ce qui entraîne la suppression de l'avertissement de propriétaire de mise à jour d'Android lors des mises à jour d'applications.
Le projet contient trois applications Android qui modélisent un flux de travail réaliste de propriétaire de mise à jour et fournissent un environnement reproductible pour observer le comportement vulnérable.
Android a introduit le propriétaire de mise à jour (Update Ownership) pour aider les applications, les boutiques d'applications et les environnements professionnels à maintenir une chaîne de mise à jour fiable.
Lorsqu'une application a un propriétaire de mise à jour enregistré, Android avertit l'utilisateur si un autre installateur tente de mettre à jour cette application.
Dans des conditions normales, cet avertissement indique à l'utilisateur que l'application reçoit généralement ses mises à jour d'une source différente.
CVE-2026-0023 affecte le flux d'installation de paquets Android dans PackageInstallerService#createSessionInternal.
Le problème est lié à la gestion de l'indicateur d'installation interne INSTALL_FROM_MANAGED_USER_OR_PROFILE.
Dans les versions vulnérables, cet indicateur n'était pas explicitement effacé avant qu'Android ne vérifie si l'installation était effectivement associée à un utilisateur géré ou à un profil géré.
En conséquence, un installateur ordinaire pouvait influencer le comportement de la propriété de mise à jour et faire en sorte qu'Android supprime l'avertissement attendu de propriétaire de mise à jour.
Ce dépôt montre la différence entre le comportement attendu et le comportement vulnérable à l'aide d'un environnement de preuve de concept contrôlé.
| Comportement attendu | Comportement vulnérable |
|---|---|
| Android affiche l'avertissement de propriétaire de mise à jour. | Android affiche seulement une boîte de dialogue de mise à jour générique. |
![]() | ![]() |
CVE-2026-0023 est répertorié dans le bulletin de sécurité Android de mars 2026 sous la section 2026-03-01 des détails de la vulnérabilité du niveau de correctif de sécurité.
Les niveaux de correctif de sécurité Android 2026-03-01 ou ultérieurs corrigent tous les problèmes associés au niveau de correctif de sécurité 2026-03-01.
Les niveaux de correctif de sécurité Android 2026-03-05 ou ultérieurs corrigent tous les problèmes associés au niveau de correctif de sécurité 2026-03-05 et à tous les niveaux de correctif précédents.
Le comportement vulnérable est lié à la gestion de l'indicateur interne INSTALL_FROM_MANAGED_USER_OR_PROFILE.
Cet indicateur est destiné à représenter le comportement d'installation associé à un utilisateur géré ou à un profil géré.
Le correctif officiel AOSP efface explicitement cet indicateur avant qu'Android ne vérifie si l'installation appartient réellement à un utilisateur géré par une organisation.
La logique corrigée garantit que seul le système peut définir cet indicateur en fonction du résultat de DevicePolicyManagerInternal#isUserOrganizationManaged(userId).
Logique de correctif simplifiée :
final var dpmi = LocalServices.getService(DevicePolicyManagerInternal.class);
+ // Seul le système devrait pouvoir définir cet indicateur - donc assurez-vous qu'il est désactivé lorsqu'il n'est pas nécessaire.
+ params.installFlags &= ~PackageManager.INSTALL_FROM_MANAGED_USER_OR_PROFILE;
if (dpmi != null && dpmi.isUserOrganizationManaged(userId)) {
params.installFlags |= PackageManager.INSTALL_FROM_MANAGED_USER_OR_PROFILE;
}
Avant le correctif, l'indicateur n'était pas explicitement effacé avant cette vérification de profil géré.
Après le correctif, Android supprime d'abord l'indicateur et ne le définit à nouveau que si le système détermine que l'utilisateur est effectivement géré par une organisation.
Cela empêche un installateur ordinaire d'influencer cet état interne de session d'installation.
Ce dépôt contient trois applications Android :
CVE-2026-0023-Update-Ownership-PoC
├── Safe Mart
├── Unsafe Mart
└── Ownership Inspector
Safe Mart est une application d'installation de référence.
Elle installe l'application cible et demande la propriété de mise à jour lors de l'installation initiale.
Son objectif est de simuler une boutique d'applications légitime qui devient le propriétaire de mise à jour enregistré de l'application cible.
Unsafe Mart est une deuxième application d'installation utilisée pour reproduire CVE-2026-0023.
Elle prend en charge deux chemins d'installation :
Le chemin normal déclenche l'avertissement attendu de propriétaire de mise à jour d'Android.
Le chemin CVE supprime l'avertissement de propriétaire et fait afficher à Android une boîte de dialogue de confirmation de mise à jour générique à la place.
Ownership Inspector est l'application cible utilisée dans la démonstration.
L'application déclare la prise en charge de la propriété de mise à jour et affiche les métadonnées liées à l'installateur rapportées par le PackageManager d'Android.
Son objectif est de faciliter l'observation de la manière dont l'application cible a été installée ou mise à jour à chaque étape de la preuve de concept.
| Avant CVE-2026-0023 | Après CVE-2026-0023 |
![]() | ![]() |
La preuve de concept illustre deux flux de mise à jour différents :
flowchart LR
A["Safe Mart<br/>Installateur de référence"] -->|"Installe l'app cible<br/>+ demande la propriété de mise à jour"| B["Ownership Inspector<br/>App cible"]
C["Unsafe Mart<br/>Installateur alternatif"] --> D{"Chemin de mise à jour"}
D -->|"Chemin de mise à jour normal"| E["Android affiche<br/>l'avertissement de propriétaire de mise à jour"]
D -->|"Chemin CVE-2026-0023"| F["Android affiche seulement<br/>une boîte de dialogue de mise à jour générique"]
E --> G["L'utilisateur est averti :<br/>Safe Mart est le propriétaire de la mise à jour"]
F --> H["L'avertissement de propriétaire<br/>est supprimé"]
Installez les deux applications d'installation sur l'appareil de test.
Autorisez les deux applications à installer des applications inconnues lorsqu'Android le demande.
Ouvrez Safe Mart et sélectionnez le fichier APK d'Ownership Inspector.
Safe Mart installe l'application cible et demande la propriété de mise à jour lors de la session d'installation initiale.
À ce stade, Safe Mart agit comme l'installateur de référence et devient la source de mise à jour attendue pour l'application cible.
Ouvrez Ownership Inspector.
L'application affiche les métadonnées liées à l'installateur rapportées par le PackageManager d'Android.
Cette étape permet de confirmer l'état d'installation initial avant de tenter des mises à jour depuis Unsafe Mart.
Ouvrez Unsafe Mart et sélectionnez le fichier APK d'Ownership Inspector.
Choisissez le chemin de mise à jour normal.
Parce qu'Owership Inspector a été installé initialement via Safe Mart avec la propriété de mise à jour activée, Android affiche un avertissement de propriétaire de mise à jour.
C'est le comportement attendu d'Android.
L'avertissement indique à l'utilisateur que l'application reçoit normalement les mises à jour de Safe Mart, alors que la tentative de mise à jour actuelle provient d'Unsafe Mart.
Revenez à Unsafe Mart et sélectionnez à nouveau le fichier APK d'Ownership Inspector.
Choisissez le chemin de reproduction de CVE-2026-0023.
Dans ce flux, Android n'affiche plus l'avertissement de propriétaire de mise à jour.
Au lieu de cela, le système affiche seulement une boîte de dialogue de confirmation de mise à jour générique.
C'est le comportement vulnérable démontré par la preuve de concept.
La différence importante n'est pas seulement le changement visuel dans la boîte de dialogue.
Le signal de sécurité concernant le propriétaire de mise à jour enregistré est supprimé du flux de mise à jour.
Une fois la mise à jour terminée, ouvrez à nouveau Ownership Inspector.
L'application peut être utilisée pour observer les métadonnées liées à l'installateur après que le chemin de reproduction de CVE-2026-0023 a été exécuté.
Cette preuve de concept démontre un contournement du modèle de confiance du propriétaire de mise à jour.
Plus précisément, elle montre que :
La PoC ne tente pas de fournir un accès root, d'exécuter du code arbitraire, d'assurer une persistance, une furtivité ou un comportement de type logiciel malveillant.
La vulnérabilité a été reproduite sur Android 15.
La preuve de concept ne nécessite pas :
L'ensemble de la démonstration est réalisée via des applications Android ordinaires s'exécutant dans le bac à sable standard des applications Android.
Les informations de sécurité de l'appareil testé peuvent être observées dans les journaux d'application.
Exemples de valeurs collectées par la PoC :
Build.VERSION.SECURITY_PATCH
Build.VERSION.SDK_INT
Build.VERSION.RELEASE
Build.VERSION.INCREMENTAL
Build.FINGERPRINT
Pour compiler et exécuter le projet, vous avez besoin de :
Aucune modification spéciale de l'appareil n'est requise.
Ouvrez chaque projet d'application dans Android Studio et compilez les APK de débogage :
Installez ensuite Safe Mart et Unsafe Mart sur l'appareil de test.
Ownership Inspector doit être installé via Safe Mart pendant le flux de reproduction.
La PoC interagit avec les API PackageInstaller d'Android et modifie les paramètres de session d'installation pour reproduire le comportement vulnérable.
Pendant le chemin de reproduction CVE, la PoC utilise l'indicateur système lié au comportement d'installation d'utilisateur ou de profil géré :
INSTALL_FROM_MANAGED_USER_OR_PROFILE
La vulnérabilité n'est pas causée par l'accès aux API cachées elles-mêmes.
L'accès aux API cachées est uniquement utilisé comme un détail d'implémentation pour atteindre les interfaces framework requises depuis un contexte d'application ordinaire.
La frontière de sécurité importante est que cet indicateur d'installation ne devrait être fiable que lorsqu'il est défini par le système après validation de l'état de l'utilisateur géré ou du profil géré.
Ce projet utilise la bibliothèque RestrictionBypass de ChickenHook pour accéder aux interfaces framework Android non-SDK nécessaires à la preuve de concept.
Le mécanisme d'accès aux API cachées n'est pas lié à la cause racine de CVE-2026-0023 et n'est utilisé que pour interagir avec les API PackageInstaller nécessaires.
RestrictionBypass : https://github.com/ChickenHook/RestrictionBypass
Crédits aux auteurs originaux pour leur travail.
Google a classé CVE-2026-0023 comme une vulnérabilité de haute gravité de type Élévation de privilège.
Le problème ne fournit pas d'accès root ni d'exécution de code arbitraire.
Cependant, il permet à un installateur non privilégié d'effectuer une opération qui devrait normalement être protégée par le modèle de sécurité d'installation de paquets Android.
L'impact le plus pertinent se situe probablement dans les scénarios de déploiement en entreprise et sur appareils gérés.
Les organisations peuvent se fier au propriétaire de mise à jour pour garantir que les applications sont mises à jour via une boutique d'applications approuvée ou un installateur d'entreprise.
En supprimant l'avertissement de propriétaire, CVE-2026-0023 affaiblit un signal de confiance qu'Android fournirait normalement avant d'autoriser une mise à jour depuis une source différente.
Pour les appareils grand public standard, l'impact pratique dépend fortement du comportement d'installation de l'utilisateur, du niveau de correctif de l'appareil et du fait que l'application cible repose sur la sémantique du propriétaire de mise à jour.
Ce dépôt est destiné à démontrer la vulnérabilité dans un environnement de recherche contrôlé.
Il ne tente pas de :
La preuve de concept se concentre spécifiquement sur le comportement de contournement de l'avertissement de propriétaire de mise à jour associé à CVE-2026-0023.
Bulletin de sécurité Android - Mars 2026 https://source.android.com/docs/security/bulletin/2026/2026-03-01
CVE-2026-0023 - Enregistrement CVE https://www.cve.org/CVERecord?id=CVE-2026-0023
CVE-2026-0023 - NVD https://nvd.nist.gov/vuln/detail/CVE-2026-0023
Correctif AOSP - Désactivation explicite de l'indicateur INSTALL_FROM_MANAGED_USER_OR_PROFILE
https://android.googlesource.com/platform/frameworks/base/+/09055276288a68cf35b0f84ba32e28822f74ecf9
RestrictionBypass par ChickenHook https://github.com/ChickenHook/RestrictionBypass
Ce dépôt est fourni à des fins de recherche en sécurité, d'éducation et d'analyse de vulnérabilités.
Le code est destiné uniquement à reproduire et étudier CVE-2026-0023 dans des environnements contrôlés et sur des appareils où les tests sont autorisés.
L'auteur n'encourage ni n'approuve les tests non autorisés contre des appareils, applications, utilisateurs, organisations ou systèmes sans permission.
Les utilisateurs sont responsables du respect de toutes les lois, politiques et exigences organisationnelles applicables lors des tests ou de la modification d'appareils Android.
Utilisez ce dépôt de manière responsable.
| Champ | Valeur |
|---|
| CVE | CVE-2026-0023 |
| Composant | Framework / PackageInstaller |
| Fichier affecté | PackageInstallerService.java |
| Méthode affectée | createSessionInternal |
| Type de vulnérabilité | Élévation de privilège |
| Gravité | Élevée |
| CVSS v3.1 | 7.8 |
| Vecteur CVSS | CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Vecteur d'attaque | Local |
| Complexité d'attaque | Faible |
| Privilèges requis | Faible |
| Interaction utilisateur | Aucune |
| Périmètre | Inchangé |
| Impact | Élévation de privilège via un comportement non autorisé de propriétaire de mise à jour |
| Bulletin de sécurité Android | Mars 2026 |
| Référence de bogue Android | A-459461121 |
| Versions AOSP affectées listées par Google | Android 14, 15, 16, 16-qpr2 |
| Événement | Valeur |
|---|
| Bulletin de sécurité Android | Mars 2026 |
| Date de publication du bulletin | 2 mars 2026 |
| Section du niveau de correctif de sécurité | 2026-03-01 |
| Niveau de correctif entièrement traité du bulletin | 2026-03-05 ou ultérieur |
| Référence de bogue Android | A-459461121 |
| Correctif AOSP | 09055276288a68cf35b0f84ba32e28822f74ecf9 |
| Titre du correctif | Explicitly unset INSTALL_FROM_MANAGED_USER_OR_PROFILE flag |