中午的时候 hermes 报告我 CPU 占用异常

检查后很容易就发现了一个异常进程,如果我是 linux 系统或许还真被骗过去,但是我是 mac
经过一番排查后发现很大的一个原因时 opencode server ,或者说叫 web 端
opencode 推 web 端和他们的 desktop 已经很久了,在 dsh 出现之前,我确实用过一段时间 opencode 的 web 端,但是由于 web 端无法使用 omo ,于是很快不再使用,后续既没有继续关注相关内容,也没停掉这个进程,整一个遗漏在角落里
当时的想法是,opencode 推他们的 web 端和 desktop 连接,应该是做好了鉴权的。opencode 作为一个用户量那么大的软件,安全方面肯定是优先严格权限。
另外一方面,dsh 很快就出现了,我也很快把重心转移到 dsh 上,而 dsh 至少上来就拒绝监控 0.0.0.0 ,默认不允许外网访问,除非有认证层————当然这个时候我已经忘记 opencode server 在设置的时候似乎异常的简单,完全没有做过任何的限制。
而实际上,opencode sever 是有鉴权的,他只是默认关闭的

它给的定义是仅用于同机客户端,不用于跨网络访问
那我请问了,你不用于跨网络服务,你 desktop 里的服务器是用来干嘛的?
我承认我有责任,我不应该不设置 OPENCODE_SERVER_PASSWORD ,也不应该不用了之后就丢到一边不管了,但你 opencode 就一点责任也没有吗?一个在设计上用于远程访问的服务,默认不需要开启鉴权就可以使用————反正除了问题都是用户自己的责任,我已经做好了提醒
鉴于近期 opencode go 的一系列恶心用户的事情,我对这家公司已经不再有任何信任,没有任何的责任感
恶意软件画像
| 项 | 值 |
|---|---|
| 文件名 | .kworker_2faf156 |
| 大小 | 5,505,288 字节( Mach-O arm64 ) |
| 签名 | adhoc (无有效签名),codesign Identifier=xmrig |
| SHA-256 | bf1cd51997715eefd5ba1c806538401ad062b824264c4c7f610d6e332387dc18 |
| 矿池 | xmr.kryptex.network:8029 ( donate-level:0 ) |
| 实连 | 192.168.5.2:55038 → 51.195.127.124 ( OVH 法国) |
| 配置 | 编译内嵌,无外置配置文件 |
| 持久化 | 无(无 LaunchAgent/Daemon/cron/登录项残留——一次性执行设计) |
9/7 下载器(激活载体):/opt/homebrew/bin/opencode 被替换为 6264 字节 shell 脚本( SHA-256 5d900ad65cdec910810898bfe5357c3b3428bbda7973a722249ce33ed45610da ):
- 伪装注释 "opencodeo",内部代号
M=r2_worker,C2 域名file.honetsk.link - 下载路径
<C2>/$(printf %x $(date +%s))/binaries/binary_macos_arm64( hex 时间戳子路径防封禁) - 下载工具链 curl/wget/python3/node 轮换; chmod 700 + mv 部署
- 随机 7-hex 后缀(与 .kworker_2faf156 命名同源);幂等设计(锁文件 .deploy-*.lock 、复用运行中实例)
- 部署后 exec 透传伪装为原命令
三、攻击时间线
| 时间 | 事件 |
|---|---|
| 2026-08-06 | vps 隧道 frpc.ini 已含 opencode 4096 转发(当时本机未安装 opencode ,空转) |
| 2026-08-08 15:39 | macOS 26.6.1 系统更新——清空 unified log ( 8/8 后审计真空) |
| 2026-08-09 19:35 | 矿马单文件落地 /opt/homebrew/bin( mtime ;无 quarantine 、无浏览器/终端/IM 痕迹=执行体直接写入)——此时双隧道皆活( vps 在线至 8/30 ,frpc 日志实证; aliyun 同步在线),入口经 vps 或 aliyun 无法区分 |
| 2026-08-24 | 本机安装 opencode server——4096 端口开始有真实无鉴权 API 服务,经 frp 公网可达 |
| 2026-08-30 17:32 | vps 断线( frpc-vps.log 最后成功连接时刻)——月流量 8/13 重置后 17 天耗尽,节奏异常(独立疑点:vps 或曾被当跳板) |
| 2026-09-02 | aliyun frpc.toml 亦加入 4096 转发(双隧道暴露) |
| 2026-09-04 21:16 | 首次外部侦察( opencode session created ,空会话试探)——vps 已断线,此后三次操作全部经 aliyun 隧道( frps journald 实证) |
| 2026-09-05 20:17 | 第二次侦察(来源 94.154.43.7 ,乌克兰 FOP Danik Vyacheslav Evgenievich ) |
| 2026-09-07 21:45:06 | 攻击者第三次进入,开始激活(来源 91.92.40.40 ,保加利亚 TechTies Inc / mnt-bg-eurocrypt ) |
| 2026-09-07 21:45:18.298 | 矿马进程启动(首条系统日志 networkd_settings_read_from_file_locked ) |
| 2026-09-07 → 09-08 | 挖矿持续 ~15.5 小时( 29 天潜伏后激活) |
| 2026-09-08 13:05 | 用户发现(高 CPU ),13:20 处置完毕 |
9/7 激活攻击链复盘( 12 秒会话)
攻击者经 frp 隧道访问本机 opencode server (无鉴权 API ),全程 12 秒:
- 21:45:06.601 — opencode
session created( slug=neon-tiger ,projectID=global ,directory=/)——API 侦察/入口试探 - 21:45:07.862 — node 瞬态进程( loginwindow CAS 记录
Checked in app: node+npm prefix); npm debug 日志实证:argv "prefix" "--global",**cwd=/**( launchd/服务特征,区别于用户终端 cwd=/Users/yiran )——探测 /opt/homebrew 全局部署目标 - 21:45:17 — 写入下载器
/opt/homebrew/bin/opencode(替换原程序) - 21:45:18.024 —
removing share(清除本次会话痕迹) - 21:45:18.298 — 下载器 nohup 启动矿马(.kworker_2faf156 ),随后 exec 原路径伪装,攻击进程退出 → 矿马成孤儿( PPID=1 )
关键机制判定:矿马启动 = 下载器被执行的直接结果(攻击者在线上触发),非 8/9 预置定时任务。9/4 、9/5 两次"例行" session created 实为攻击者前两晚的侦察。
证据链:frps journald (服务器侧隧道连接)→ CAS loginwindow 进程记录 → ~/.npm/_logs/2026-09-07T13_45_07_881Z-debug-0.log ( npm cwd=/ 实证)→ opencode.log created/removing share → 矿马首条日志时间戳 21:45:18.298 。