SSHD 消耗 100% 的 CPU(数百个进程)- 不会死

Bra*_*lta 8 linux openssh

最近我注意到我管理的一些系统上的 SSHd 将开始产生不可停止的进程,这将消耗大量的 CPU。

系统调用显示所有进程都在“运行”并且不是僵尸进程或等待它们的父进程杀死它们(至少据我所知不是这样)。

在此处输入图片说明

我已经尝试了一切来终止这些进程......迄今为止我发现的唯一可靠的方法是重新启动整个服务器(这并不理想)。我试过为 dropbear 切换 openssh-server,但它的行为方式与我的应用程序需要的方式不同。

我试过了:

killall -9 sshd
Run Code Online (Sandbox Code Playgroud)

通过它的 id 杀死每个 sshd。很少有其他杂项(htop + sigterm 等...)

我喜欢一些想法来终止这些进程或解决导致这种情况的原因。

小智 3

如果这些实际上是 OpenSSH sshd 的,我的猜测是某处的某个脚本正在一个损坏的循环中运行它们,并且它们的一个子进程正在占用所有 CPU。

正如 Marki555 所建议的,strace会对您有所帮助,但您应该使用strace -fstrace 来跟踪子进程。从man strace

   -f          Trace child processes as they are  created  by  cur-
               rently  traced  processes as a result of the fork(2)
               system call.
Run Code Online (Sandbox Code Playgroud)

由于 strace 生成如此多的数据,因此使用 -e 参数也可能是个好主意(例如,仅显示 open() 调用):

   -e expr     A qualifying expression which modifies which  events
               to  trace  or  how to trace them.  The format of the
               expression is:
                         [qualifier=][!]value1[,value2]...
Run Code Online (Sandbox Code Playgroud)

您可以尝试的另一个命令是ps xaforpstree -a获取进程及其子进程的易于理解的树视图,以便您可以确定哪个进程启动了这些 sshd。lsof也可能对您有帮助,它会告诉您进程打开了哪些文件。

当然,请确保您使用的是最新的 OpenSSH。我认为在古老的 OpenSSH 3.4p1 上使用 rsync + 大文件 + ssh 会有问题。

如果这些不是真正的 sshd 进程,则二进制文件的 MD5 校验和可能会正确显示,但它可能不是实际运行的 sshd 程序。此外,该md5sum命令本身可能是一个后门版本,经过修改以报告某些文件(如 sshd)的正确校验和。

您应该查看 /proc/[sshd pid]/exe 并确保它是 /usr/sbin/sshd (或 sshd 所在的任何位置)的符号链接,以及 /proc/[sshd pid]/environ 来查看它正在使用什么环境变量,以及 /proc/[sshd pid]/cmdline 以查看实际启动它的命令。

尽管攻击者可能已将恶意程序重命名为“sshd”,然后执行它以使其看起来像是 sshd。甚至可以将 /usr/sbin/sshd 移动到 /tmp/sshd,然后将恶意 sshd 移动到 /usr/sbin/sshd,以尝试将其隐藏在此类 /proc 分析中,但是当 /tmp/sshd 移回时/usr/sbin/sshd /proc/[sshd pid]/exe 符号链接将显示为ls

   lrwxrwxrwx 1 root root 0 May 19 06:47 /proc/[sshd pid]/exe ->  (deleted)/usr/sbin/sshd
Run Code Online (Sandbox Code Playgroud)

另外,如果这些 sshd 正在做一些事情来主动阻止正常的进程分析,您可以尝试kill -STOP而不是kill -9“暂停”该进程(用于kill -CONT恢复它。请参阅http://en.wikipedia.org/wiki/Job_control_%28Unix%29 #执行)。

但是,如果攻击者具有 root 权限,则可以安装隐藏在 /proc、netstat、ls 等中的 rootkit。如果您确实受到威胁,最好的做法是使系统脱机并将其分区挂载到另一个系统上( clean)系统然后进行取证(或使用一张为取证制作的 live Linux CD)。