最近我注意到,我管理的几个系统上的 SSHd 将开始产生无法停止的进程,这将消耗大量的 CPU。
系统调用显示所有进程都在“运行”,并且不是僵尸进程或等待其父进程杀死它们(至少据我所知不是)。
我尝试了各种方法来终止这些进程……到目前为止,我发现唯一可靠的方法是重新启动整个服务器(但这并不理想)。我尝试用 dropbear 替换 openssh-server,但它无法按照我的应用程序需要的方式运行。
我试过了:
killall -9 sshd
根据 id 杀死每个 sshd。还有一些其他杂项(htop + sigterm 等...)
我很想得到一些关于终止这些进程或者解决导致这种情况的原因的想法。
答案1
如果那些实际上是 OpenSSH sshd,我的猜测是某个地方的脚本正在以断开的循环运行它们,并且它们的一个子进程占用了所有 CPU。
正如 Marki555 所建议的,strace
这会对您有所帮助,但您应该使用strace -f
,以便 strace 能够跟踪子进程。来自man strace
:
-f Trace child processes as they are created by cur-
rently traced processes as a result of the fork(2)
system call.
因为 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]...
您可以尝试的另一个命令是ps xaf
或pstree -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
此外,如果这些 sshd 正在采取某些措施来主动阻止正常的进程分析,您可以尝试kill -STOP
“kill -9
暂停”该进程(使用kill -CONT
来恢复它。请参阅http://en.wikipedia.org/wiki/Job_control_%28Unix%29#Implementation)。
但是,如果攻击者拥有 root 权限,那么就可以安装一个隐藏在 /proc、netstat、ls 等中的 rootkit。如果您真的受到了威胁,最好的做法是让系统脱机并将其分区安装到另一个(干净的)系统上,然后进行取证(或使用其中一个用于取证的实时 Linux CD)。