
CVE-2017-7173: Lokaler Denial-of-Service für iOS mit Root-Rechten.
Die Funktion sysctl_coalition_get_pid_list in bsd/kern/sys_coalition.c verwendet die Funktion coalition_get_pid_list, um eine Liste von PIDs in einer Koalition zu sammeln. Diese Funktion gibt bei Erfolg die Anzahl der PIDs oder bei Fehlschlag einen negativen errno zurück. Allerdings prüft die Funktion sysctl_coalition_get_pid_list die Fehlerbedingung nicht ordnungsgemäß, sodass sie versucht, eine negative Anzahl von PIDs über SYSCTL_OUT an den Userspace zu senden. Da der Längenparameter ein size_t ist, führt dies zu einem Aufruf von copyout mit einem sehr großen Wert.
Ich dachte zunächst, dass dies ein Kernel-Informationsleck wäre, da der Kernel versuchen würde, vom Stack in einen Userspace-Puffer zu kopieren, aber schließlich eine nicht gemappte Seite erreichen und die Kopie abbrechen würde. Allerdings kopiert SYSCTL_OUT keine Teilwerte aus, und unter macOS bricht copyio frühzeitig ab, wenn die Adresse plus Größe einen Überlauf ergibt. Dadurch ist dieser Fehler unter macOS nicht ausnutzbar.
Unter iOS (oder zumindest unter iOS 10.1.1) löst die copyio-Funktion jedoch einen Panic aus, wenn die Adresse plus Größe einen Überlauf ergibt. Das bedeutet, dass dieser Fehler für Denial-of-Service verwendet werden kann.
Für die Ausnutzung sind Root-Rechte erforderlich.
Ich habe dieses Problem am 21. September 2017 an Apple gemeldet. Es wurde CVE-2017-13833 CVE-2017-7173 zugewiesen. Apple hat die Probleme in macOS 10.13.2 und iOS 11.2 behoben.
(Apple hat inzwischen festgestellt, dass CVE-2017-13833 zuvor einem anderen Problem zugewiesen wurde, und hat dieses Problem als CVE-2017-7173 neu zugewiesen.)
Der Code von sysctl_coalition_get_pid_list-dos wird in die Public Domain freigegeben. Als Höflichkeit bitte ich darum, dass Sie mich nennen, falls Sie diesen Code referenzieren oder verwenden.