
CVE-2017-7173: Negação de serviço local para iOS que requer privilégios de root.
A função sysctl_coalition_get_pid_list em bsd/kern/sys_coalition.c usa a função coalition_get_pid_list para coletar uma lista de PIDs em uma coalizão. Esta função retorna o número de PIDs se bem-sucedida ou um errno negativo em caso de falha. No entanto, a função sysctl_coalition_get_pid_list não verifica adequadamente a condição de erro, o que significa que tentará enviar um número negativo de PIDs para o userspace via SYSCTL_OUT. Como o parâmetro de comprimento é um size_t, o resultado é uma chamada a copyout com um valor muito grande.
Inicialmente, pensei que isso seria um vazamento de informações do kernel, já que o kernel tentaria copiar da pilha para um buffer de userspace, mas eventualmente alcançaria uma página não mapeada e abortaria a cópia. No entanto, SYSCTL_OUT não copia valores parciais, e no macOS copyio aborta cedo se o endereço mais o tamanho sofrer wrap-around. Isso torna este bug não explorável no macOS.
No entanto, no iOS (ou pelo menos no iOS 10.1.1) a função copyio aciona um panic se o endereço mais o tamanho sofrer wrap-around. Isso significa que este bug pode ser usado para negação de serviço.
A exploração requer privilégios de root.
Relatei este problema à Apple em 21 de setembro de 2017. Foi atribuído CVE-2017-13833 CVE-2017-7173. A Apple corrigiu os problemas no macOS 10.13.2 e no iOS 11.2.
(A Apple descobriu desde então que o CVE-2017-13833 foi previamente atribuído a um problema diferente e reatribuiu este problema como CVE-2017-7173.)
O código sysctl_coalition_get_pid_list-dos é disponibilizado em domínio público. Como cortesia, peço que, se você referenciar ou usar qualquer parte deste código, atribua a mim.