OpenSSH升级到9.8及以上(无风险版本)

第一阶段:准备工作与建立“后门”

目标:防止升级过程中 SSH 服务中断导致无法连接服务器。

  1. 安装 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
    
  2. 开放防火墙端口

    Bash

    # 必须放行 23 端口,否则 MobaXterm 连不上
    firewall-cmd --zone=public --add-port=23/tcp --permanent
    firewall-cmd --reload
    
  3. 验证 Telnet 连接

    • 务必使用 MobaXterm 新建一个 Session,协议选 Telnet,端口 23,确认能登录进去后再继续。
  4. 安装编译依赖

    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,必须手动编译新版。

  1. 下载并解压 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
    
  2. 编译安装到独立目录 (不要覆盖系统默认路径!)

    Bash

    ./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl shared zlib
    make && make install
    
  3. 注册库文件

    Bash

    echo "/usr/local/openssl/lib" > /etc/ld.so.conf.d/openssl.conf
    ldconfig
    

第三阶段:编译安装 OpenSSH 9.8p1

核心步骤:指定刚才安装的 OpenSSL 路径。

  1. 下载并解压

    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
    
  2. 配置编译选项 (关联 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
    
  3. 编译与安装

    Bash

    make
    make install
    

第四阶段:配置调整与修复 (最容易踩坑)

目标:适配新版本配置,解决 GSSAPI 报错。

  1. 更新 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
    
  2. 修改 sshd_config (关键)

    vim /etc/ssh/sshd_config

    • 开启登录权限

      Plaintext

      PermitRootLogin yes
      PasswordAuthentication yes
      UsePAM yes
      
    • 注释掉不支持的旧参数 (解决 sshd -t 报错):

      找到以下行并在前面加 #:

      Plaintext

      #GSSAPIAuthentication yes
      #GSSAPICleanupCredentials yes
      #GSSAPIKexAlgorithms ...
      
  3. 配置检查 (必须通过才能重启)

    Bash

    /usr/sbin/sshd -t
    
    • 如果无输出,则通过。如果有报错,继续去配置文件里注释掉对应行。

第五阶段:重启与收尾

注意:始终保留至少一个已连接的 SSH 窗口不要关闭。

  1. 重启服务

    Bash

    systemctl daemon-reload
    systemctl restart sshd
    
  2. 验证版本与连接

    Bash

    ssh -V
    # 预期输出:OpenSSH_9.8p1, OpenSSL 1.1.1wa ...
    
    • 动作:新开一个 SSH 窗口尝试连接,确保一切正常。
  3. 关闭 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/

posted @ 2025-12-08 16:26  凯琪0  阅读(0)  评论(0)    收藏  举报