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

PixPin_2026-09-08_15-36-43.webp

检查后很容易就发现了一个异常进程,如果我是 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 是有鉴权的,他只是默认关闭的

PixPin_2026-09-08_16-04-04.webp

它给的定义是仅用于同机客户端,不用于跨网络访问

那我请问了,你不用于跨网络服务,你 desktop 里的服务器是用来干嘛的?

PixPin_2026-09-08_16-05-40.webp 我承认我有责任,我不应该不设置 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 秒:

  1. 21:45:06.601 — opencode session created( slug=neon-tiger ,projectID=global ,directory=/)——API 侦察/入口试探
  2. 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 全局部署目标
  3. 21:45:17 — 写入下载器 /opt/homebrew/bin/opencode(替换原程序)
  4. 21:45:18.024removing share(清除本次会话痕迹)
  5. 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 。