Note di reverse engineering e PoC funzionante per CVE-2026-84568, una violazione del confine di fiducia di automountd su macOS che consente mount da localhost o dal nome host della vittima stessa.
Reverse engineering indipendente della patch autofs di macOS per CVE-2026-84568, più un PoC funzionante per la violazione del confine di fiducia.
Apple ha pubblicato l'advisory. Mr.Gedik (@h4ck2s3c) ha segnalato il bug. Questo repository documenta il meccanismo tecnico — la funzione corretta, cosa fa il controllo e quali percorsi di mount la patch blocca — e include un PoC funzionante che riproduce la violazione di fiducia su un sistema vulnerabile.
| Campo | Valore |
|---|
| CVE | CVE-2026-84568 |
| Componente | autofs / automountd |
| Affetto | macOS Tahoe 26.6 e precedenti |
| Corretto in | macOS Tahoe 26.7, macOS Golden Gate 27, macOS Sequoia 15.8 |
| Impatto dell'advisory | "Un attaccante con il controllo di un server di directory di rete potrebbe essere in grado di eseguire codice arbitrario con privilegi di root." |
| Segnalato da | Mr.Gedik (@h4ck2s3c) di Turkish Technology |
L'advisory di Apple per CVE-2026-84568 documenta l'impatto e la versione della patch. Non documenta il meccanismo tecnico:
Al momento della stesura non è stato trovato alcun writeup tecnico pubblico. Questo
repository colma questa lacuna con un'analisi di reverse engineering indipendente
di automountd_26.6 e automountd_27, e un PoC funzionante
per la sottostante violazione del confine di fiducia.
Questa non è una rivendicazione di scoperta. Il CVE è stato segnalato da Mr.Gedik e corretto da Apple. Il contributo qui è l'analisi tecnica e la riproduzione.
automountd recupera le mappe automount da un servizio di directory configurato
(LDAP, NIS, OpenDirectory). Nella versione vulnerabile (26.6 e precedenti),
automountd non validava se il componente host di una voce di mappa
si risolvesse alla macchina locale.
Un server di directory malevolo poteva quindi servire una voce di mappa la cui sorgente di mount era:
localhost<hostname>.local)127.0.0.1La vittima avrebbe quindi montato da se stessa in un punto di mount controllato dall'attaccante.
La versione corretta (26.7 / 27) aggiunge un controllo del nome host in
sym.func.100005bd8 che rifiuta le voci che corrispondono a una qualsiasi delle precedenti.
sym.func.100005bd8 tra automountd_26.6
e automountd_27 — vedi docs/PATCH_DIFF.mdstrncasecmp contro
"localhost", gethostname(), SCDynamicStoreCopyLocalHostName +
".local", e un ciclo getifaddrs / getipnodebyaddr che enumera
tutti gli IP localifstype attraverso parse_nfs →
mapline_to_mapent → asprintf("%s/mount_%s", "/sbin", fstype) —
il campo non viene validato prima di costruire il percorso del programmawebdavfs_agent — il
callback characters usa __memcpy_chk con controlli espliciti di lunghezza;
nessun overflowod_process_record_attributes — il parser dei record OpenDirectory
usa le API CoreFoundation ovunque; nessun buffer a dimensione fissamount_nfs, mount_smbfs, mount_url,
e tutti i bundle NetFSPlugins/* controllati per l'esecuzione di shell; nessuno
trovatoVedi docs/ANALYSIS.md per il writeup completo e
docs/ARTIFACTS.md per gli indirizzi e i campioni di log.
poc.sh — un setup lato attaccante in un singolo file. Avvia un server
LDAP con una mappa auto_master / auto_evil malevola e un export NFS
con un marcatore di prova di accesso. Quando l'automountd della vittima
recupera la mappa, monta il proprio export NFS nel
percorso controllato dall'attaccante.auto_master / auto_evil artigianaleautomountd della vittima che recupera la mappa attraverso la rete127.0.0.1L'impatto "esecuzione di codice arbitrario con privilegi di root" nell'advisory
di Apple non è raggiungibile attraverso i percorsi testati in questa analisi.
Vedi la sezione "Percorsi testati ed esclusi" in
docs/ANALYSIS.md per l'elenco completo.
L'impatto dimostrato è la violazione del confine di fiducia stessa: la vittima monta da una sorgente che avrebbe dovuto rifiutare.
poc.sh setup lato attaccante (singolo file)
docs/
ANALYSIS.md writeup completo di reverse engineering
PATCH_DIFF.md diff di sym.func.100005bd8 tra 26.6 e 27
ARTIFACTS.md indirizzi e campioni di log
README.md questo file
LICENSE
Quattro file, due directory. Nient'altro.
brew install openldap)slapd.conf che definisce: database mdb con suffix "dc=evil,dc=local"nfsd) — incluso in macOSslapd, nfsd, /etc/exports)automountd vulnerabile)+auto_master presente in /etc/auto_masternfsd in esecuzione sulla vittima, che esporta una directoryLa vittima necessita di un server NFS in esecuzione perché il mount riesca. Il
CVE riguarda l'accettazione della voce dell'host locale, non la
distribuzione dell'export. Se la vittima non esegue nfsd, il mount
fallisce con NFS server 127.0.0.1 not responding — il che comunque
dimostra che automountd ha accettato la voce.
./poc.sh <ATTACKER_IP>
Sostituisci <ATTACKER_IP> con l'IP dell'attaccante come visto dalla vittima.
sudo automount -vc
ls /System/Volumes/Data/mnt/evil/evil/
cat /System/Volumes/Data/mnt/evil/evil/proof.txt
Il file proof.txt è leggibile attraverso il mount. La sorgente di mount
nell'output di mount è 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 presenza di nodev e nosuid riflette le impostazioni predefinite di mount NFS
del kernel e la gestione delle opzioni di mount_nfs stesso — non provengono da
automountd. Vedi docs/ANALYSIS.md per la ripartizione completa.
Su un sistema corretto (26.7 / 27), la stessa voce di mappa viene rifiutata prima
di qualsiasi tentativo di mount. Vedi docs/PATCH_DIFF.md per
il confronto del disassemblaggio di sym.func.100005bd8.
Per confermare su un host corretto:
# Serve the same map entry, then on the patched victim:
sudo automount -vc
ls /System/Volumes/Data/mnt/evil/evil/
Atteso: il punto di mount non viene creato e nessuna voce appare nell'output
di mount. Il controllo sym.func.100005bd8 rifiuta la voce quando
l'host è 127.0.0.1, localhost, o il nome host locale.
fstype (scoperta separata)Durante l'analisi, è stata trovata una debolezza separata di difesa in profondità:
sym.func.1000086f4 (run_mount_cmd) costruisce un percorso di programma tramite
asprintf("%s/mount_%s", "/sbin", fstype) senza validare il
campo fstype dalla voce di mappa.
Le sequenze di path traversal in fstype raggiungono la chiamata asprintf:
automountd: Can't stat mount program /sbin/mount_../../../../../../tmp/evil_prog: No such file or directory
Su un'installazione standard di macOS, il percorso risultante non si risolve in
un eseguibile perché /sbin/mount_.. non esiste. L'iniezione
è reale ma bloccata dalla risoluzione del percorso. Diventerebbe sfruttabile
solo se esistesse un percorso scrivibile sotto /sbin, o se fosse creato un
symlink di directory mount_<X> — nessuna delle due condizioni vale su macOS
standard.
Questo è documentato come osservazione separata, non come parte di
CVE-2026-84568. Vedi docs/ANALYSIS.md per i dettagli.
Questo repository è fornito solo per ricerca di sicurezza difensiva e istruzione.
MIT. Vedi LICENSE.