
CVE-2025-31200 - @Noahhw46 ने इसका पता लगा लिया
CoreAudio पैच (CVE-2025-31200) के लिए प्रूफ-ऑफ-कॉन्सेप्ट iOS 18.4.1 में। राइट-अप यहाँ: https://blog.noahhw.dev/posts/cve-2025-31200/.
मैं इसे एक नियंत्रित राइट तक बढ़ाने में सक्षम रहा हूँ, यदि मनमाना नहीं तो। राइट-अप जल्द आ रहा है। हालाँकि, इसे स्वयं देखने के लिए आपको पैच से पहले के macOS संस्करण पर बिल्ड करना होगा: < 15.4.1. आप राइट को देखने के लिए check-mismatch lldb हुक के साथ ऑडियो चला सकते हैं (एक साधारण हार्नेस का उपयोग करके जो केवल ऑडियो चलाता है)। यह अभी एक बहुत अच्छा मनमाना राइट नहीं है, जैसा कि मैंने ऊपर कुछ कारणों से उल्लेख किया था - लेकिन मुख्य रूप से इसलिए क्योंकि मुझे अभी भी 100% यकीन नहीं है कि रीमैप किए जाने पर फ्रेम बफर के ये मान डिकोडिंग पाइपलाइन के किस चरण में होते हैं। हालाँकि, मैं राइट-अप पर काम करने के लिए यहीं रुक रहा हूँ; अगर कोई इसे आगे लेना चाहता है।
मैं, @noahhw46 (इस सेटअप @zhouwei के बिना यह संभव नहीं था), इसे समझ गया हूँ (राइट-अप जल्द आ रहा है)। हालाँकि, अभी भी बहुत कुछ समझना बाकी है। बग वास्तव में क्या करता है, यह ठीक से दिखाने के लिए मैंने यहाँ अपनी जाँच के अगले चरणों का पहला भाग जोड़ा है। check-mismatch एक और lldb स्क्रिप्ट है जिसे एक कार्यशील poc के साथ उपयोग किया जा सकता है ताकि APACChannelRemapper::Process (वास्तव में APACHOADecoder::DecodeAPACFrame में) में mRemappingArray और परम्यूटेशन मैप के बीच बनाए गए मिसमैच को ठीक से दिखाया जा सके।
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 आउट-ऑफ-बाउंड्स पढ़ेगा और फिर लिखेगा।
यदि आप Xcode में Guard Malloc सक्षम करते हैं तो आप पहला आउट-ऑफ-बाउंड्स रीड देख सकते हैं:
Guard Malloc के बिना, APACHOADecoder::DecodeAPACFrame बाद में एक अमान्य memmove के साथ क्रैश करेगा:
@zhuowei का पिछला README नीचे है:
iOS 18.4.1 में CoreAudio पैच (CVE-2025-31200) को समझने की कोशिश कर रहा हूँ।
मैंने अभी तक इसका पता नहीं लगाया है।
वर्तमान में, macOS 15.4.1 पर output.mp4 डिकोड करते समय मुझे अलग-अलग त्रुटि संदेश मिलते हैं:
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
बनाम visionOS 2.2 के लिए Xcode Simulator:
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
इसलिए मैं नए चेक से टकरा रहा हूँ, लेकिन मुझे नहीं पता कि इसे वास्तव में कुछ ओवरराइट करने के लिए कैसे लाया जाए।
परिवर्तित फ़ंक्शन लगता है /System/Library/Frameworks/AudioToolbox.framework/AudioCodecs में apac::hoa::CodecConfig::Deserialize है।
APAC Apple Positional Audio Codec है।
HOA Higher-order Ambisonics है।
यदि आप ffmpeg issue tracker से एक नमूना फ़ाइल देखें:
$ 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)
आप afconvert -o sound440.m4a -d apac -f mp4f sound440hz.wav के साथ APAC में कन्वर्ट कर सकते हैं।
iOS 18.4.1 बनाम 18.4 पर bindiff का उपयोग करने पर, ऐसा लगता है कि mRemappingArray को पढ़ना अब चैनलों की संख्या के लिए ऑफसेट 0x58 पर वैश्विक AudioChannelLayout* की जाँच करता है, न कि ऑफसेट 0x78 पर रीमैपिंग AudioChannelLayout* की।
encodeme.mm फ़ाइल APAC एन्कोड करती है, और एक LLDB स्क्रिप्ट mRemappingArray और रीमैपिंग AudioChannelLayout में अतिरिक्त तत्वों को बलपूर्वक डालती है:
./build_encodeme.sh
./run_encodeme.sh