Notes de rétro-ingénierie et PoC fonctionnel pour CVE-2026-84568, une violation de frontière de confiance d'automountd sur macOS permettant des montages depuis localhost ou le nom d'hôte de la victime elle-même.
Rétro-ingénierie indépendante du correctif autofs de macOS pour CVE-2026-84568, ainsi qu'un PoC fonctionnel pour la violation de frontière de confiance.
Apple a publié l'avis. Mr.Gedik (@h4ck2s3c) a signalé le bug. Ce dépôt documente le mécanisme technique — la fonction corrigée, ce que fait la vérification, et quels chemins de montage le correctif bloque — et inclut un PoC fonctionnel qui reproduit la violation de confiance sur un système vulnérable.
| Champ | Valeur |
|---|
| CVE | CVE-2026-84568 |
| Composant | autofs / automountd |
| Affecté | macOS Tahoe 26.6 et antérieurs |
| Corrigé dans | macOS Tahoe 26.7, macOS Golden Gate 27, macOS Sequoia 15.8 |
| Impact selon l'avis | « Un attaquant contrôlant un serveur d'annuaire réseau peut être en mesure d'exécuter du code arbitraire avec les privilèges root. » |
| Signalé par | Mr.Gedik (@h4ck2s3c) de Turkish Technology |
L'avis d'Apple pour CVE-2026-84568 documente l'impact et la version du correctif. Il ne documente pas le mécanisme technique :
Aucune analyse technique publique n'a été trouvée au moment de la
rédaction. Ce dépôt comble cette lacune avec une analyse de
rétro-ingénierie indépendante de automountd_26.6 et automountd_27,
et un PoC fonctionnel pour la violation de frontière de confiance
sous-jacente.
Il ne s'agit pas d'une revendication de découverte. Le CVE a été signalé par Mr.Gedik et corrigé par Apple. La contribution ici est l'analyse technique et la reproduction.
automountd récupère les cartes automount auprès d'un service
d'annuaire configuré (LDAP, NIS, OpenDirectory). Dans la version
vulnérable (26.6 et antérieures), automountd ne validait pas si
le composant hôte d'une entrée de carte se résolvait vers la machine
locale.
Un serveur d'annuaire malveillant pouvait donc servir une entrée de carte dont la source de montage était :
localhost<hostname>.local)127.0.0.1La victime montait alors depuis elle-même sur un point de montage contrôlé par l'attaquant.
La version corrigée (26.7 / 27) ajoute une vérification du nom d'hôte
dans sym.func.100005bd8 qui rejette les entrées correspondant à l'un
des cas ci-dessus.
sym.func.100005bd8 entre
automountd_26.6 et automountd_27 — voir docs/PATCH_DIFF.mdstrncasecmp contre
"localhost", gethostname(), SCDynamicStoreCopyLocalHostName +
".local", et une boucle getifaddrs / getipnodebyaddr énumérant
toutes les IP localesfstype à travers parse_nfs →
mapline_to_mapent → asprintf("%s/mount_%s", "/sbin", fstype) —
le champ n'est pas validé avant la construction du chemin du programmewebdavfs_agent — le
callback characters utilise __memcpy_chk avec des vérifications
explicites de longueur ; pas de débordementod_process_record_attributes — le parseur
d'enregistrements OpenDirectory utilise des API CoreFoundation tout du
long ; pas de tampons de taille fixemount_nfs, mount_smbfs,
mount_url, et tous les bundles NetFSPlugins/* vérifiés pour
l'exécution de shell ; aucun trouvéVoir docs/ANALYSIS.md pour l'analyse complète et
docs/ARTIFACTS.md pour les adresses et
échantillons de journaux.
poc.sh — une configuration côté attaquant en un seul fichier.
Démarre un serveur LDAP avec une carte malveillante auto_master /
auto_evil et une exportation NFS avec un marqueur de preuve d'accès.
Lorsque l'automountd de la victime récupère la carte, il monte sa
propre exportation NFS sur le chemin contrôlé par l'attaquant.auto_master /
auto_evil forgéeautomountd de la victime récupérant la carte sur le réseau127.0.0.1L'impact « exécution de code arbitraire avec les privilèges root » de
l'avis d'Apple n'est pas atteignable via les chemins testés dans
cette analyse. Voir la section « Chemins testés et écartés » dans
docs/ANALYSIS.md pour la liste complète.
L'impact démontré est la violation de frontière de confiance elle-même : la victime monte depuis une source qu'elle aurait dû rejeter.
poc.sh configuration côté attaquant (fichier unique)
docs/
ANALYSIS.md analyse complète de rétro-ingénierie
PATCH_DIFF.md diff de sym.func.100005bd8 entre 26.6 et 27
ARTIFACTS.md adresses et échantillons de journaux
README.md ce fichier
LICENSE
Quatre fichiers, deux répertoires. Rien d'autre.
brew install openldap)slapd.conf définissant : database mdb avec suffix "dc=evil,dc=local"nfsd) — fourni avec macOSslapd, nfsd, /etc/exports)automountd vulnérable)+auto_master présent dans /etc/auto_masternfsd en cours d'exécution sur la victime, exportant un répertoireLa victime a besoin d'un serveur NFS en cours d'exécution pour que le
montage réussisse. Le CVE concerne l'acceptation de l'entrée
d'hôte local, pas la livraison de l'exportation. Si la victime
n'exécute pas nfsd, le montage échoue avec NFS server 127.0.0.1 not responding — ce qui démontre tout de même que automountd a accepté
l'entrée.
./poc.sh <ATTACKER_IP>
Remplacez <ATTACKER_IP> par l'IP de l'attaquant telle que vue depuis
la victime.
sudo automount -vc
ls /System/Volumes/Data/mnt/evil/evil/
cat /System/Volumes/Data/mnt/evil/evil/proof.txt
Le fichier proof.txt est lisible à travers le montage. La source de
montage dans la sortie de mount est 127.0.0.1:<export_dir> :
127.0.0.1:/tmp/nfsroot on /System/Volumes/Data/mnt/evil/evil (nfs, nodev, nosuid, automounted, nobrowse)
La présence de nodev et nosuid reflète les valeurs par défaut du
montage NFS du noyau et la gestion des options propre à mount_nfs —
elles ne proviennent pas d'automountd. Voir docs/ANALYSIS.md pour
la décomposition complète.
Sur un système corrigé (26.7 / 27), la même entrée de carte est rejetée
avant toute tentative de montage. Voir docs/PATCH_DIFF.md
pour la comparaison de désassemblage de sym.func.100005bd8.
Pour confirmer sur un hôte corrigé :
# Serve the same map entry, then on the patched victim:
sudo automount -vc
ls /System/Volumes/Data/mnt/evil/evil/
Attendu : le point de montage n'est pas créé, et aucune entrée
n'apparaît dans la sortie de mount. La vérification
sym.func.100005bd8 rejette l'entrée lorsque l'hôte est 127.0.0.1,
localhost, ou le nom d'hôte local.
fstype (constatation distincte)Lors de l'analyse, une faiblesse distincte de défense en profondeur a
été trouvée : sym.func.1000086f4 (run_mount_cmd) construit un chemin
de programme via asprintf("%s/mount_%s", "/sbin", fstype) sans
valider le champ fstype de l'entrée de carte.
Les séquences de traversée de chemin dans fstype atteignent l'appel
asprintf :
automountd: Can't stat mount program /sbin/mount_../../../../../../tmp/evil_prog: No such file or directory
Sur une installation macOS standard, le chemin résultant ne se résout
pas en un exécutable car /sbin/mount_.. n'existe pas. L'injection est
réelle mais bloquée par la résolution de chemin. Elle ne deviendrait
exploitable que si un chemin inscriptible existait sous /sbin, ou si
un lien symbolique de répertoire mount_<X> était créé — ce qui n'est
le cas ni l'un ni l'autre sur macOS standard.
Ceci est documenté comme une observation distincte, et non comme partie
de CVE-2026-84568. Voir docs/ANALYSIS.md pour les détails.
Ce dépôt est fourni à des fins de recherche en sécurité défensive et d'éducation uniquement.
MIT. Voir LICENSE.