
CVE-2017-7173: Denegación de servicio local para iOS que requiere privilegios de root.
La función sysctl_coalition_get_pid_list en bsd/kern/sys_coalition.c utiliza la
función coalition_get_pid_list para recopilar una lista de PIDs en una coalición. Esta función
devolverá el número de PIDs si tiene éxito o un errno negativo en caso de fallo. Sin embargo, la
función sysctl_coalition_get_pid_list no comprueba correctamente la condición de error, lo que significa
que intentará enviar un número negativo de PIDs al espacio de usuario mediante SYSCTL_OUT. Dado que el parámetro
de longitud es un size_t, el resultado es una llamada a copyout con un valor muy grande.
Al principio pensé que esto sería una fuga de información del kernel, ya que el kernel intentaría
copiar desde la pila a un búfer del espacio de usuario, pero eventualmente alcanzaría una página no mapeada y abortaría la
copia. Sin embargo, SYSCTL_OUT no copia valores parciales, y en macOS copyio aborta tempranamente si
la dirección más el tamaño se desborda. Esto hace que este error no sea explotable en macOS.
Sin embargo, en iOS (o al menos en iOS 10.1.1) la función copyio provoca un pánico si la dirección más el tamaño se desborda. Esto significa que este error puede utilizarse para denegación de servicio.
La explotación requiere privilegios de root.
Informé de este problema a Apple el 21 de septiembre de 2017. Se le asignó CVE-2017-13833
CVE-2017-7173. Apple solucionó los problemas en macOS 10.13.2 y iOS 11.2.
(Apple ha descubierto desde entonces que CVE-2017-13833 estaba asignado previamente a un problema diferente y ha reasignado este problema a CVE-2017-7173).
El código de sysctl_coalition_get_pid_list-dos se libera al dominio público. Como cortesía, pido que si haces referencia o usas parte de este código, me lo atribuyas.