服务器入侵事件与处置记录(deepwiki 主机)
事件日期:2026-07-20 · 记录整理:2026-07-21
⚠️ 本文件存放在已被入侵过的主机上,含凭据/密钥线索;密码请另存密码管理器,重装后删除本文件。
- 一句话结论
主机被 XMRig 挖矿木马 + 看门狗以 root 权限入侵。最可能入口是公网裸奔、无认证、以 root 运行的 DeepWiki(:8001)。已完成止血加固(收口 + 补丁 + 认证),但机器被 root 拿过 无法证明彻底干净,最终仍应重装。
- 恶意程序特征
项
内容
矿工
/usr/bin/softirq(冒用内核线程名),矿池 45.125.66.100 / 45.94.31.89 / 45.153.34.46,用户 react 密码 3cthDeQ5
看门狗
/usr/lib/systemd/<随机名>(xgvhwpak → 重启后变 bbllajfxa),二进制自删(deleted),专杀 ps/top/htop/curl(返回 Killed),C2 45.153.34.46:8443
Dropper
/etc/rondo/rondo(多架构:x86_64/i686/armv6l),/usr/bin/{ccphxb,tgukdb},暂存目录 /usr/lib/lib/
持久化
@reboot 分散在 /etc/init.d/rondo、/etc/cron.d/rondo、/etc/rc.local、/etc/crontab、/var/spool/cron/{root,crontabs/root} + rondo.service(由 init.d 生成)
反删除
文件加 chattr +i/+a(immutable+append),并删掉了 /usr/bin/chattr 阻止清理
症状解释:ps/top 返回 Killed 不是 OOM,是看门狗在杀监控工具;其他应用照跑是因为木马只针对一个"杀名单"。
- 入侵入口分析(按可能性排序)
🥇 DeepWiki 本地路径(最可能)
时间铁证:用户当晚正用 deepwiki 部署/建 wiki,日志显示 00:44 正活跃处理仓库=矿工启动那一分钟。
暴露:0.0.0.0:8001、以 root 跑、DEEPWIKI_AUTH_MODE 默认关、ws/chat 端点零鉴权。
漏洞(api/data_pipeline.py):else: # local path 分支把任何非 http 的 repo_url 当本地路径→ 一个匿名请求即可 以 root 任意读全盘(如 repo_url=/root/.ssh);另有 LocalDB.load_state() = pickle.load 的 RCE sink。
归属:本地路径功能是上游 deepwiki-open 自带(HEAD:813 行);二开只是加了文件层穿越防护。真正引爆的是部署方式(公网 + root + 无认证)。
取证局限:攻击大概率直接打 IP:8001,绕过 nginx/Cloudflare(CF 只护 443),所以 nginx 日志无痕、源 IP 不可追。
🥈 Portainer(技术上最"干净"的一击到 root)
9000/9443 公网 + 挂 /var/run/docker.sock=Docker root 权。碰到即可起 --rm 特权容器挂宿主机 / → 瞬间 root、用完即焚不留痕(解释"查不到新容器")。
缺临门证据:3 月就建好、大概率已设管理员密码,需凭据或未修补 CVE。
🥉 MCP eval() RCE(最不可能)
slot_process.py 有 eval(),但值来自 LLM 函数调用输出、非请求直传,链路绕、不可靠;感染窗口 MCP 服务无日志。
❌ RDP(已排除)
3389 被持续爆破(27MB 日志),但 TLS 没配好、只有 AUTHFAIL、零成功登录。爆破 IP 是噪音。
补充:机器一直被无差别扫描(nginx 日志见 78.153.140.x 整段刷 /.env)。子域名经 证书透明日志(CT log) 全部公开可枚举 → 任何服务都必须默认当作"会被公网发现"来加固。
- 清除过程 & 重启复活教训
第一次内存清理后,机器 22:00 重启,@reboot 持久化把全套木马重新拉起(说明"清"不可靠)。
第二次正确处置:先冻结(SIGSTOP)看门狗防止互相重生 → SIGKILL → 用 Python fcntl.ioctl 清 immutable 标志(因 chattr 被删)→ 删净所有 dropper/cron/init.d/rc.local → systemctl disable rondo + daemon-reload。
让清理这次能扛住重启:nft 规则存入 /etc/nftables.conf + systemctl enable nftables;apt reinstall e2fsprogs 恢复 chattr。
load 从 4.89 → 0.35,矿工已死。
- 内核级排查结论:无 rootkit(用户态木马)
/proc PID 数 == ps -e(228==228,无隐藏进程);79 个内核模块全正常;无 /etc/ld.so.preload。
unhide + chkrootkit 跑过:告警均为误报(ansible .git_keep、网卡非混杂),但 chkrootkit 意外揪出残留 /usr/lib/lib/ 已删。
权威内核级排查需带外:Live 救援盘扫盘 / 挂到干净机 clamav+rkhunter / Volatility 内存取证。
- 已完成的加固(均已验证)
项
细节
1
deepwiki 本地路径补丁
新增 _validate_local_repo_path() 白名单,接进 _create_repo 本地分支 + get_local_file_content;.env 设 DEEPWIKI_ALLOWED_LOCAL_BASES=/root/mcp:/root/RAG。实测 /root/.ssh、/root、../穿越全部拒绝
2
内部服务全绑 127.0.0.1
MCP start.py/reject/intent/nlu(源码 0.0.0.0→127.0.0.1);deepwiki main.py(HOST 默认 127);deepwiki-frontend service 加 -H 127.0.0.1(顺带修好 502 + 设开机自启)
3
dify 端口收口
compose ports 加 127.0.0.1:(nginx 18080/18443、plugin_daemon 5003),重建容器
4
Portainer 收口
docker run -p 127.0.0.1:9000/9443/8000(原 0.0.0.0 + docker.sock,重建,数据卷保留)
5
deepwiki 边缘认证
nginx deepwiki.clnkj.de server 级 HTTP Basic Auth(覆盖 / 与 /ws/),凭据文件 /etc/nginx/.htpasswd-deepwiki
6
防火墙
nft inet secfix 拦 18007-9/28080 公网 + 阻断到矿池出站;已持久化
7. 端口现状(公网只剩该公开的)
端口
服务
说明
80/443
nginx
公网站点 ✅
1950
sshd
远程登录(pubkey-only)✅
3478/5349
coturn
通话必需 ✅
8008/8448
Matrix synapse
联邦必需 ✅
其余之前暴露的 12 个后端端口全部回到 127.0.0.1。
8. 待办(重装 / 部署时做)
[ ] deepwiki 改用非 root 用户运行(单这条就能把"任意读/pickle RCE"降级)
[ ] 开 DEEPWIKI_AUTH_MODE=true + 强 DEEPWIKI_AUTH_CODE(应用层认证,与 Basic Auth 互补)
[ ] 轮换所有泄露密钥(见 §9)
[ ] 确认 authorized_keys 里的 ssh-key-2025-05-31 是你自己的
[ ] 最终重装系统(干净介质)——被 root 拿过,无法证明干净
9. 需轮换的密钥/凭据
/root/deepwiki/.env:OPENAI_API_KEY=sk-6410...、DASHSCOPE_API_KEY=sk-cedaa888...(后者还被 application.log 明文打印过)
/root/month03/knowbase/.env:DJANGO_SECRET_KEY、EMAIL_HOST_PASSWORD、SUMMARY_API_KEY
/root/month03/dadashop/.env:DB_PASSWORD、JWT_SECRET_KEY、容联短信 token、微博 secret、EMAIL 密码
/root/.openclaw/workspace/chat-project/.env:DATABASE_URL(root:dada86991975)、JWT_SECRET
/root/.openclaw/workspace/dify-*/.env:SECRET_KEY、difyai123456、GOOGLE_API_KEY(AIzaSy...)、LANGSMITH_API_KEY、PGVECTOR_PASSWORD
/root/.ssh/id_ed25519、/root/.git-credentials、/root/.config/gh/hosts.yml
/root/.secrets/certbot/cloudflare.ini、/root/.openclaw/.../cloudflare_token、telegram bot token(root crontab 7325318381:AAG...)
攻击者有 root 期间这些全部视为已泄露。
10. 重装 checklist(关键原则)
最小暴露:所有后端绑 127.0.0.1,公网服务只走 nginx 反代;管理面板(Portainer 等)绝不公网。
最小权限:应用别用 root 跑,每个服务独立低权用户。
认证默认开:deepwiki/dify 等的内置认证开关打开;对外服务加边缘认证。
RDP 不上公网:3389 走 VPN/SSH 隧道。
CT log 意识:子域名都是公开的,别靠"地址保密"。
密钥轮换:全部重新生成,别复用旧的。
日志与监控:给关键服务开请求日志(本次源 IP 追不回就是因为没日志)。
Docker 端口:compose ports 一律写 127.0.0.1:,除非确需公网。
相关持久记忆:/root/.claude/projects/-root-deepwiki/memory/server-compromise-2026-07-20.md