如何绕过Mojave沙箱限制
字数 1480 2025-08-18 11:36:53
绕过Mojave沙箱限制的技术分析
概述
本文详细介绍了macOS Mojave系统中沙箱限制的一个隐私问题,尽管苹果公司已尝试解决,但沙箱应用程序仍能通过这些技术暗中监视用户。该技术甚至能在最新版本的macOS系统上使用。
背景知识
沙箱机制
macOS沙箱是一种安全机制,旨在限制应用程序的权限和能力,防止其:
- 任意访问用户文件(如图片或下载文件)
- 捕获用户键盘输入信息
- 破坏操作系统
分布式通知
macOS允许应用或系统组件通过DistributedNotificationCenter类"跨越任务边界"广播通知。这些通知被称为"分布式通知",是系统各组件间通信的重要机制。
要全局注册接收所有分布式通知,可调用CFNotificationCenterAddObserver函数,将name参数设为nil:
// 回调函数
static void callback(CFNotificationCenterRef center, void *observer, CFStringRef name_cf,
const void *object, CFDictionaryRef userInfo)
{
NSLog(@"event: %@", (__bridge NSString*)name_cf);
NSLog(@"user info: %@", userInfo);
NSLog(@"object: %@", (__bridge id)object);
return;
}
int main(int argc, const char * argv[])
{
// 注册分布式通知监听器
CFNotificationCenterAddObserver(CFNotificationCenterGetDistributedCenter(),
nil, callback, nil, nil,
CFNotificationSuspensionBehaviorDeliverImmediately);
[[NSRunLoop currentRunLoop] run];
return 0;
}
沙箱限制与绕过技术
苹果的限制措施
苹果意识到沙箱应用不应接收全局分布式通知,因此当沙箱应用尝试注册全局监听器时,系统会阻止:
*** attempt to register for all distributed notifications thwarted by sandboxing.
绕过方法
虽然苹果阻止了全局注册(name参数为nil),但允许通过具体名称注册单个通知。因此可以:
- 先在非沙箱环境中捕获所有通知名称
- 在沙箱中逐个注册这些特定名称的通知
示例代码监听下载完成通知:
static void callback(CFNotificationCenterRef center, void *observer, CFStringRef name_cf,
const void *object, CFDictionaryRef userInfo)
{
NSLog(@"event: %@", (__bridge NSString*)name_cf);
NSLog(@"user info: %@", userInfo);
NSLog(@"object: %@", (__bridge id)object);
return;
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
NSString* name = @"com.apple.DownloadFileFinished";
CFNotificationCenterAddObserver(CFNotificationCenterGetDistributedCenter(),
nil, callback, (CFStringRef)name, nil,
CFNotificationSuspensionBehaviorDeliverImmediately);
}
可监控的系统事件
通过此方法可监控多种系统事件,包括但不限于:
用户活动监控
- 下载文件:
com.apple.DownloadFileFinished- 包含下载文件名,即使在隐身模式下
- 应用程序使用:
com.apple.sharedfilelist.change- 可追踪最近使用的应用程序
- 文件访问:
com.apple.dt.Xcode.notification.IDEEditorCoordinatorDistributedDidCompleteNotification- 可监控Xcode中打开的文件
系统状态监控
- 屏幕锁定/解锁:
com.apple.screenIsLocked/com.apple.screenIsUnlocked - 屏幕保护程序:
com.apple.screensaver.didlaunch,com.apple.screensaver.didstart等 - 蓝牙活动:
com.apple.bluetooth.status- 包含连接的蓝牙设备信息
- HID设备连接:
com.apple.MultitouchSupport.HID.DeviceAdded - USB设备卸载:
com.apple.unmountassistant.process.start
软件安装与运行
- 新应用安装:
com.apple.LaunchServices.applicationRegistered- 包含新安装应用的bundle ID
- 内核扩展加载:
Loaded Kext Notification- 包含kext名称和路径信息
技术限制
虽然可以获取这些通知信息,但沙箱的其他限制仍然有效:
- 无法直接读取下载的文件内容
- 只能获取通知中明确包含的信息
- 需要预先知道要监听的具体通知名称
防御建议
针对此问题的防御措施包括:
- 苹果应加强沙箱限制,防止通过名称逐个注册通知
- 对敏感通知增加权限控制
- 减少通知中包含的敏感信息
- 提供用户可控的通知权限管理
总结
这一技术展示了macOS沙箱机制中的一个重要隐私漏洞,允许沙箱应用绕过设计限制,监控用户活动和系统状态。虽然不构成直接的安全威胁,但确实违反了沙箱的核心设计原则,可能被恶意软件利用进行用户行为分析。