
CVE-2017-7173: Локальный отказ в обслуживании для iOS, требующий прав root.
Функция sysctl_coalition_get_pid_list в bsd/kern/sys_coalition.c использует функцию coalition_get_pid_list для сбора списка идентификаторов процессов (PID) в коалиции. Эта функция возвращает количество PID в случае успеха или отрицательный код ошибки (errno) при сбое. Однако функция sysctl_coalition_get_pid_list некорректно проверяет условие ошибки, из-за чего она пытается отправить отрицательное количество PID в пользовательское пространство через SYSCTL_OUT. Поскольку параметр длины имеет тип size_t, результатом становится вызов copyout с очень большим значением.
Сначала я подумал, что это будет утечка информации из ядра, поскольку ядро попытается скопировать данные из стека в буфер пользовательского пространства, но в конечном итоге достигнет неотображённой страницы и прервёт копирование. Однако SYSCTL_OUT не копирует частичные значения, а в macOS copyio прерывается на ранней стадии, если адрес плюс размер вызывает переполнение. Это делает данную ошибку неэксплуатируемой в macOS.
Однако в iOS (по крайней мере, в iOS 10.1.1) функция copyio вызывает панику, если адрес плюс размер вызывает переполнение. Это означает, что данную ошибку можно использовать для отказа в обслуживании.
Для эксплуатации требуются права root.
Я сообщил об этой проблеме Apple 21 сентября 2017 года. Ей был присвоен CVE-2017-13833 CVE-2017-7173. Apple исправила проблему в macOS 10.13.2 и iOS 11.2.
(С тех пор Apple обнаружила, что CVE-2017-13833 был ранее присвоен другой проблеме, и переназначила данной проблеме CVE-2017-7173.)
Код sysctl_coalition_get_pid_list-dos выпущен в общественное достояние. В качестве любезности я прошу указывать меня как автора, если вы ссылаетесь на этот код или используете его.