事情是这样的:因业务中 CI 的步骤较多,且自己的 VPS 的性能比 GitHub(免费版)提供的环境要好,故把 VPS 配置成了 self-hosted runner。
今天下午偶然发现 CI 的耗时比以往长了一倍,登上服务器调查原因,发现大部分 CPU 被一个名为 kswapd0
的进程消耗掉了。上网查了一下 kswapd0
CPU 占用高的问题,没什么特别的收获,于是又查了一下第二个进程 blitz64
,好家伙,似乎是一个恶意进程。
gitea
这个用户是给 Gitea 用的,口令比较简单,且忘了 ban 掉公网 SSH 登录,估计是被扫到端口暴力破解了。切换到 gitea 用户继续排查,发现它创建了很多连接(下图已经是清理过一遍的进程列表,先前有大量被 blitz64
唤起的 httpd 进程)
幸好我没有给 gitea sudo 权限,攻击者的爪子应该伸不长。使用 kill -9 -u gitea
杀掉了这个用户创建的所有进程,然后继续排查痕迹。
发现用户目录下有一个名为 .configrc5
的文件夹,/tmp 目录下也有 .X291-unix
文件夹。后者下面没有什么东西(除了一个 dota3.tar.gz
,不知这个名字是否有意),前者除了几个用于发垃圾请求的文件夹外还有个 cron.d 文件,就执行 crontab -l
看了一眼,果然攻击者想用 crontab 定时更新和拉起服务。
$ crontab -l
5 6 * * 0 /home/gitea/.configrc5/a/upd>/dev/null 2>&1
@reboot /home/gitea/.configrc5/a/upd>/dev/null 2>&1
5 8 * * 0 /home/gitea/.configrc5/b/sync>/dev/null 2>&1
@reboot /home/gitea/.configrc5/b/sync>/dev/null 2>&1
0 0 */3 * * /tmp/.X291-unix/.rsync/c/aptitude>/dev/null 2>&1
删除了 crontab 配置、清理掉 .configrc5
文件夹,又想起来看了一眼 .ssh
文件夹,发现攻击者还加了个 authorized_keys
方便后续登录,🐮
至此告一段落。处理措施:改密码,清查用户目录,禁止用户 SSH 登录。
后来还被 VPS 提供商关机了,因为他们收到了其它服务商的 abuse 投诉。当然协商后解决了。