xmrig 算力劫持 5 步应急处置:从告警到清零
2026/9/17 13:34:47 网站建设 项目流程

xmrig 算力劫持 5 步应急处置:从告警到清零

【免费下载链接】xmrigRandomX, KawPow, CryptoNight and GhostRider unified CPU/GPU miner and RandomX benchmark项目地址: https://gitcode.com/GitHub_Trending/xm/xmrig

监控突然报 CPU 97% 打满,top 里多出一个你不认识的全速进程,第一怀疑对象就是 xmrig 类算力劫持。

[09:12:03] ALERT host=web-03 metric=cpu.usage value=97% sustained=30m [09:12:04] top -bn1 | head -5 PID USER %CPU %MEM COMMAND 2847 root 798.0 1.2 ./miner

如果你的机器也在告警,现在开始。

定位:从告警确认嫌疑进程

09:12先排除误报,再确认这台机器是否本来就该跑矿机:xmrig 既是开源矿机也是 RandomX 基准测试工具,若这台机器是你的自有矿节点,后面就是配置审计而不是入侵处置。

读 /proc/ /cmdline:启动参数不会说谎

跑这条锁定全速进程和它的真实身份:

# 按 CPU 占用排序,锁定第一名 ps aux --sort=-%cpu | head -5 # 倒出该进程的完整启动参数 sudo cat /proc/2847/cmdline | tr '\0' ' '; echo

如果看到 cmdline 里有-o pool.xxx:443--config /dev/shm/xxx.json,说明外联目标和配置位置直接可读;如果 cmdline 是空的,说明进程名被改过,需要看内存映射进一步确认。

跑这条看二进制里实现了什么算法,这是判断"是不是 xmrig"最直接的证据:

# 从二进制倒出可读字符串,过滤挖矿算法关键词 strings -a /path/to/miner | grep -iE 'xmrig|randomx|cryptonight|kawpow' | head -10

如果看到RandomXcn/1之类的字符串,说明这个二进制要么是 xmrig 构建版,要么是基于 xmrig 打包的变种,算法名也是后面判断外联端口的依据。

想看它的"正常面孔",就把可疑二进制丢进隔离虚拟机里跑一遍:启动输出会显示它连接的矿池、算法和实时算力,这些都可以作为判定证据。

💡 提示:/proc/2847/exe指向的路径带<deleted>后缀,说明文件已删但进程还活着,立即从该路径拷贝二进制留证。

定位三件事:文件、外联、启动参数

09:18确认是挖矿进程后,并行查三件事:文件在哪、连了谁、怎么被拉起来的。

ss -antp:盯死 3333/5555/443

跑这条定位文件的真实位置——路径比进程名重要,攻击者常把它改名成不起眼的路径:

# 查看进程可执行文件、工作目录和打开的配置文件 sudo ls -l /proc/2847/exe /proc/2847/cwd sudo lsof -p 2847 2>/dev/null | grep -E '\.(json|conf|cfg)$'

如果看到 exe 指向 /dev/shm/ 或 /tmp/ 子目录,说明攻击者用内存盘藏文件,/dev/shm 是 xmrig 变种投放文件的高频位置。

跑这条确认外联——xmrig 官方矿池端口常见 3333/5555,恶意变种则常用 443 走 TLS 伪装,绕过出站白名单:

# 过滤该进程已建立的外联 sudo ss -antp | grep 2847

如果看到对 443/3333 的 ESTAB 连接且远端 IP 不在你的服务清单里,说明外联成立;记下远端 IP,后面阻断和溯源都要用。

对照官方配置:哪些字段是"隐藏自己"

跑这条把进程实际读取的配置倒出来,和 src/config.json 的官方结构逐字段对比:

# 读进程 cwd 下指向的配置文件 sudo cat /proc/2847/cwd/*.json 2>/dev/null | head -30

如果看到"background": true"log-file": null"donate-level": 0同时出现,说明是典型的"隐藏自己"组合:官方最低捐赠级别是 1%(见 src/donate.h),donate-level 0 基本只出现在修改版或第三方打包变体里;"max-threads-hint": 100表示满核占用,按 doc/CPU_MAX_USAGE.md 的说法该值只决定线程数量化,但和上面几个隐藏字段叠加时,恶意性质已经清楚。

⚠ 注意:证据没采完之前别杀进程。杀掉后 /proc/2847 消失,cmdline 和连接证据全部归零。

阻断:切断到矿池的外联

09:35进程可以晚杀,外联必须先断——它还在上报 hash,就在偷你的资源。

iptables REJECT:先断后杀

跑这条阻断上一步确认的矿池 IP,留 REJECT 日志方便事后溯源:

# 在 OUTPUT 链头部插入 REJECT 规则,阻断已确认的矿池 IP 段 sudo iptables -I OUTPUT -d 45.154.148.0/24 -j REJECT --reject-with icmp-host-prohibited sudo iptables -L OUTPUT -n | head -5

如果看到 REJECT 规则出现在链首、进程外联反复卡在 SYN-SENT/CLOSED,说明阻断生效;如果连接立刻换到别的 IP,说明矿机内置故障转移,直接进入下一步。

再跑这条检查 xmrig 的 HTTP API 有没有被暴露——官方默认是 127.0.0.1 加 restricted 模式,如果攻击者把监听改成 0.0.0.0 并设restricted: false,就能通过 doc/API.md 描述的接口远程改你的挖矿配置,这是个二次后门:

# 检查 API 端口的监听地址 sudo ss -antlp | grep -iE 'xmrig|api' # 本地探测 summary 接口 curl -s http://127.0.0.1:<api_port>/1/summary

如果看到 LISTEN 地址是 0.0.0.0,说明 API 已暴露,先在防火墙上关掉该端口再杀进程;响应里的字段结构可对照 doc/api/1/summary.json。

⚠ 注意:iptables 规则重启即失效,阻断只是买时间,必须马上进入杀进程和清持久化。

清除:杀进程、拔持久化

10:02外联断掉后杀进程,再逐个清理持久化点——持久化才是矿工杀完又复活的原因。

pgrep 先预演,再 kill -9

跑这条杀进程前先预演一遍,防止误杀业务里恰好带 miner 字样的服务:

# 先 dry-run 看会命中哪些进程 pgrep -af 'xmrig|miner' # 确认无误后杀掉 sudo kill -9 $(pgrep -f 'xmrig|miner')

如果第一条命中了非挖矿业务进程,把匹配条件收窄成完整路径再执行;杀完后pgrep -af再跑一遍,无输出才算清干净。

crontab 与 /dev/shm:最高频的两个持久化点

跑这条检查 Linux 持久化点,重点看 crontab、/etc/cron*、systemd、启动脚本四处:

# 用户级和 root 级 crontab crontab -l 2>/dev/null; sudo crontab -l -u root # 系统 cron 目录与启动脚本 sudo grep -rE 'xmrig|/dev/shm|/var/tmp' /etc/cron* /etc/rc.local 2>/dev/null # 自启动单元 sudo systemctl list-unit-files --state=enabled 2>/dev/null | grep -viE 'systemd|dbus|udev'

如果看到* * * * * root /dev/shm/start.sh这样的行,说明进程每分钟自动复活,必须同时删掉这一行和 /dev/shm/start.sh;没命中不代表没持久化,继续查文件层。

Windows 主机用这两条查启动项和签名:

# 查当前用户启动项 Get-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" # 验证可疑二进制的签名状态 Get-AuthenticodeSignature "C:\temp\xmrig.exe"

如果 Run 键下有 xmrig 之类的非系统名称,说明开机自启,用 reg delete 删掉对应项;签名状态上注意开源项目官方二进制通常本身不带代码签名,未签名不等于恶意,要结合你自己下载的发布产物比对哈希判断。

持久化清完后处理文件层:

# 定位所有可疑二进制与配置 sudo find / -xdev \( -name 'xmrig*' -o -name 'miner' \) -type f 2>/dev/null | xargs ls -la

如果列表为空说明文件层已干净;有命中就先 cp -a 拷一份到取证目录再删,同时检查 /var/tmp、/tmp 下同名文件。

⚠ 注意:删掉 crontab 行之后,它指向的 .sh 和 /dev/shm 里的二进制必须一并删除,否则下次触发照样全复活。

验证:确认恢复并固化

10:40清理完成后按进程、网络、资源三层验证。

跑这条确认没有复活:

# 复查残留进程与挖矿相关端口 pgrep -af 'xmrig|miner'; ss -antp | grep -E ':3333|:5555'

如果两条都无输出,说明进程和外联层已干净;pgrep 再次命中说明还有持久化没清,回上一步重查 cron 和 systemd。

跑这条观察资源是否回落:

# 间隔 10 秒采样两次,看 CPU 总占用 top -bn2 -d 10 | grep -A4 '%Cpu'

如果 %Cpu 的 us 回到基线(例如 20% 以下)、top 里不再出现挖矿进程,说明这次算力劫持清零了。最后把本次用到的检测点写进基线监控:/dev/shm 写文件、出站 3333/5555、root 进程满核占核,下次告警就该由监控发出,而不是靠人肉巡检。

💡 提示:验证至少要跨一次重启,很多持久化点只在系统重启后才现身。

速查:操作优先级

下次再遇到这类告警,按这个顺序执行:

优先级动作关键命令
P0留证cat /proc/<pid>/cmdline+ 拷贝二进制和配置
P0阻断外联 + 杀进程iptables -I OUTPUT+kill -9 $(pgrep -f xmrig)
P1拔持久化清 crontab / /etc/cron* / systemd / /dev/shm 四处
P2验证恢复pgrep+ss+top三重复查,观察一个重启周期
P2固化防御挖矿三特征写进基线监控或 EDR 规则

延伸阅读:

  • eBPF 追踪:用 BPF 程序挂 openat 系统调用,在 /dev/shm 可执行文件被写入的瞬间捕获,不用等 CPU 告警触发。
  • EDR 规则写法:把"root 身份 + 非标准路径 + 出站 3

【免费下载链接】xmrigRandomX, KawPow, CryptoNight and GhostRider unified CPU/GPU miner and RandomX benchmark项目地址: https://gitcode.com/GitHub_Trending/xm/xmrig

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询