macos系统级权限变动虽无实时告警,但可通过终端命令主动捕获tcc授权、文件权限及服务开关三类变更:利用unified logging查chmod/chown/tccutil记录,stat和sqlite3比对tcc.db时间戳与内容差异,并脚本化巡检全盘访问、辅助功能等高风险权限状态。

查看 Unified Logging 中的敏感命令执行记录
系统会将带提权行为的权限相关命令写入统一日志,只要未被手动清空且保留期足够,就能回溯:运行以下命令,查找最近 7 天内涉及权限变更的操作:
log show --predicate 'eventMessage contains "chmod" or eventMessage contains "chown" or eventMessage contains "tccutil"' --last 7d
若想进一步聚焦 root 用户行为,可追加过滤:
log show --predicate 'eventMessage contains "tccutil"' --last 7d --info | grep "root"
注意:普通用户直接运行 chmod(未用 sudo)通常不会被记录;只有触发权限提升的动作才会留痕。
监控 TCC 数据库的修改时间与内容差异
定位、麦克风、辅助功能等授权由 /Library/Application Support/com.apple.TCC/TCC.db 统一管理。虽然无法精确到“谁在几点改了哪个 App”,但能通过时间戳+导出比对发现异常变动:检查数据库最后修改时间:
stat /Library/Application\ Support/com.apple.TCC/TCC.db
导出当前全部授权项(需管理员权限):
sudo sqlite3 "/Library/Application Support/com.apple.TCC/TCC.db" "SELECT service, client, allowed FROM access ORDER BY service, client;" > tcc_now.txt
过一段时间再导出一次(如一天后),用 diff 比较:
diff tcc_before.txt tcc_now.txt
常见 service 值包括:kTCCServiceAccessibility(辅助功能)、kTCCServiceMicrophone(麦克风)、kTCCServiceSystemPolicyAllFiles(全盘访问)。
定期快照高风险权限开关状态
有些权限(如全盘访问、辅助功能)虽无直接日志,但其启用列表可被脚本化抓取,适合做基线巡检:列出当前拥有全盘访问权限的应用:
sudo sqlite3 "/Library/Application Support/com.apple.TCC/TCC.db" 'SELECT client FROM access WHERE service = "kTCCServiceSystemPolicyAllFiles" AND allowed = 1;'
列出已启用辅助功能的应用:
sudo sqlite3 "/Library/Application Support/com.apple.TCC/TCC.db" 'SELECT client FROM access WHERE service = "kTCCServiceAccessibility" AND allowed = 1;'
可将上述命令保存为 shell 脚本,配合 launchd 每日自动运行并输出到日志文件,便于人工复核新增条目。
补充:识别非日志型权限变更的线索
某些权限变动不会进 log,但会触发系统守护进程重启或偏好设置变更,例如:
- 重置定位服务后,locationd 进程会被杀掉重建:可用 ps aux | grep locationd 查看启动时间是否异常刷新
- 辅助功能开启后,com.apple.universalaccess.plist 中的 closeViewScrollWheelToggle 等键值可能被设为 true,可用 defaults read com.apple.universalaccess 检查
- 若发现某个 App 突然能访问照片库但没弹窗,可对比其 Bundle ID 在 TCC.db 中的 allowed 字段是否从 0 变为 1











