Jrohy/webssh

bug: 未正确关闭部分 ssh 连接,持续消耗资源导致系统无法响应

cdfmlr opened this issue · 0 comments

问题描述

该 webssh 服务后端程序,存在多处 ssh client 使用完后未 Close,造成 TCP/SSH 连接泄漏,可能导致登陆的目标主机上累积大量 sshd 进程,耗尽系统资源。

问题发现

发现一台服务器无法以任何用户通过任何方法登陆,但监控显示该服务器 CPU、内存、硬盘、网络等环境处于正常状态,其上运行的部分服务可正常访问、另一部分服务无法响应。该服务器最近常使用该 webssh 服务登陆。

重启该服务器后,可以正常 SSH 登陆。分析 /var/log/auth.log 等日志发现大量与无法登陆有关的日志:

Nov 15 03:27:29 HOST sshd[30604]: fatal: fork of unprivileged child failed

结合其他系统、服务日志,确定系统达到了最大进程限制,表现出登陆异常。

进一步研究发现,重启前系统内充斥大量 Ss 状态的 sshd: USER 进程:

  • S: interruptible sleep (waiting for an event to complete)
  • s: is a session leader

其中 USER 为常用该 webssh 服务登陆的用户。确定此次异常由 webssh 服务引起。

问题复现

WEBSSH_SERVER(IP地址)上运行 webssh 服务,尝试以 WEBSSH_USER 用户登陆一台目标主机 T。

在目标主机 T 上进行简单检测:

$ netstat -na | grep 22 | grep WEBSSH_SERVER [ | wc -l ]
$ ps -aux | grep 'sshd: WEBSSH_USER' [ | wc -l ]

多次使用 webssh 服务连接目标主机 T,可以看到 SSH 的 TCP 连接数、sshd 进程数增加。且两个量随连接保持时长而增加,使用文件管理功能更会快速增加两个值。通过关闭终端标签页、关闭浏览器页面等方式关闭连接时,TCP 连接数、sshd 进程数会下降 1(减远少于增)。

WEBSSH_SERVER 上,做 netstat -na | grep 22,同样会看到大量对目标主机 T 的 TCP 连接。

WEBSSH_SERVER 上关闭 webssh 服务程序后,上述 TCP 连接、sshd 进程均立刻结束,回到正常状态。