如何绕过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),但允许通过具体名称注册单个通知。因此可以:

  1. 先在非沙箱环境中捕获所有通知名称
  2. 在沙箱中逐个注册这些特定名称的通知

示例代码监听下载完成通知:

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名称和路径信息

技术限制

虽然可以获取这些通知信息,但沙箱的其他限制仍然有效:

  • 无法直接读取下载的文件内容
  • 只能获取通知中明确包含的信息
  • 需要预先知道要监听的具体通知名称

防御建议

针对此问题的防御措施包括:

  1. 苹果应加强沙箱限制,防止通过名称逐个注册通知
  2. 对敏感通知增加权限控制
  3. 减少通知中包含的敏感信息
  4. 提供用户可控的通知权限管理

总结

这一技术展示了macOS沙箱机制中的一个重要隐私漏洞,允许沙箱应用绕过设计限制,监控用户活动和系统状态。虽然不构成直接的安全威胁,但确实违反了沙箱的核心设计原则,可能被恶意软件利用进行用户行为分析。

绕过Mojave沙箱限制的技术分析 概述 本文详细介绍了macOS Mojave系统中沙箱限制的一个隐私问题,尽管苹果公司已尝试解决,但沙箱应用程序仍能通过这些技术暗中监视用户。该技术甚至能在最新版本的macOS系统上使用。 背景知识 沙箱机制 macOS沙箱是一种安全机制,旨在限制应用程序的权限和能力,防止其: 任意访问用户文件(如图片或下载文件) 捕获用户键盘输入信息 破坏操作系统 分布式通知 macOS允许应用或系统组件通过 DistributedNotificationCenter 类"跨越任务边界"广播通知。这些通知被称为"分布式通知",是系统各组件间通信的重要机制。 要全局注册接收所有分布式通知,可调用 CFNotificationCenterAddObserver 函数,将 name 参数设为 nil : 沙箱限制与绕过技术 苹果的限制措施 苹果意识到沙箱应用不应接收全局分布式通知,因此当沙箱应用尝试注册全局监听器时,系统会阻止: 绕过方法 虽然苹果阻止了全局注册( name 参数为 nil ),但允许通过具体名称注册单个通知。因此可以: 先在非沙箱环境中捕获所有通知名称 在沙箱中逐个注册这些特定名称的通知 示例代码监听下载完成通知: 可监控的系统事件 通过此方法可监控多种系统事件,包括但不限于: 用户活动监控 下载文件 : 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沙箱机制中的一个重要隐私漏洞,允许沙箱应用绕过设计限制,监控用户活动和系统状态。虽然不构成直接的安全威胁,但确实违反了沙箱的核心设计原则,可能被恶意软件利用进行用户行为分析。