// aud.hoa · AudioToolbox / AudioToolboxCore · HOASpatialDecoder · CVE-2026-112546 // HOA spatial decoder reachability probe // C twin of the Swift POC: dlopens the audio frameworks, dlsyms the decoder symbols, // then drives AudioConverterNew with the HOA format id. // Build: clang -O2 -o cve-2026-112546 CVE-2026-112546.c -framework AudioToolbox -framework CoreFoundation // Run: ./cve-2026-112546 #include #include #include #include static void probe(const char *lib, const char **symbols, int n) { void *h = dlopen(lib, RTLD_NOW); if (!h) { printf("x %s (%s)\n", lib, dlerror() ? dlerror() : "dlopen failed"); return; } printf("ok %s\n", lib); for (int i = 0; i < n; i++) { printf(" %s: %s\n", symbols[i], dlsym(h, symbols[i]) ? "resolved" : "missing"); } } static void audio_converter(uint32_t format, double rate, uint32_t channels) { AudioStreamBasicDescription in = {0}; in.mSampleRate = rate; in.mFormatID = format; in.mFramesPerPacket = 1; in.mChannelsPerFrame = channels; AudioStreamBasicDescription out = {0}; out.mSampleRate = rate; out.mFormatID = kAudioFormatLinearPCM; out.mFormatFlags = kAudioFormatFlagIsFloat | kAudioFormatFlagIsPacked; out.mBytesPerPacket = 4; out.mFramesPerPacket = 1; out.mBytesPerFrame = 4; out.mChannelsPerFrame = 1; out.mBitsPerChannel = 32; AudioConverterRef c = NULL; OSStatus st = AudioConverterNew(&in, &out, &c); if (c) AudioConverterDispose(c); char four[5] = {0}; for (int i = 0; i < 4; i++) { uint8_t b = (uint8_t)(format >> (24 - 8 * i)); four[i] = (b >= 0x20 && b < 0x7f) ? (char)b : '?'; } printf("AudioConverterNew('%s', %.0f Hz, %u ch) = %d\n", four, rate, channels, (int)st); } int main(void) { const char *syms[] = {"HOASpatialDecoder", "APACHOADecoder", "UniDrcSelection", "mpddrc"}; probe("/System/Library/Frameworks/AudioToolbox.framework/AudioToolbox", syms, 4); probe("/System/Library/PrivateFrameworks/AudioToolboxCore.framework/AudioToolboxCore", syms, 4); probe("/System/Library/Frameworks/AudioToolbox.framework/AudioCodecs", syms, 4); audio_converter(0x6D686D31, 48000, 4); // 'mhm1' HOA printf("CVE-2026-112546 · HOA decoder path probed\n"); return 0; }