
CVE-2016-7608: Переполнение буфера в IOFireWireFamily.
IOFireWireFamily-overflow — это эксплойт для подтверждения концепции уязвимости CVE-2016-7608, переполнения
буфера в IOFireWireUserClient, которое было исправлено в macOS Sierra 10.12.2. Эта уязвимость может быть
использована для вызова отказа в обслуживании или, возможно, произвольного выполнения кода на устройствах с
портом FireWire.
Метод AppleFWOHCI::updateROM не проверяет длину аргумента OSData перед копированием его содержимого с
помощью bcopy в область памяти фиксированного размера, выделенную с использованием
AppleFWOHCI_IOMemoryBlock32::create.
Эксплойт может быть запущен с использованием экземпляра IOFireWireUserClient. Вызов метода
localConfigDirectory_Create возвращает дескриптор IOLocalConfigDirectory. Произвольные данные могут быть
добавлены в этот объект каталога с помощью метода localConfigDirectory_addEntry_Buffer, который не
ограничивает размер данных, кроме пределов 32-битного параметра size. Наконец, эксплойт может быть
запущен вызовом localConfigDirectory_Publish, который в конечном итоге вызывает
IOFireWireController::UpdateROM. UpdateROM создаёт объект OSData, представляющий скомпилированный
ROM, включая управляемые пользователем данные, добавленные ранее. Затем он передаёт объект OSData в
AppleFWOHCI::updateROM, который копирует данные в область памяти, на которую указывает
fpNextConfigROM. Это область памяти размером 4096 байт, выделенная в AppleFWOHCI::setupAsync с помощью
AppleFWOHCI_IOMemoryBlock32::create. Если в localConfigDirectory_addEntry_Buffer передать более 4096
байт, то запись переполнит это выделение, затронув последующие страницы.
На практике страница, следующая за переполненным буфером, обычно не отображена, что вызывает панику ядра при переполнении.
Код IOFireWireFamily-overflow выпущен в общественное достояние. В порядке любезности я прошу, чтобы при использовании или цитировании этого кода вы указывали меня как автора.