
CVE-2016-7608: Desbordamiento de búfer en IOFireWireFamily.
IOFireWireFamily-overflow es un exploit de prueba de concepto para CVE-2016-7608, un desbordamiento de búfer en IOFireWireUserClient que se corrigió en macOS Sierra 10.12.2. Esta vulnerabilidad puede provocar una denegación de servicio o posiblemente la ejecución de código arbitrario en dispositivos con un puerto FireWire.
El método AppleFWOHCI::updateROM no comprueba la longitud de un argumento OSData antes de copiar su contenido con bcopy a una región de memoria de tamaño fijo asignada mediante AppleFWOHCI_IOMemoryBlock32::create.
El exploit se puede activar mediante una instancia de IOFireWireUserClient. Llamar al método localConfigDirectory_Create produce un handle a un IOLocalConfigDirectory. Se pueden añadir datos arbitrarios a este objeto de directorio mediante el método localConfigDirectory_addEntry_Buffer, que no restringe el tamaño de los datos más allá de los límites del parámetro size de 32 bits. Finalmente, el exploit se puede activar llamando a localConfigDirectory_Publish, que a su vez llama a IOFireWireController::UpdateROM. UpdateROM crea un objeto OSData que representa la ROM compilada, incluidos los datos controlados por el usuario añadidos anteriormente. Luego pasa el objeto OSData a AppleFWOHCI::updateROM, que copia los datos en la región de memoria apuntada por fpNextConfigROM. Esta es una región de memoria de 4096 bytes asignada en AppleFWOHCI::setupAsync mediante AppleFWOHCI_IOMemoryBlock32::create. Si se pasan más de 4096 bytes a localConfigDirectory_addEntry_Buffer, la escritura desbordará esta asignación hacia las páginas siguientes.
En la práctica, la página posterior al búfer desbordado suele estar sin mapear, lo que provoca un pánico del kernel al desbordarse.
El código de IOFireWireFamily-overflow se publica en el dominio público. Como cortesía, pido que si haces referencia o usas cualquier parte de este código, me lo atribuyas.