防范macOS定时任务权限提权攻击的关键在于切断cron、launchd及脚本执行路径的提权链条,需锁定crontab权限、严格管控/etc/crontab与/etc/cron.d/、阻断launchd不当配置,并加固脚本执行环境。

防范 macOS 中的定时任务权限提权攻击,关键在于切断攻击者利用 cron、launchd 或脚本执行路径实施横向提权的链条。这类攻击常通过篡改用户级 crontab、注入恶意系统级 /etc/crontab 条目、或滥用具有高权限的 launchd plist 实现静默持久化。真实风险不来自 cron 本身,而在于配置疏漏与权限失控。
锁定 crontab 编辑与执行权限
用户级 crontab(crontab -e)虽以当前用户身份运行,但若该用户属于 admin 组且脚本中含 sudo 命令,就可能被诱导执行提权操作。
- 禁用非必要用户的 crontab 编辑权限:运行
sudo chmod 644 /usr/bin/crontab(移除 group/other 的写权限),再用sudo chown root:wheel /usr/bin/crontab确保归属正确 - 定期审计所有用户 crontab:用
for user in $(dscl . list /Users | grep -v '_'); do echo "== $user =="; sudo -u "$user" crontab -l 2>/dev/null; done扫描异常命令(如含curl | bash、sh -i、硬编码凭证等) - 禁止 crontab 调用交互式 shell:在脚本开头强制设置
export PATH="/usr/bin:/bin:/usr/sbin:/sbin",并检查是否含#!/bin/bash -e等安全 shebang
严格管控系统级定时任务入口
/etc/crontab 和 /etc/cron.d/ 是提权重灾区——任何可写入这些路径的进程,都可能以 root 身份执行任意代码。
- 确认
/etc/crontab所有者为root:wheel,权限为-rw-r--r--(644);运行ls -l /etc/crontab验证,异常则修复:sudo chown root:wheel /etc/crontab && sudo chmod 644 /etc/crontab - 清空 /etc/cron.d/ 下非 Apple 官方文件:Apple 不使用该目录,第三方工具(如 Homebrew)也不应写入;发现可疑文件立即删除并溯源
- 禁用系统级 cron 服务(除非明确需要):macOS 默认已禁用,切勿执行
sudo launchctl load -w /System/Library/LaunchDaemons/com.vix.cron.plist;若必须启用,确保其 plist 文件未被劫持(校验签名:codesign -dv /System/Library/LaunchDaemons/com.vix.cron.plist)
阻断 launchd 提权路径
相比 cron,launchd 是 macOS 更主流的调度机制,其 plist 若配置不当(如 RunAtLoad + ProgramArguments 指向用户可控脚本),极易成为提权跳板。
- 扫描用户级 launchd 任务:
launchctl list | grep -v "0x" | awk '{print $3}' | while read job; do launchctl print "gui/$(id -u)/$job" 2>/dev/null | grep -E "(Program|Path)"; done,重点排查ProgramArguments是否指向~/或/tmp下可写脚本 - 检查系统级 launchd 任务:
sudo launchctl list | grep -v "0x" | awk '{print $3}' | xargs -I {} sudo launchctl print system/{} 2>/dev/null | grep -A5 "ProgramArguments",确认所有路径均属/usr、/System等 SIP 保护区域 - 对所有自定义 plist 启用
EnableTransactions并设置AbandonProcessGroup,防止子进程逃逸;同时避免使用StandardOutPath指向用户目录(可能被覆盖写入)
加固脚本与环境执行链
即使定时任务本身无漏洞,执行环境若被污染,仍可被利用。攻击者常通过篡改 PATH、LD_LIBRARY_PATH 或注入 dylib 实现劫持。
- 所有定时脚本第一行必须显式声明解释器且使用绝对路径:
#!/usr/bin/env python3不安全,应改为#!/usr/bin/python3;PHP/Node.js 同理 - 脚本内禁用动态加载:Python 脚本添加
import sys; sys.path = ["/usr/local/lib/python3.x"];Shell 脚本开头加unset LD_LIBRARY_PATH DYLD_LIBRARY_PATH - 为关键脚本启用 Gatekeeper 验证:运行
xattr -w com.apple.quarantine "0081;$(date +%s);MacOS;$(uuidgen)" /path/to/script.sh可强制触发公证检查(仅限已签名脚本)


















