
Preuve de concept pour CVE-2026-112445, une élévation de privilèges locale sur macOS où un utilisateur console non privilégié abuse de la tâche launchd com.apple.xpc.uscwoap et de TIOCSTI pour obtenir les droits root.
En 2020, quelqu'un a posé une question sur GitHub : Qu'est-ce que uscwoap ? macOS était déjà passé à zsh, alors pourquoi com.apple.xpc.uscwoap invoquait-il encore Bash ?
Une réponse montrait la configuration de la tâche. Elle avait l'indicateur BootShell activé et connectait les trois flux standard à la console. Sur cette base, le commentateur suggérait que la tâche pouvait intervenir dans le démarrage du système depuis le mode mono-utilisateur.
La configuration de com.apple.xpc.uscwoap réside dans le répertoire système LaunchDaemons. Les champs pertinents sont présentés ci-dessous :
Label = com.apple.xpc.uscwoap
BootShell = true
ProcessType = Interactive
Program = /bin/bash
ProgramArguments = [bash, -sh]
StandardInPath = /dev/console
StandardOutPath = /dev/console
StandardErrorPath = /dev/console
La tâche appartient au domaine système de launchd et ne spécifie aucun compte moins privilégié sous lequel s'exécuter, donc Bash s'exécute en tant que root. StandardInPath connecte son entrée standard à /dev/console. Bash interprète l'entrée qu'il reçoit de ce périphérique comme des commandes.
Un compte non administrateur connecté à la console graphique active peut démarrer cette tâche via l'interface de contrôle des tâches de launchd sans identifiants administrateur. Le processus Bash résultant s'exécute avec l'UID 0. Malgré l'indicateur BootShell, ce chemin de lancement est également disponible dans une session de bureau normale.
Le shell root reçoit ses commandes depuis /dev/console. Dans cette session de connexion graphique, le périphérique appartient au compte non administrateur, tandis que le processus Bash qui lit les commandes depuis celui-ci s'exécute en tant que root. Une frontière de privilèges sépare donc la source de l'entrée du processus qui l'exécute.
La sortie du terminal et la file d'entrée du terminal servent des objectifs différents : la première affiche du texte, tandis que la seconde contient des caractères en attente de lecture par un programme. Un processus capable d'influencer la file d'entrée peut donc influencer ce que Bash lit depuis l'entrée standard.
TIOCSTI est une interface de terminal permettant de simuler une entrée en insérant des caractères dans la file d'entrée. Sur les versions affectées, un processus s'exécutant sous le compte de l'utilisateur actuel de la console peut utiliser ce mécanisme pour influencer l'entrée sur /dev/console. Le shell root lancé par la tâche système lit ces caractères depuis le même périphérique.
Bash interprète les caractères comme des commandes et les exécute avec ses propres privilèges root. Ce chemin d'entrée n'effectue aucune vérification d'autorisation administrateur sur le processus fournissant les caractères, permettant à une entrée provenant d'un utilisateur non privilégié de devenir des commandes exécutées en tant que root.
Apple a attribué CVE-2026-112445 à ce problème, mais n'a pas inclus l'identifiant dans son avis de sécurité. La raison de cette omission est inconnue.
macOS 27.2 supprime la configuration com.apple.xpc.uscwoap.