
CVE-2017-7173: Negazione del servizio locale per iOS che richiede privilegi di root.
La funzione sysctl_coalition_get_pid_list in bsd/kern/sys_coalition.c usa la
coalition_get_pid_list per raccogliere un elenco di PID in una coalizione. Questa funzione
restituisce il numero di PID in caso di successo o un errno negativo in caso di fallimento. Tuttavia, la
funzione sysctl_coalition_get_pid_list non controlla correttamente la condizione di errore, il che significa
che proverà a inviare un numero negativo di PID allo spazio utente tramite SYSCTL_OUT. Poiché il parametro
della lunghezza è un size_t, il risultato è una chiamata a copyout con un valore molto grande.
All'inizio pensavo che questa fosse una fuga di informazioni del kernel, poiché il kernel avrebbe provato a
copiare dallo stack in un buffer dello spazio utente ma alla fine avrebbe raggiunto una pagina non mappata e interrotto la
copia. Tuttavia, SYSCTL_OUT non copia valori parziali, e su macOS copyio abortisce presto se
l'indirizzo più la dimensione va in wrap-around. Questo rende il bug non sfruttabile su macOS.
Tuttavia, su iOS (o almeno su iOS 10.1.1) la funzione copyio innesca un panic se l'indirizzo più la dimensione va in wrap-around. Ciò significa che questo bug può essere usato per denial-of-service.
Lo sfruttamento richiede privilegi di root.
Ho segnalato questo problema ad Apple il 21 settembre 2017. Gli è stato assegnato CVE-2017-13833
CVE-2017-7173. Apple ha corretto i problemi in macOS 10.13.2 e iOS 11.2.
(Apple ha successivamente scoperto che CVE-2017-13833 era stato precedentemente assegnato a un problema diverso e ha riassegnato a questo problema CVE-2017-7173.)
Il codice sysctl_coalition_get_pid_list-dos è rilasciato nel pubblico dominio. Per cortesia chiedo che, se fai riferimento o usi parte di questo codice, me ne attribuisca la paternità.