所有文章
AI

Mac 发烫、风扇狂转?先查查是不是有人在偷偷挖矿(xmrig 自查)

A pale-blue laptop wearing a tiny miner's helmet next to a pickaxe, like a Mac secretly working a second job

Mac 发烫这事,我以前一直归咎于天气、归咎于 Chrome,最多再骂两句 Xcode。直到今天刷到一张截图,才意识到还有一种可能:电脑在给别人打工,偷偷挖矿。看完我也顺手把自己的 Mac 翻了一遍,下面就是我的排查顺序。

先说那张截图

10 月 19 日北京时间 13:04,X 上的 @kimmonismus 发了一条帖子,配图是一个 Reddit 帖子的截图,标题大意是「Claude 在帮我写温度监控 App 的时候,抓到了我 Mac 上的挖矿程序」。

Binmage.

点击后将连接 X。原帖语言保持不变。

据截图,Claude 在核对传感器读数时发现 xmrig 占用了大约 1175% 的 CPU,相当于 12 个核心左右被吃满,CPU 温度最高到了 112°C。截图里还写了:挖矿程序从 /tmp/rigupdater 运行,矿池是 pool.hashvault.sh;持久化靠的是 ~/Library/LaunchAgents 里一个名字乱码的 plist,用 bash 跑一段编码过的脚本,还开了 KeepAlive,日期比这人开始写 App 早得多。Claude 说它还没动手删任何东西,这点我挺认同,先别乱动。

但我得把丑话说在前面:这些数字全部来自截图。所谓的 Reddit 原帖我没找到,机器型号、时间线都没法核实,大家当个「正在流传的案例」看就好,别当成实测结论。

类似的事其实不止这一起。V2EX 上 9 月有位用户发帖说自己中了挖矿木马,按他的自述,是之前开过的 opencode server(Web 端)没设 OPENCODE_SERVER_PASSWORD,又通过 frp 暴露在外,被人远程连进来换掉了程序,最后跑起了 xmrig。我没法独立验证他的分析,但思路很值得参考:问题未必出在「下载了什么奇怪软件」,也可能是你自己开着、早就忘了的某个服务。

这也是我觉得最有意思的地方。AI 编程代理在你电脑上到处跑命令,能帮你发现木马;同样是它,也可能某天顺手 npm install 了一个有毒的包。

先别慌,大多数 Mac 发烫跟木马无关

苹果自己的风扇说明里就写了,迁移数据之后 Spotlight 建索引,风扇转得快是正常的。Mac 发烫的日常原因,我自己碰到过的还有这些:

  • 刚升级系统或者刚用迁移助理搬完家,「聚焦」和「照片」在后台索引,等一两天再说。
  • 浏览器开了一堆标签页,其中某个视频网站或者网页游戏一直在跑。
  • 外接显示器。尤其是一些老款 Intel MacBook Pro,内屏加外屏同时开,热得很明显。
  • Apple 芯片的 Mac 上跑只支持 Intel 的 App,要经过 Rosetta 转译。活动监视器里「种类」一栏会显示「Intel」,哪个 App 吃资源吃得不对劲,可以先看看是不是它。苹果的说明在这里。
  • 夏天抱着笔记本窝在床上、被子上。苹果明确说过别这么用。

真正因为挖矿导致的 Mac 发烫,特征其实很直白:某个进程长期吃满好几个核心,你什么都不干的时候它也不停。矿工是不休息的。

Mac 发烫三步自查流程:活动监视器、登录项与扩展、LaunchAgents

第一步:Mac 发烫时,先打开活动监视器看 CPU

  1. 打开「活动监视器」(应用程序 > 实用工具),点上方的「CPU」。
  2. 点「% CPU」这一列的列标题,让占用最高的排在最上面。苹果的官方说明里有排序和「显示」菜单的用法,选「所有进程」。
  3. 注意这个百分比是按单核算的。100% 就是一个核心满载,所以看到 800%、1000% 以上,意思是好几个核心同时被吃满。
  4. 选中可疑进程,按 Command-I 或者点信息按钮,在「打开的文件和端口」里能看到程序到底放在哪。路径在 /tmp、某个以点开头的隐藏文件夹,或者名字是一串乱码的,都要警惕。
  5. 顺便看一眼「能耗」标签。苹果把能耗影响定义为一个相对值,越低越好;笔记本上还有「12 小时耗电量」一栏,能看出谁一整天都在忙。

有两个名字经常把人吓到,其实是冤枉的。kernel_task 占用高,多半是系统觉得 CPU 太热了,在主动限制它。苹果的说法是 kernel_task 是在应对发热,不是发热的原因。所以看到它忙,应该去找「谁在制造热量」,而不是想办法干掉它。WindowServer 负责把所有窗口画到屏幕上,窗口多、动画多、接了高分辨率外接屏的时候忙一点,正常。

不正常的是:xmrig,名字里带 rig、miner、xmr 的进程,或者一个你完全不认识的进程在 Mac 空闲时还挂着几百的百分比。挖矿程序也经常改名伪装成系统进程,所以别光看名字,路径和「一直满载」这个模式更说明问题。

Mac 发烫时正常进程与可疑进程的对比示意图,据截图 xmrig 约占 1175% CPU

习惯用终端的话

下面几行是我自己常用的,直接粘贴就行:

# 按 CPU 占用排前 10(第 3 列是 %CPU)
ps aux | sort -nrk 3 | head -n 10

# 看某个进程的完整命令和路径
ps -p PID -o pid,%cpu,command

# 当前用户加载的非苹果 launchd 任务
launchctl list | grep -v com.apple

# 现在有哪些进程连着外网
lsof -i -nP | grep ESTABLISHED

把 PID 换成第一条命令里看到的进程号。截图里那个挖矿程序连的是矿池,如果同一个进程还一直连着一个陌生地址,基本可以坐实了。

第二步:看看开机自启了什么

挖矿程序要赚钱,就得关不掉、重启后还能回来,所以几乎都会做持久化。先走苹果官方的路子:苹果菜单 > 系统设置 > 通用 > 登录项与扩展。「登录时打开」里不认识的删掉;下面的后台项目(新版文档叫「App 后台活动」,Ventura 那几代叫「允许在后台」)也挨个看一遍,说不清来历的就关掉。

如果开机就不对劲,苹果的排查文档建议登录时按住 Shift 跳过登录项,或者先全部移除、重启,再一个个加回来。笨办法,但管用。

进阶:自己翻 LaunchAgents 和 LaunchDaemons

先说清楚:苹果并没有建议普通用户去翻这几个文件夹,这一步算进阶操作,对终端不熟的话可以跳过。原则就一条:只看你不认识的 .plist,系统自带的东西别删。

要看的是这三个位置:

ls -la ~/Library/LaunchAgents
ls -la /Library/LaunchAgents
ls -la /Library/LaunchDaemons

# 不用打开编辑器,直接看内容
plutil -p ~/Library/LaunchAgents/com.example.something.plist
挖矿程序在 macOS 上常见的藏身位置示意图,如 ~/Library/LaunchAgents

大部分条目都来自你装过的软件,比如 Google、Zoom、Adobe、VPN、网盘客户端。可疑的长得跟截图里那个差不多:名字是一串随机字母,ProgramArguments 指向 /tmp 或隐藏目录,bash -c 后面跟一大段 base64,KeepAlive 设成 true。想了解这些字段是干嘛的,可以看苹果旧版开发者文档里关于 launch agent 和 daemon 的章节。

怎么清理,才不会越弄越糟

顺序很重要:先停掉负责「拉起」它的东西,再杀进程。不然你这边刚 kill 掉,launchd 两秒后又给你启动一个。

  1. 动手前先把 plist 路径和程序路径记下来,截个图,后面要用。
  2. 卸载任务。用户级的:launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/名字.plist;在 /Library/LaunchDaemons 里的:sudo launchctl bootout system /Library/LaunchDaemons/名字.plist。
  3. 杀掉还在跑的进程:kill PID,或者在活动监视器里点「退出进程」。
  4. 把 plist 和程序本体先挪到桌面上一个「隔离」文件夹,别急着直接删。确认没问题再删。
  5. 跑一下 crontab -l,看有没有不是你写的定时任务;再扫一眼 ~/.zshrc、~/.zprofile,有没有下载或启动东西的奇怪语句。
  6. 重启,等十分钟,再开活动监视器看看。如果又回来了,说明还有别的东西在拉它。

还有一步很多人会忘。木马以你的身份运行,你能读到的它都能读到。截图里提到那台 Mac 上的 GitHub 登录也暴露了。所以请换一台干净的设备:改密码、退出所有已登录的会话,把这台机器上用过的 API Key、SSH 密钥、各种 token 全部换掉。

什么时候别折腾了,直接重装

如果发现了窃密程序,或者挖矿程序删了又回来、Mac 发烫反反复复,或者你就是心里不踏实,那就备份好文件,抹掉后重新安装 macOS。文件手动拷回来,别用迁移助理整机恢复,不然很可能把问题一起搬回来。损失一个晚上,换个安心,我觉得值。

macOS 自己也不是毫无防备。系统内置了 XProtect,基于特征码检测,苹果会独立于系统更新自动推送规则(默认每天检查一次),能拦截和清除已知恶意软件。但它靠特征码,一个刚编译出来、从 shell 脚本拉起的矿机不一定认得出。想再确认一遍,可以用 Malwarebytes for Mac 的免费扫描。用一个靠谱的就够了,网上那些「Mac 清理大师」之类的,本身就挺让人头疼。

如果你在用 Claude Code、Codex 这类代理

我自己天天用,也天天让它们在我电脑上跑命令。说出来才发现,这其实是挺大的信任。插件也一样,我之前整理过自己真会装的 Claude Code Mods,每一个都是以你的权限在跑的代码。几个我现在会注意的点:

  • 认真看它装了什么。代理跑 npm install、pip install、brew install 的时候,扫一眼包名有没有拼错,没听过的包去搜一下。拼写相近的「李鬼包」是最老的套路了。
  • 把沙箱打开。Claude Code 有内置的 Bash 沙箱,macOS 上用的是系统的 Seatbelt,输入 /sandbox 就能开始配置。Codex 也有 read-only、workspace-write 这些沙箱模式,Auto 预设下需要联网的命令会先问你。
  • 代理的 Web 端、远程服务别裸奔。上面 V2EX 那个案例就是教训:开了就记得设密码,不用了就关掉。
  • 跑完一个长任务,顺手 ls -lt ~/Library/LaunchAgents 看看有没有多出新东西。五秒钟的事。

如果你每天都在高强度用这些代理,可以顺便看看我维护的 Claude / Codex 限额与封号追踪。用量突然暴涨又说不清原因,和 CPU 突然暴涨一样,值得多看一眼。

这件事好玩的地方在于,是 AI 抓到了矿机;不好玩的地方在于,AI 装上一个矿机也一样容易。两件事都是真的。AI 站在安全事件两边也不是头一回了,之前那个攻击银行、还让 AI 帮忙写简历的人就是例子。所以多留个心眼,看看它们干完活留下了什么。

当然,如果查到最后,Mac 发烫只是因为聚焦在建索引,那是最好的结果。

留下你的想法

你的邮箱不会公开。