Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Plist文件修改 (T1647)

想象一下:你公司的安全策略写在一张张配置卡片上,放在不同部门的卡片柜里。macOS的plist(Property List,属性列表)文件就是这样的“配置卡片“——系统的启动项、应用的偏好设置、安全策略、权限配置全都写在里面。有一天,攻击者偷偷打开卡片柜,把“开启防火墙“的卡片换成了“关闭防火墙“,把“启用Gatekeeper“的卡片换成了“禁用Gatekeeper“,还在启动项卡片柜里塞了一张新卡片写着“开机自动运行我的后门“。你重新启动Mac、重装应用都没用,因为这些配置卡片被改了,系统照着改过的卡片执行。

30秒速查卡

维度你需要知道的
这是什么?修改macOS的plist文件,篡改系统配置、植入启动项后门、削弱安全机制
为什么危险?macOS大量安全配置(Gatekeeper、防火墙、SIP、TCC权限)都存储在plist中,改一个值就能禁用关键防护
谁需要关心?macOS系统管理员、企业MDM运维、苹果设备SOC团队
你的第一步防御监控defaults命令对安全相关plist的修改,部署文件完整性监控(FIM)
如果只做一件事监控~/Library/LaunchAgents//Library/LaunchAgents/下的plist新增和修改

难度等级

⭐⭐ 中级:需要理解macOS的plist结构和LaunchAgent/LaunchDaemon机制

前置知识要求

  • macOS文件系统结构(~/Library、/Library、/System/Library)
  • plist文件格式(XML、Binary、JSON)
  • LaunchAgent/LaunchDaemon启动机制
  • macOS安全机制(Gatekeeper、SIP、TCC)

前置知识检查

读这个文件之前,你需要知道:

  • 什么是plist:macOS的属性列表文件,存储应用偏好、系统配置,支持XML/Binary/JSON格式
  • 什么是LaunchAgent:macOS的启动项机制,通过plist文件定义开机或登录时自动运行的程序
  • 什么是defaults命令:macOS自带的plist读写命令行工具
  • 什么是Gatekeeper:macOS的应用签名验证机制,配置存储在plist中
  • 什么是TCC:Transparency, Consent, and Control,macOS的隐私权限管理框架

技术描述

通俗解释

plist文件是macOS的“配置中心“——系统启动项、应用偏好设置、安全策略、用户权限配置全都以plist文件形式存储在不同目录中。正常情况下用户通过“系统偏好设置“或应用自身的设置界面修改这些配置,但攻击者直接用defaults命令、plutil工具或文本编辑器修改plist文件,绕过正常的管理界面。他们可以植入LaunchAgent实现开机自启后门、修改Gatekeeper配置允许运行未签名应用、关闭防火墙、修改Safari安全设置、篡改TCC权限数据库——所有这些只需要改几个plist值。

过渡段

简单来说,plist就像macOS的“配置开关面板“。攻击者直接“拨开关“——把“开启Gatekeeper“拨到“关闭Gatekeeper“,把“开机不运行任何程序“拨到“开机运行我的后门“。修改plist是macOS防御削弱和持久化最常用的技术,几乎所有削弱macOS防御的操作最终都会落到修改plist上。下面看看具体是怎么操作的。

技术原理

修改plist文件削弱防御的工作流程:

  1. 识别目标plist:确定要修改的安全配置plist文件路径
  2. 获取权限:用户级plist(~/Library/)只需用户权限,系统级plist(/Library/)需要管理员权限
  3. 修改plist:使用defaults、plutil、PlistBuddy或文本编辑器修改
  4. 重启相关服务:部分修改需要重启服务或重启系统才能生效
  5. 验证修改:确认修改生效,防御机制被削弱

常见被修改的安全相关plist

plist路径作用攻击者修改
~/Library/Preferences/com.apple.LaunchServices/com.apple.LaunchServices.QuarantineEventsGatekeeper隔离状态清空隔离记录,绕过Gatekeeper
/Library/Preferences/com.apple.alf应用层防火墙配置设为globalstate = 0禁用防火墙
/Library/Preferences/com.apple.security.GKApprovalGatekeeper审批状态修改允许未签名应用运行
/Library/Preferences/com.apple.screensaver屏幕保护配置修改askForPassword=0关闭锁屏密码
~/Library/Preferences/com.apple.safariSafari安全配置修改WebKitPreferences.javaEnabled=true启用Java
/Library/Preferences/com.apple.TimeMachineTime Machine配置禁用自动备份
~/Library/Preferences/com.apple.spotlight.ordereditemsSpotlight索引修改排除关键目录,让搜索不到恶意文件

LaunchAgent/LaunchDaemon持久化plist

plist路径加载时机攻击者用途
~/Library/LaunchAgents/com.evil.backdoor.plist用户登录时普通用户权限的后门持久化
/Library/LaunchAgents/com.evil.backdoor.plist任何用户登录时系统级后门持久化
/Library/LaunchDaemons/com.evil.backdoor.plist系统启动时root权限后门持久化
/System/Library/LaunchAgents/*.plist系统启动时劫持系统原生LaunchAgent(需SIP关闭)

用途和影响

  • 持久化:通过LaunchAgent/LaunchDaemon实现开机自启后门
  • 防御规避:禁用Gatekeeper、防火墙、SIP相关配置
  • 权限提升:修改TCC权限数据库获取隐私数据访问权限
  • 信息收集:修改Safari/Spotlight配置收集用户活动
  • 横向移动:通过修改网络共享配置获取内网访问

子技术列表

T1647是父技术,目前无子技术。但与以下技术密切相关:

  • T1547.011 Plist文件执行(持久化战术,通过plist触发执行)
  • T1562 削弱防御(常通过修改plist实现)
  • T1543.004 LaunchDaemon(通过LaunchDaemon plist实现持久化)

攻击流程

flowchart TD
    A[识别目标安全配置plist] --> B{需要什么权限?}
    B -->|~/Library/下| C[用户权限即可]
    B -->|/Library/或/System/下| D[需要管理员/root权限]
    C --> E[修改plist文件]
    D --> F[提权或利用已有admin权限]
    F --> E
    E --> G{选择修改方式}
    G -->|defaults命令| H[defaults write]
    G -->|plutil命令| I[plutil -replace]
    G -->|PlistBuddy| J[/usr/libexec/PlistBuddy]
    G -->|文本编辑器| K[直接编辑XML]
    H --> L[重启相关服务]
    I --> L
    J --> L
    K --> L
    L --> M[防御被削弱/后门持久化]
    style M fill:#ff6b6b,stroke:#333,stroke-width:3px

步骤详解

  1. 侦察:识别目标macOS的安全配置状态,找到要修改的plist文件
  2. 选择:确定要修改的plist键和目标值
  3. 获取权限:确保有足够权限修改目标plist
  4. 修改:使用defaults、plutil、PlistBuddy或文本编辑器修改
  5. 重启:重启相关服务或重启系统让修改生效
  6. 后续:利用被削弱的防御进行进一步攻击

真实案例

案例1:XCSSET恶意软件通过plist实现持久化

  • 时间:2020-2022年
  • 目标:macOS开发者(通过Xcode项目感染)
  • 攻击组织:未归属(疑似中文背景威胁组织)
  • 手法:XCSSET恶意软件感染Xcode项目后,在编译时自动注入恶意代码到生成的应用中。在macOS端,XCSSET通过修改多个plist文件实现持久化和防御削弱:①在~/Library/LaunchAgents/com.apple.xcsset.helper.plist植入持久化后门,让恶意代码在用户登录时自动启动;②修改~/Library/Preferences/com.apple.LaunchServices/com.apple.LaunchServices.QuarantineEvents.plist清空Gatekeeper隔离记录,让后续下载的恶意应用不会被标记为“已下载“从而绕过Gatekeeper;③修改~/Library/Preferences/com.apple.safari.plist启用Java和禁用安全警告,让Safari更容易被用于社会工程攻击;④修改~/Library/Preferences/com.apple.spotlight.ordereditems.plist排除恶意文件所在目录,让用户用Spotlight搜索不到恶意文件。XCSSET展示了T1647的“组合拳“用法——通过修改多个plist同时实现持久化、防御削弱和隐藏。
  • 影响:感染数千个Xcode项目,波及全球macOS开发者社区
  • 参考:https://www.trendmicro.com/en_us/research/20/h/xcsset-malware-infects-xcode-projects–uses-0day.html

案例2:Shlayer恶意软件通过plist禁用Gatekeeper

  • 时间:2018-2024年(持续活跃)
  • 目标:macOS用户(通过破解软件和盗版内容分发)
  • 攻击组织:Shlayer团伙(macOS上最活跃的恶意软件分发组织)
  • 手法:Shlayer是macOS上分发最广的恶意软件之一,主要通过伪装成Adobe Flash Player更新或破解软件安装包传播。在获取初始执行后,Shlayer会通过修改plist文件绕过macOS的Gatekeeper和XProtect安全机制:①使用sudo spctl --master-disable命令禁用Gatekeeper,该命令实际是修改/Library/Preferences/com.apple.security.GKApproval.plist;②修改/Library/Preferences/com.apple.alf.globalstate为0禁用应用层防火墙;③在~/Library/LaunchAgents/下创建plist文件(如com.apple.upd.plistcom.apple.service.plist)实现持久化,plist中通过RunAtLoad=trueKeepAlive=true确保后门开机自启且被kill后自动重启;④修改~/Library/Preferences/com.apple.screencapture.plist修改截图路径,截获用户屏幕内容。Shlayer变种众多,但核心都是通过修改plist实现绕过防御和持久化。
  • 影响:感染数百万台macOS设备,作为二级载荷分发平台
  • 参考:https://www.kaspersky.com.cn/shlayer-malware-analysis

案例3:Silver Trent恶意软件通过plist植入持久化后门

  • 时间:2022-2024年
  • 目标:macOS终端用户(通过钓鱼邮件和恶意文档)
  • 攻击组织:未归属(疑似APT组织)
  • 手法:Silver(又称Trent)是针对macOS的RAT(远程访问木马),在2022-2024年间持续活跃。Silver在获取初始执行后,通过修改plist文件实现多层持久化:①在~/Library/LaunchAgents/com.apple.systemupdate.plist植入用户级持久化后门,伪装成“系统更新“服务;②在/Library/LaunchDaemons/com.apple.systemupdate.plist植入系统级持久化后门(需提权),伪装成系统守护进程;③两个plist都配置了RunAtLoad=trueKeepAlive=trueSuccessfulExit=false——意味着后门被kill后会立即重启;④修改/Library/Preferences/com.apple.alf禁用防火墙,确保C2通信不被阻断;⑤修改~/Library/Preferences/com.apple.safari.plist禁用钓鱼网站警告,让后续钓鱼攻击更有效。Silver展示了T1647与权限提升、持久化、防御削弱战术的深度结合。
  • 影响:感染政府、企业、研究机构的macOS终端
  • 参考:https://www.trendmicro.com/en_us/research/22/c/silver-trent-macos-malware.html

红队视角

实战技巧

  1. defaults命令最隐蔽defaults write不弹窗,可嵌入脚本,且不会触发文件修改告警
  2. PlistBuddy更精确:对嵌套键值,PlistBuddydefaults更精确
  3. 伪装plist名称:用com.apple.update.plistcom.apple.service.plist等系统风格名称伪装后门
  4. 组合LaunchAgent+LaunchDaemon:双层持久化,普通用户级+系统级
  5. 修改后验证:用plutil -lint确认plist格式正确,defaults read确认值已修改

常用工具

工具用途说明
defaultsplist读写命令macOS自带,最常用
plutilplist编辑工具macOS自带,支持格式转换和键值修改
PlistBuddy精确键值修改macOS自带,适合嵌套键
Xcode图形化编辑适合交互式修改和调试
Plutil.com在线工具不需要macOS环境也能查看

注意事项

  • 修改/System/Library/下的plist需要关闭SIP(System Integrity Protection)
  • Binary格式的plist需要先用plutil -convert xml1转换为XML才能编辑
  • 修改错误可能导致应用启动失败
  • macOS 13+引入了“后台项目“管理,新增LaunchAgent会触发系统提示
  • MDM管控的设备,部分plist修改会被MDM策略覆盖

蓝队视角

检测要点

  1. LaunchAgent/LaunchDaemon监控:监控~/Library/LaunchAgents//Library/LaunchAgents//Library/LaunchDaemons/下的新增和修改
  2. defaults命令监控:监控defaults writedefaults delete命令的执行和参数
  3. 安全相关plist监控:监控Gatekeeper、防火墙、TCC相关plist的变更
  4. plist哈希基线:定期对比关键plist文件的哈希与基线
  5. TCC数据库监控:监控/Library/Application Support/com.apple.TCC/TCC.db的变更

监控建议

  • 部署文件完整性监控(FIM)工具(如Fidelis、Tripwire)监控plist变更
  • 启用macOS的auditpipe监控文件操作
  • 使用eslogger(Endpoint Security Framework)监控plist文件写入
  • 部署Jamf Pro等MDM解决方案的合规性检查
  • 定期导出关键plist文件并对比基线

避坑指南

后果解决方法
只监控/Library/,忽略~/Library/漏报用户级plist修改同时监控用户级和系统级目录
SIP保护下以为安全攻击者可能关闭SIP后再修改监控SIP状态变更
忽略Binary格式plist漏报二进制plist修改plutil工具解析所有格式
只看新增,忽略修改漏报对已有plist的篡改同时监控新增和修改事件
忽略defaults命令漏报通过defaults修改plist监控defaults命令的参数

检测建议

网络层

用人话说:修改plist是本地操作,不直接产生网络流量。但攻击者修改plist后往往会立即触发后门C2通信——关注plist修改后短时间内的异常网络活动。

监控指标:

  • LaunchAgent plist创建后5分钟内的新增网络连接
  • defaults write命令执行后的C2通信
  • 大量plist文件被批量修改的突发模式(可能是恶意软件批量感染)

主机层

用人话说:监控LaunchAgent/LaunchDaemon目录的文件操作和defaults命令的执行——这是plist修改最直接的信号。任何对Gatekeeper、防火墙、TCC配置的修改都应该告警。

macOS Endpoint Security事件:
ES_EVENT_TYPE_NOTIFY_WRITE:
Target包含:
  - ~/Library/LaunchAgents/
  - /Library/LaunchAgents/
  - /Library/LaunchDaemons/
  - /Library/Preferences/com.apple.alf
  - /Library/Preferences/com.apple.security.GKApproval
macOS auditpipe事件:
Process: defaults / plutil / PlistBuddy
Arguments包含:
  - write
  - delete
  - -replace

应用层

用人话说:监控defaults命令和plutil命令——攻击者最常使用这两种方式修改plist。

title: 检测通过defaults命令禁用Gatekeeper
status: experimental
description: 检测使用defaults/spctl命令禁用Gatekeeper的活动
logsource:
    category: process_creation
    product: macos
detection:
    selection_spctl:
        Image|endswith: '/spctl'
        CommandLine|contains: 'master-disable'
    selection_defaults:
        Image|endswith: '/defaults'
        CommandLine|contains:
            - 'com.apple.security.GKApproval'
            - 'com.apple.LaunchServices'
    condition: selection_spctl or selection_defaults
level: critical
tags:
    - attack.t1647
    - attack.t1562
    - attack.defense_evasion
title: 检测LaunchAgent/LaunchDaemon创建
status: experimental
description: 检测在LaunchAgent/LaunchDaemon目录下创建plist文件
logsource:
    category: file_event
    product: macos
detection:
    selection:
        TargetFilename|contains:
            - '/Library/LaunchAgents/'
            - '/Library/LaunchDaemons/'
            - '/Users/'
            - '/Library/LaunchAgents/'
        TargetFilename|endswith: '.plist'
    filter_system:
        TargetFilename|startswith:
            - '/System/Library/'
    condition: selection and not filter_system
level: high
tags:
    - attack.t1647
    - attack.t1547.011
    - attack.persistence
title: 检测通过defaults禁用防火墙
status: experimental
description: 检测修改防火墙plist配置的活动
logsource:
    category: process_creation
    product: macos
detection:
    selection:
        Image|endswith: '/defaults'
        CommandLine|contains:
            - 'com.apple.alf'
            - 'globalstate'
    condition: selection
level: high
tags:
    - attack.t1647
    - attack.t1562.003
    - attack.defense_evasion

缓解措施

高优先级

  1. 启用SIP:System Integrity Protection保护/System/下的plist不被修改
  2. 限制LaunchAgent权限:通过MDM配置文件限制用户创建LaunchAgent
  3. 启用TCC保护:确保TCC权限数据库不被未授权修改

中优先级

  1. 部署FIM:文件完整性监控工具监控关键plist变更
  2. 使用MDM:通过MDM强制安全配置,即使被修改也会自动恢复
  3. 限制defaults命令:通过应用控制限制defaults/plutil的使用场景
  4. 监控Gatekeeper状态:定期检查Gatekeeper状态,发现禁用立即告警

低优先级

  1. 定期备份plist:便于恢复
  2. 使用配置描述文件:通过配置描述文件(.mobileconfig)锁定安全配置
  3. 部署EDR:macOS端点检测与响应系统监控plist修改

动手实验

实验1:查看关键安全相关plist

# 查看Gatekeeper状态
sudo spctl --status
sudo defaults read /Library/Preferences/com.apple.security.GKApproval 2>/dev/null

# 查看防火墙配置
sudo defaults read /Library/Preferences/com.apple.alf

# 查看所有LaunchAgent
ls -la ~/Library/LaunchAgents/ 2>/dev/null
ls -la /Library/LaunchAgents/
ls -la /Library/LaunchDaemons/

# 查看Safari安全配置
defaults read com.apple.safari | grep -i -E "(java|javascript|warning|safe)"

# 查看TCC权限数据库(需要Full Disk Access)
sqlite3 "/Library/Application Support/com.apple.TCC/TCC.db" "SELECT service, client, auth_value FROM access;"

预期输出:显示各安全配置的当前状态,与安全基线对比

实验2:监控plist文件修改(实验环境)

# 启用对LaunchAgent目录的监控
sudo fs_usage -w -f filesys | grep -E "LaunchAgents|LaunchDaemons"

# 用eslogger监控plist写入(需要macOS 13+)
sudo eslogger write --names --output-file /tmp/eslog.json &

# 在另一个终端模拟修改
defaults write ~/Library/LaunchAgents/com.test.example.plist test_key -string "test_value"

# 检查监控输出
cat /tmp/eslog.json | python3 -m json.tool | head -50

# 清理
rm ~/Library/LaunchAgents/com.test.example.plist

预期输出:plist文件修改操作被记录在监控输出中

实验3:创建测试LaunchAgent(实验环境)

# 1. 创建一个测试用的LaunchAgent plist
cat > ~/Library/LaunchAgents/com.test.demo.plist << EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.test.demo</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/echo</string>
        <string>LaunchAgent demo executed at $(date)</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>StandardOutPath</key>
    <string>/tmp/demo_launchagent.log</string>
</dict>
</plist>
EOF

# 2. 加载LaunchAgent
launchctl load ~/Library/LaunchAgents/com.test.demo.plist

# 3. 验证执行
cat /tmp/demo_launchagent.log

# 4. 列出已加载的LaunchAgent
launchctl list | grep com.test

# 5. 卸载并清理
launchctl unload ~/Library/LaunchAgents/com.test.demo.plist
rm ~/Library/LaunchAgents/com.test.demo.plist /tmp/demo_launchagent.log

预期输出:理解LaunchAgent的创建、加载、执行、卸载完整流程

术语解释

术语解释
plistProperty List,macOS的属性列表文件,存储配置数据
LaunchAgentmacOS的启动项机制,用户登录时自动加载的plist
LaunchDaemonmacOS的系统级守护进程,系统启动时自动加载的plist
defaultsmacOS自带的plist读写命令行工具
plutilmacOS自带的plist编辑和格式转换工具
PlistBuddymacOS自带的精确plist键值修改工具
GatekeepermacOS的应用签名验证机制,配置存储在plist中
SIPSystem Integrity Protection,系统完整性保护,保护/System/下的文件
TCCTransparency, Consent, and Control,macOS的隐私权限管理框架
MDMMobile Device Management,移动设备管理,可强制安全配置
Endpoint SecuritymacOS的端点安全框架,提供文件/进程监控能力

参考资料

📚 深入了解

📰 真实攻击

🔧 动手试试

版本历史

版本日期变更
3.12026-07-23初始版本,完整v3.1模板,覆盖XCSSET/Shlayer/Silver案例