OpenSSH升级到9.8及以上(无风险版本)
第一阶段:准备工作与建立“后门”
目标:防止升级过程中 SSH 服务中断导致无法连接服务器。
-
安装 Telnet 服务(救命通道)
Bash
# 安装服务 yum install -y telnet-server xinetd # 允许 Root 登录 Telnet echo 'pts/0' >> /etc/securetty echo 'pts/1' >> /etc/securetty # (建议加到 pts/9 以防万一) # 启动服务 systemctl start telnet.socket systemctl start xinetd -
开放防火墙端口
Bash
# 必须放行 23 端口,否则 MobaXterm 连不上 firewall-cmd --zone=public --add-port=23/tcp --permanent firewall-cmd --reload -
验证 Telnet 连接
- 务必使用 MobaXterm 新建一个 Session,协议选 Telnet,端口 23,确认能登录进去后再继续。
-
安装编译依赖
Bash
yum install -y gcc gcc-c++ make perl zlib zlib-devel pam pam-devel
第二阶段:升级 OpenSSL (前置依赖)
原因:OpenSSH 9.8 要求 OpenSSL ≥ 1.1.1,而系统默认通常是 1.0.2,必须手动编译新版。
-
下载并解压 OpenSSL 1.1.1w
Bash
cd /usr/local/src wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz --no-check-certificate tar -zxvf openssl-1.1.1w.tar.gz cd openssl-1.1.1w -
编译安装到独立目录 (不要覆盖系统默认路径!)
Bash
./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl shared zlib make && make install -
注册库文件
Bash
echo "/usr/local/openssl/lib" > /etc/ld.so.conf.d/openssl.conf ldconfig
第三阶段:编译安装 OpenSSH 9.8p1
核心步骤:指定刚才安装的 OpenSSL 路径。
-
下载并解压
Bash
cd /usr/local/src wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.8p1.tar.gz tar -zxvf openssh-9.8p1.tar.gz cd openssh-9.8p1 -
配置编译选项 (关联 OpenSSL 1.1.1)
Bash
./configure --prefix=/usr \ --sysconfdir=/etc/ssh \ --with-zlib \ --with-pam \ --with-ssl-dir=/usr/local/openssl \ --without-openssl-header-check -
编译与安装
Bash
make make install
第四阶段:配置调整与修复 (最容易踩坑)
目标:适配新版本配置,解决 GSSAPI 报错。
-
更新 PAM 和启动脚本
Bash
# 复制适配的 PAM 文件 cp contrib/redhat/sshd.pam /etc/pam.d/sshd # 更新启动脚本 cp contrib/redhat/sshd.init /etc/init.d/sshd chmod +x /etc/init.d/sshd chkconfig --add sshd -
修改 sshd_config (关键)
vim /etc/ssh/sshd_config
-
开启登录权限:
Plaintext
PermitRootLogin yes PasswordAuthentication yes UsePAM yes -
注释掉不支持的旧参数 (解决 sshd -t 报错):
找到以下行并在前面加 #:
Plaintext
#GSSAPIAuthentication yes #GSSAPICleanupCredentials yes #GSSAPIKexAlgorithms ...
-
-
配置检查 (必须通过才能重启)
Bash
/usr/sbin/sshd -t- 如果无输出,则通过。如果有报错,继续去配置文件里注释掉对应行。
第五阶段:重启与收尾
注意:始终保留至少一个已连接的 SSH 窗口不要关闭。
-
重启服务
Bash
systemctl daemon-reload systemctl restart sshd -
验证版本与连接
Bash
ssh -V # 预期输出:OpenSSH_9.8p1, OpenSSL 1.1.1wa ...- 动作:新开一个 SSH 窗口尝试连接,确保一切正常。
-
关闭 Telnet 后门 (安全红线)
确认 SSH 稳定后,执行:
Bash
systemctl stop telnet.socket systemctl stop xinetd firewall-cmd --zone=public --remove-port=23/tcp --permanent firewall-cmd --reload
拓展
漏洞是什么
“regreSSHion” 是一个 未经身份认证(unauthenticated) 的 远程代码执行(RCE) 漏洞。也就是说,攻击者 不需要登录凭据,通过特定的攻击方式,就可能对受害服务器执行任意代码。
漏洞源于服务器端组件 sshd(8) 中的一个 信号处理(signal handler)竞争条件(race condition)。具体来说,当 sshd 在默认配置下处理超时(例如用户长时间未登录、触发 SIGALRM 信号)时,会调用一些 非 async-signal-safe(非线程/信号安全) 的函数(例如 syslog() 等)。攻击者可以利用这个时机,触发不可预期的行为,从而获得 root 权限。
这一漏洞在很大范围内被重现并成功利用——在 32-bit Linux + glibc 环境下已被实验性复现。
虽然到目前为止,在 64-bit 系统上尚未有公开的可靠 PoC(proof-of-concept)被广泛证实—but 从理论上讲 同样可能 成功。
因此,这不是一个“只是理论上的警告”,而是一个 实际可能导致服务器被完全接管(root takeover) 的高危安全漏洞。
为什么 9.8 及以上版本解决了这个问题
在 2024 年 7 月 1 日,OpenSSH 官方发布了 9.8 / 9.8p1,明确说明修复了这个 “信号处理 race condition” 的问题。
新版本中移除了或修正了那些不安全的 signal-handler 调用路径,从而防止未认证远程连接触发代码执行。
同时,还修复了另一个较低危的安全问题 —— 在 9.5–9.7 版本中,ssh(1) 的 ObscureKeystrokeTiming 功能存在逻辑错误,可能让被动监听者推断出哪些数据包包含真实按键(例如密码输入);9.8 也修复了这个问题。
参考连接:https://ostechnix.com/regresshion-cve-2024-6387-bug-is-patched-in-openssh-9-8/

浙公网安备 33010602011771号