
CVE-2025-31200 - @Noahhw46 разобрался
Доказательство концепции для исправления CoreAudio (CVE-2025-31200) в iOS 18.4.1. Статья здесь https://blog.noahhw.dev/posts/cve-2025-31200/.
Я смог довести это до контролируемой записи, если не произвольной. Статья скоро появится. Однако, чтобы увидеть это самостоятельно, вам придется собрать на версии macOS до исправления: < 15.4.1. Вы можете воспроизвести аудио с помощью lldb-хука check-mismatch (используя простую обвязку, которая просто воспроизводит аудио), чтобы увидеть запись. Пока это не отличная произвольная запись, как я упоминал выше, по нескольким причинам — но в основном потому, что я всё ещё не уверен на 100%, на каком этапе конвейера декодирования эти значения из буфера кадров находятся, когда они ремапятся. Я останавливаюсь здесь, чтобы работать над статьёй, если кто-то захочет продолжить.
Я @noahhw46 (не смог бы сделать это без @zhouwei) разобрался (статья скоро). Тем не менее, нужно ещё многое понять. Я добавил первую часть следующих шагов моего исследования, чтобы показать, что именно делает ошибка. check-mismatch — это ещё один lldb-скрипт, который можно использовать с рабочей POC, чтобы точно показать несоответствие, созданное между mRemappingArray и картой перестановок в APACChannelRemapper::Process (на самом деле в APACHOADecoder::DecodeAPACFrame).
The mRemappingArray is sized based on the lower two bytes of mChannelLayoutTag.
By creating a mismatch between them, a later stage of processing in APACHOADecoder::DecodeAPACFrame is corrupted.
When the APACHOADecoder goes to process the APAC frame (permute it according to the channel remapping array), it uses the mRemappingArray as the permutation map to do the well, channel remapping. It seems like the frame data that is being remapped is sized based on mTotalComponenets.
Когда вы воспроизводите аудиофайл output.mp4 (например, с помощью AVAudioPlayer), APACChannelRemapper::Process будет читать, а затем записывать за пределы памяти.
Вы можете увидеть первое чтение за пределами, если включите Guard Malloc в Xcode:
Без Guard Malloc, APACHOADecoder::DecodeAPACFrame позже упадет с недопустимым memmove:
Предыдущий README @zhuowei ниже:
Пытаюсь понять исправление CoreAudio (CVE-2025-31200) в iOS 18.4.1.
Я ещё не разобрался.
В настоящее время я получаю разные сообщения об ошибках при декодировании output.mp4 на macOS 15.4.1:
error 01:10:26.743480-0400 getaudiolength <private>:548 Invalid mRemappingArray bitstream in hoa::CodecConfig::Deserialize()
error 01:10:26.743499-0400 getaudiolength <private>:860 Error in deserializing ASC components
по сравнению с симулятором Xcode для visionOS 2.2:
error 01:09:21.841805-0400 VisionOSEvaluation APACProfile.cpp:424 ERROR: Wrong profile index in GlobalConfig
error 01:09:21.841914-0400 VisionOSEvaluation APACGlobalConfig.cpp:894 Profile and level data could not be validated
так что я попадаю на новую проверку, но не знаю, как заставить её что-то перезаписать.
Изменённая функция, похоже, — это apac::hoa::CodecConfig::Deserialize в /System/Library/Frameworks/AudioToolbox.framework/AudioCodecs.
APAC — это Apple Positional Audio Codec
HOA — это Higher-order Ambisonics.
Если вы посмотрите на пример файла из трекера ошибок ffmpeg:
$ avmediainfo ~/Downloads/clap.MOV
Asset: /Users/zhuowei/Downloads/clap.MOV
<...>
Track 3: Sound 'soun'
Enabled: No
Format Description 1:
Format: APAC 'apac'
Channel Layout: High-Order Ambisonics, ACN/SN3D
Sample rate: 48000.0
Bytes per packet: 0
Frames per packet: 1024
Bytes per frame: 0
Channels per frame: 4
Bits per channel: 0
System support for decoding this track: Yes
Data size: 43577 bytes
Media time scale: 48000
Duration: 0.898 seconds
Estimated data rate: 363.142 kbit/s
Extended language tag: und
1 segment present
Index Media Start Media Duration Track Start Track Duration
1 00:00:00.000 00:00:00.898 00:00:00.000 00:00:00.898
Member of alternate group 0: (2, 3)
Вы можете конвертировать в APAC с помощью afconvert -o sound440.m4a -d apac -f mp4f sound440hz.wav.
Используя bindiff на iOS 18.4.1 против 18.4, похоже, что чтение mRemappingArray теперь проверяет глобальный AudioChannelLayout* по смещению 0x58 для количества каналов вместо ремапингового AudioChannelLayout* по смещению 0x78.
Файл encodeme.mm кодирует APAC, а LLDB-скрипт принудительно добавляет дополнительные элементы в mRemappingArray и ремапинговый AudioChannelLayout:
./build_encodeme.sh
./run_encodeme.sh