您打开“活动监视器”是因为您的 Mac 感觉速度很慢,并且列表顶部附近有一个名为 nsurlsessiond、photoanalysisd 或 trustd 的内容。您从未安装过该名称的任何东西。快速搜索一下,就会发现论坛帖子中的答案都是自信的、矛盾的。本指南为您提供了一种可重复的方式来自行决定 - 通过四项检查将正常的 macOS 守护程序与真正值得怀疑的东西区分开来。
快速解答
Mac 上大多数命名奇怪的进程都是普通的系统服务,但仅凭名称无法告诉您一个进程是否安全。最强有力的首要检查是可执行文件所在的位置以及其代码签名是否有效并与其声称的身份一致。用户可写或临时目录中的系统探测进程、无效签名或与软件不匹配的签名者都需要进行调查。这些都是强烈的信号,而不是其本身的证据,因此父进程、持久性和行为仍然很重要。活动监视器无法显示代码签名详细信息; ProcXray 将签名信息和完整的可执行路径与正在运行的进程一起放置。
为什么光看名字并不能告诉你什么
macOS 在空闲系统上运行数百个后台进程。大多数都有简洁、无法解释的名称,因为它们从来就不打算被用户阅读——bird、secd、distnoted、rapportd、hidd。这些都没有记录在任何面向用户的 Apple 材料中,这就是为什么搜索进程名称经常会导致一个论坛帖子,其中三个人猜测,一个人建议重新安装 macOS。
更糟糕的是,名称是恶意软件可以轻松复制的唯一属性。恶意二进制文件可以将自己称为WindowServer或mdworker,并且它将以该名称显示在活动监视器中。基于名称的判断完全是倒退的:它信任攻击者完全控制的唯一领域。
下面的四项检查按照解决问题的速度排列。
检查 1:二进制文件位于何处?
这一项检查可以解决大多数情况。
macOS 将自己的可执行文件保存在少数受保护的位置。 macOS Catalina 引入了专用的只读系统卷,macOS Big Sur 添加了签名系统卷的加密保护。在正常安全配置完好无损的情况下,运行软件不能简单地将二进制文件添加到/System/。系统完整性保护还限制对其他受保护系统位置的更改。
合法系统软件的常见位置:
/System/Library/...— 框架、私有框架及其支持二进制文件/usr/libexec/— 大多数小型后台守护进程/usr/sbin/和/usr/bin/— 系统实用程序/sbin/— 核心工具,包括launchd本身/Applications/— 您或系统安装的应用程序;仅凭位置并不能使应用程序值得信赖
值得仔细观察的地点:
/tmp/、/var/tmp/、/private/tmp/— 任何合法的东西都不应该从这里长期运行~/Library/— 一些合法的助手住在这里,但大多数 Mac 广告软件也是如此/Users/Shared/— 恶意软件的通用暂存目录/usr/local/bin/和/opt/homebrew/bin/— 分别在 Intel 和 Apple 芯片上常见的 Homebrew 位置;这两种路径都不能证明二进制文件是安全的
要从 PID 中快速查看进程名称和父进程:
ps -o pid,ppid,user,comm -p <pid>
要检查它报告的命令行:
ps -ww -o pid,ppid,user,args -p <pid>
将comm,尤其是args视为线索,而不是可信来源:进程可以更改ps显示的参数,并且输出并不总是显示实际的可执行路径。在活动监视器中,双击进程并选择“打开文件和端口”可以在其打开的文件中公开可执行文件,但路径隐藏在不相关的条目中,并且在专用列中不可用。有关检查正在运行的进程的更多方法,请参阅如何在 Mac 上检查正在运行的进程。
检查 2:谁签署的?
路径告诉您文件所在的位置。代码签名工具可以单独验证签名的代码是否未被更改,并显示其签名中记录的身份。
# Verify signature integrity. No output means success.
codesign --verify --strict --verbose=2 /usr/libexec/trustd
# 显示签名详细信息。
协同设计-dvvv /usr/libexec/trustd
第一个命令执行验证; codesign -d 本身仅显示元数据。显示输出因 macOS 版本和二进制文件而异,因此请将其与路径和验证结果一起解释:
- Apple 系统代码 应成功验证并驻留在受保护的系统路径上。根据二进制文件的不同,显示内容可能会显示 Apple 权限链、Apple 标识符或平台签名属性。对于许多 Apple 系统二进制文件来说,缺少
TeamIdentifier是正常现象。 Authority=Developer ID Application: Some Company (AB12CD34EF)— 在 App Store 之外分发的第三方应用程序,使用 Apple 颁发且可以撤销的开发者 ID 进行签名。公司名称应与您认为的应用程序名称相符。Authority=Apple Mac OS Application Signing— 从 Mac App Store 安装的应用程序。
值得调查的结果包括:
- 验证失败 — 签名无效、密封组件已更改或代码不满足其自身的签名要求。
code object is not signed at all— 对于您本地构建的某些脚本或工具来说是预期的,但对于持续运行的下载应用程序来说不常见。Signature=adhoc在受保护的系统位置之外 — 对于某些本地构建的软件来说是正常的,但它不提供经过验证的开发人员身份。一些 Apple 系统代码还使用其显示类似于临时签名的签名,这就是为什么必须考虑路径和系统保护的原因。
您还可以直接询问 Gatekeeper 对应用程序包的看法:
spctl --assess --verbose=4 /Applications/SomeApp.app
accepted 和 source=Notarized Developer ID 表示 Apple 的自动公证服务扫描了提交的版本是否存在恶意组件并发出了票证。这是一个有用的信任信号,但不能保证该应用程序无害。 rejected表示该应用不满足当前正在评估的Gatekeeper策略;较旧的软件、本地版本和恶意软件都可能产生这种结果。
这里的差距是活动监视器没有公开这些。没有签名栏,没有权威字段,没有公证身份。通过苹果自己的进程查看器回答“这是苹果签署的吗”是不可能的——你必须离开它并转到终端。
检查 3:是什么启动了它?
进程的父进程告诉您它是如何存在的,这通常比进程本身提供更多信息。
ps -o pid,ppid,user,args -p <pid>
如果 PPID 是 1,则 launchd 是进程的当前父进程。它可能已将进程作为配置的作业启动,或者可能已采用其原始父进程已退出的进程。这本身并不意味着该进程将在您终止后重新启动:重新启动行为取决于 KeepAlive 和按需触发器等设置。如果您怀疑持久性,请检查可能负责的作业:
# Jobs that run as you
ls -la ~/Library/LaunchAgents/
# 为所有用户运行的作业
ls -la /库/LaunchAgents/ /库/LaunchDaemons/
苹果自己的工作位于/System/Library/LaunchAgents/和/System/Library/LaunchDaemons/,它们位于密封系统卷上。没有 /System 的 /Library/ 版本是第三方的 — 这是合法安装程序放置东西的地方,也是不需要的软件放置东西的地方。这里的 .plist 带有一个看起来随机的反向域名,指向主文件夹中的二进制文件,这是典型的广告软件模式。
作为浏览器、文档查看器进程、shell 或您最近运行的安装程序的父级是另一个值得关注的线索。
检查 4:它在做什么?
如果前三项检查与进程声称的身份一致,那么直接关注的程度就会降低,但它们并不能证明其行为是安全的。使用当前活动和持久性作为附加上下文:
- 网络连接。 与不熟悉的主机持续对话的后台守护进程值得研究。许多合法的 Apple 守护程序确实会与 Apple 服务器进行通信 —
nsurlsessiond和cloudd会持续且正常地进行通信。 - 加载的库。 受保护的系统进程从用户可写目录加载库是不寻常的,值得调查,但第三方应用程序和插件主机可能会合法加载用户安装的模块。请参阅如何在 macOS 上检查已加载的模块和库。
- 在没有触发的情况下持续使用资源。 预计在导入照片库后,
photoanalysisd会固定核心一个小时。闲置数天的 Mac 上的相同负载则不然。
最常被误认为病毒的进程
此表中的每个进程都是 macOS 的正常部分。
| 进程 | 作用 | 常见位置 |
|---|---|---|
kernel_task | 内核本身;还可以管理热负荷 | 没有路径——它是内核 |
launchd | PID 1;启动并监督所有其他服务 | /sbin/ |
WindowServer | 合成屏幕上绘制的所有内容 | /System/Library/PrivateFrameworks/ |
mds、mds_stores、mdworker | 聚光灯索引 | /System/Library/Frameworks/ |
nsurlsessiond | 应用程序和 iCloud 的后台下载和上传 | /usr/libexec/ |
trustd | 评估 TLS 连接的证书信任 | /usr/libexec/ |
syspolicyd | 网守和系统安全策略 | /usr/libexec/ |
bird | iCloud Drive 文档同步 | /usr/libexec/ |
cloudd | CloudKit — 应用程序的 iCloud 数据 | /System/Library/PrivateFrameworks/ |
secd | 钥匙串和 iCloud 钥匙串同步 | /usr/libexec/ |
photoanalysisd | 扫描您的照片库中的面孔和场景 | /System/Library/PrivateFrameworks/ |
mediaanalysisd | 实时文本和视觉查找 | /System/Library/PrivateFrameworks/ |
rapportd | 连续性、切换和通用剪贴板 | /usr/libexec/ |
sharingd | AirDrop 和共享服务 | /usr/libexec/ |
distnoted | 进程之间的分布式通知传递 | /usr/sbin/ |
coreaudiod | 音频子系统 | /usr/sbin/ |
hidd | 键盘、触控板和其他输入设备 | /usr/libexec/ |
backupd | 时间机器 | /System/Library/CoreServices/ |
com.apple.WebKit.WebContent | Safari 或 WebKit 页面渲染器,每个站点一个 | WebKit 框架内部 |
这些位置是典型的而不是永久的 API 合同,Apple 可以在 macOS 版本之间移动组件。用户可写目录中的匹配名称是一个强烈的警告信号;在标记为恶意之前,应验证不同的受保护系统路径。对于特定于过程的诊断,请参阅 kernel_task、WindowServer 和 mds_stores 指南。
实际上看起来可疑的地方
值得研究的信号,大致按关注顺序排列:
- 从非系统路径运行的听起来像系统的名称。
/Users/Shared/中的WindowServer不是WindowServer。 - 未签名或临时签名,从系统相邻目录运行。 交付给用户的合法软件已签名。
- 与所声称的身份不匹配的签名机构。 自称为 Adobe 更新程序的应用程序,由不相关的开发人员 ID 签名。
- 险些错过的名字。 尾随空格、交换字符、双字母 —
mdworker_shared与某个字符缺失的东西。 ~/Library/LaunchAgents/中的启动代理指向临时或下载目录中的二进制文件。- 在被终止后几秒内以新 PID 重新出现的进程,并且您无法追踪到 Apple 签名的启动守护进程。
Apple 的内置 XProtect 可自动检测并阻止已知恶意软件,并包含定期检查感染的修复技术。缺乏警报会降低对已知威胁的担忧,但并不能证明每个正在运行的进程都是安全的。如需更深入的调查工作流程,请参阅如何检测 macOS 上的可疑进程。
使用 ProcXray 同时进行所有四项检查
上面的工作流程需要在活动监视器和多个终端命令之间跳转,并对每个要清除的进程重复此操作。 ProcXray 的构建是为了将其折叠成一个视图。
选择任何流程,您将在单个详细信息面板的相邻选项卡中看到:
- 代码签名和权利 — 签名权限、团队标识符以及允许流程执行的操作。这是活动监视器根本无法执行的检查。
- 完整的二进制路径,以及“环境”选项卡中的启动参数和工作目录。
- 进程树,显示生成它的父进程 - 因此由
launchd重新启动的守护进程立即可见。 - 打开连接和文件描述符,用于行为检查。
- 加载的模块,其中注入的库显示为从意外位置加载的 dylib。
有两个功能对于这项任务特别重要。新生成的进程以绿色突出显示,退出的进程会褪色为红色并保持可见,因此被杀死后重新生成的进程是显而易见的,而不是您必须通过重新运行命令来捕获的进程。正则表达式搜索会同时过滤名称、PID、参数和路径,这使得调查特定的用户可写位置或将可疑名称与其可执行路径进行比较变得更加容易。不要将 /System 之外的每个进程视为第三方:许多 Apple 进程合法地从 /usr/libexec、/usr/sbin、/usr/bin 和 /sbin 运行。
常问问题
nsurlsessiond是病毒吗?
不。nsurlsessiond 是 Apple 的后台网络守护进程,负责当应用程序不在前台时继续下载和上传 — iCloud 同步、App Store 更新以及使用 URLSession 后台传输的任何应用程序。它位于 /usr/libexec/ 中并由 Apple 签名。网络或 CPU 活动较高通常意味着正在进行大量 iCloud 同步或后台应用程序下载。
如何判断 Mac 进程是否合法?
从可执行路径开始,然后运行codesign --verify --strict --verbose=2 <path>来验证其签名,并运行codesign -dvvv <path>来检查记录的身份。受保护的系统路径、与所声称的开发人员一致的有效签名、预期的父级以及可解释的行为是相辅相成的信号。从用户可写或临时目录运行的系统名称值得调查,但没有任何单一检查可以证明进程是安全的还是恶意的。
为什么活动监视器无法告诉我进程是否安全?
活动监视器显示资源使用情况,而不是来源。它没有代码签名、签名权限或公证状态列,并且只能通过“打开文件和端口”面板间接访问二进制路径。确定进程是否合法需要活动监视器不会公开的信息,这就是为什么答案通常涉及终端或 ProcXray 等工具。
恶意软件可以冒充 macOS 上的系统进程吗?
它可以自由地复制名称——这很简单。然而,在正常的 macOS 安全配置下,普通软件无法简单地将二进制文件添加到签名系统卷或创建像 Apple 那样的有效签名。只读系统卷已抵达 Catalina,并在 Big Sur 中添加了加密 SSV 保护。因此,路径和经过验证的代码身份是比显示的进程名称更有力的证据,同时仍然仅构成评估的一部分。
我应该杀死一个我不认识的进程吗?
不——不是第一步。许多不熟悉的守护进程都是承载的,杀死它们的范围从毫无意义(launchd立即重新启动它们)到破坏性(WindowServer结束您的登录会话)。首先使用四项检查来识别它。如果事实证明它是不需要的软件,则删除启动它的启动代理才是真正的修复;杀死进程只会释放它回来。
macOS 是否有内置的恶意软件防护?
是的。 XProtect 在首次启动、应用程序更改以及 XProtect 签名更新时检查应用程序是否存在已知恶意内容;其修复技术还定期检查感染情况。 Gatekeeper 会验证下载的软件,并在首次打开时请求批准,而公证则添加自动 Apple 恶意软件扫描。用户可以推翻某些 Gatekeeper 决定,并且经过签名或公证的软件并非自动无害。这些保护是强有力的基线,而不是保证。
来源和参考文献
- Apple:防范 macOS 中的恶意软件
- 苹果:签名系统卷安全
- Apple:关于 Mac 上的系统完整性保护
- macOS 手册页镜像:codesign(1)
- macOS 手册页镜像:spctl(8)
下载 ProcXray → — 免费基本版和 14 天高级试用版,macOS Sonoma+。