你的 Mac 在任何时刻都运行着数百个进程。绝大多数是合法的系统服务和你自己安装的应用。但只要有一个流氓进程——未签名、从异常路径运行、或悄悄发起网络连接——就可能危及整台机器的安全。学会区分正常的系统守护进程和可疑入侵者,是 macOS 用户最实用的安全技能之一。
快速结论
检测 macOS 上的可疑进程,核心方法是:用 codesign -dvvv 检查代码签名是否缺失或无效,用 spctl --assess 验证 Gatekeeper 审批状态,同时审查每个进程的启动路径、父进程、网络活动和权限声明。凡是从 /tmp、/var/folders 或其他用户可写位置运行、且缺少 Apple 或开发者签名的进程,都值得立即调查。
危险信号:可疑进程的特征
不是每个陌生进程都是恶意软件,但以下模式应引起警惕:
- 缺少代码签名或仅有临时签名。 合法的 macOS 应用由 Apple 或已识别的开发者签名。一个未签名的二进制文件持续运行,本身就是危险信号。
- 启动路径位于临时或隐藏目录。 从
/tmp、/private/var、/var/folders或以点开头的目录(.hidden/)运行的进程需要重点排查。合法应用通常位于/Applications、/System或/usr。 - 异常的父进程。 一个由
bash启动的curl或python3进程,而该bash又是在登录时由launchd启动的——如果你不认识对应的 LaunchAgent,就要警惕。 - 意外的出站网络连接。 一个你不认识的进程正在连接陌生 IP 地址,特别是使用非标准端口时,务必调查。
- 资源占用异常且无明确用途。 挖矿程序和数据窃取工具往往表现为持续的 CPU 或网络 I/O 占用,与你当前的操作毫无关联。
- 权限声明缺失或过于宽泛。 一个简单的工具声称需要
com.apple.security.cs.disable-library-validation或com.apple.security.cs.allow-unsigned-executable-memory权限,极不寻常。
逐步排查:调查可疑进程
当你在进程列表中发现可疑条目时,按以下步骤系统性地排查。
1. 验证代码签名
这是最关键的单项检查。对可疑二进制文件运行 codesign:
codesign -dvvv /path/to/suspicious-binary
重点查看 Authority(签名机构)链。正常的应用会显示类似:
Authority=Developer ID Application: Company Name (TEAMID)
Authority=Developer ID Certification Authority
Authority=Apple Root CA
如果看到 code object is not signed at all(未签名)或签名链缺失,说明该二进制文件从未经过已识别开发者的签名。
2. 检查 Gatekeeper 和公证状态
Apple 的 Gatekeeper 会验证软件是否经过公证——即提交给 Apple 进行自动化恶意软件扫描:
spctl --assess --verbose /path/to/suspicious-binary
经过公证的应用返回 accepted, source=Notarized Developer ID。其他结果意味着该二进制文件绕过或早于 Apple 的公证要求。
3. 检查启动路径和参数
找到进程二进制文件的实际位置:
ps -eo pid,comm,args | grep <进程名>
合法的系统进程运行于 /usr/libexec、/System/Library 或 /Applications。如果一个名为 com.apple.something 的进程实际从 /Users/你的用户名/Library/LaunchAgents/ 加载,二进制文件却在 /tmp 中,它就是在伪装系统服务。
4. 排查持久化机制
恶意软件通常会安装 LaunchAgent 或 LaunchDaemon 以在重启后存活:
# 用户级持久化
ls ~/Library/LaunchAgents/
# 系统级持久化
ls /Library/LaunchDaemons/
ls /Library/LaunchAgents/
打开你不认识的 .plist 文件,检查 ProgramArguments 键以确认它实际启动的是哪个二进制文件。
5. 检查网络连接
查看该进程正在与谁通信:
lsof -i -n -P | grep <PID>
留意与陌生 IP 的连接,特别是使用 4444、8080 等非标准端口的——这些是 C2(命令与控制)服务器常用的端口。
6. 审查权限声明(Entitlements)
权限声明定义了进程可以访问哪些系统资源:
codesign -d --entitlements - /path/to/binary
一个合法的 PDF 阅读器不应该需要 com.apple.security.device.camera 或 com.apple.security.network.server 权限。
常见的”看起来可疑”的合法进程
在恐慌之前,先对照这张表。以下 Apple 系统进程经常让用户产生误解:
| 进程名 | 实际功能 |
|---|---|
kernel_task | macOS 内核;高 CPU 通常意味着热节流,而非恶意软件 |
mds / mds_stores | Spotlight 索引引擎;安装应用或复制文件后会出现峰值 |
WindowServer | 整个 GUI 的合成器;高 CPU 通常与显示缩放问题有关 |
nsurlsessiond | App Store 更新和 iCloud 同步的后台下载 |
trustd | 证书和信任评估守护进程 |
syspolicyd | Gatekeeper 策略执行服务 |
cloudd | iCloud Drive 同步守护进程 |
bird | iCloud 文档同步辅助进程 |
mediaanalysisd | 照片应用的机器学习处理(人脸/物体识别) |
suggestd | Siri 建议和 Spotlight 知识索引 |
如果以上进程具有有效的 Apple 签名且运行于 /usr/libexec 或 /System/Library,几乎可以确定是合法的。
进程安全审计工具
活动监视器
活动监视器可以显示 CPU、内存和基本进程信息,但无法展示代码签名、权限声明、父子进程树或有意义的启动路径。在安全排查场景下,它充其量只是一个起点。
终端工具:codesign 与 spctl
codesign 和 spctl 命令行工具是签名和公证验证的权威手段。它们不可或缺,但当你需要审计数十个进程时就显得笨拙——每次都需要手动找到二进制文件路径。
ProcXray
ProcXray 将代码签名验证和权限声明检查直接集成到进程监控界面中。对于每个运行中的进程,你可以看到:
- 签名状态一目了然 — 已签名、未签名或签名无效,无需运行终端命令。
- 完整的权限声明列表 — 检查每个进程声称的系统能力。
- 进程树视图 — 立即追溯是哪个父进程启动了可疑的子进程。
- 启动路径和参数 — 清楚看到二进制文件的位置以及它是如何被调用的。
相比手动对每个二进制文件运行 codesign -dvvv,ProcXray 实时呈现每个进程的安全上下文。当你发现未签名或从意外位置运行的进程时,无需切换到终端,即可在同一界面中调查其血缘关系和网络行为。
常见问题(FAQ)
如何判断一个进程是恶意软件还是合法的系统服务?
检查三个要素:(1)代码签名——运行 codesign -dvvv,查看是否有 Apple 或已识别开发者的签名链;(2)启动路径——合法服务运行于 /System 或 /usr/libexec,而非 /tmp 或隐藏目录;(3)持久化——检查 ~/Library/LaunchAgents 和 /Library/LaunchDaemons 中是否有指向该二进制文件的陌生 plist 文件。
恶意软件能否在活动监视器中隐身?
可以。Rootkit 能够通过挂钩系统调用来对用户态工具隐藏进程。macOS 的系统完整性保护(SIP)大幅增加了这一难度——如果 SIP 处于启用状态(通过 csrutil status 查看),现代 macOS 上的内核级隐藏会被阻止。但恶意软件仍然可以通过使用合法名称或注入已签名进程来进行伪装。
Gatekeeper 能防御所有恶意软件吗?
不能。Gatekeeper 和公证机制提供了强有力的第一层防护——它们默认阻止未签名和未公证的软件运行。但如果用户主动绕过 Gatekeeper(右键 > 打开),或者恶意软件通过已运行的进程投递(例如浏览器漏洞利用),Gatekeeper 就会失效。纵深防御——检查签名、监控进程行为、审计持久化机制——始终不可或缺。
参考资料
- Apple: 关于 Gatekeeper
- Apple: 分发前公证 macOS 软件
- Apple: 系统完整性保护
- Apple:
codesign文档 - Apple:
spctl文档 - Apple: Entitlements 权限声明文档
下载 ProcXray → — 内置代码签名验证,支持 macOS Sonoma+。