青蛙小白
博客 / 2025/10

OpenSSH 高危漏洞修复:在openEuler 24.03 上离线升级OpenSSH

2025/10/15 · — 字 · 阅读约 — 分钟 ·
目录

OpenSSH 9.6 有几个高危漏洞,其中 CVE-2024-6387 最严重,远程代码执行,root 权限,影响范围很广。还有 CVE-2023-51767 身份验证绕过,以及几个中危漏洞(CVE-2025-26465、CVE-2025-26466、CVE-2025-32728)。

生产服务器在内网隔离环境,没法直接连外网,所以只能离线升级。这里记录下在 openEuler 24.03 LTS-SP1 上升级到 OpenSSH 10.2 的完整过程。

离线升级的坑

SSH 挂了就登不上去了,升级得小心。主要是 PAM、SELinux、systemd 这些集成要处理好,配置兼容性也要注意,离线环境装依赖还麻烦。

外网编译打包,再传到内网部署。脚本做好备份和回滚,出事能快速恢复。

编译准备

编译参数要和系统原有的 OpenSSH 保持一致,不然路径不对会出问题:

./configure \
    --prefix=/usr \
    --sysconfdir=/etc/ssh \
    --datadir=/usr/share/openssh \
    --with-pam \
    --with-selinux \
    --with-systemd \
    --with-privsep-path=/var/empty/sshd \
    --with-pid-dir=/run

外网环境准备

在能上网的 openEuler 24.03 机器上安装编译依赖:

sudo dnf install -y gcc make zlib-devel openssl-devel pam-devel \
    systemd-devel libselinux-devel krb5-devel wget tar

下载和编译

mkdir -p ~/openssh-build
cd ~/openssh-build

# 下载 OpenSSH 10.2p1
wget https://cloudflare.cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-10.2p1.tar.gz
tar -xzf openssh-10.2p1.tar.gz
cd openssh-10.2p1

# 编译
./configure \
    --prefix=/usr \
    --sysconfdir=/etc/ssh \
    --datadir=/usr/share/openssh \
    --with-pam \
    --with-selinux \
    --with-systemd \
    --with-privsep-path=/var/empty/sshd \
    --with-pid-dir=/run

make -j$(nproc)

# 安装到临时目录
make DESTDIR=$HOME/openssh-build/install install

# 打包
cd ~/openssh-build
tar -czf openssh-10.2p1-openeuler-24.03.tar.gz install/

升级脚本

写个自动化脚本处理备份、兼容性修复、验证和回滚:

cat > ~/openssh-build/upgrade.sh << 'EOF'
#!/bin/bash
set -e

echo "OpenSSH 升级脚本 - openEuler 24.03"
echo "================================="

if [ "$EUID" -ne 0 ]; then
    echo "错误: 需要 root 权限"
    exit 1
fi

# 备份
echo "[1/7] 备份配置..."
BACKUP_DIR="/root/ssh-backup-$(date +%Y%m%d-%H%M%S)"
mkdir -p $BACKUP_DIR
cp -a /etc/ssh/* $BACKUP_DIR/
echo "备份到: $BACKUP_DIR"

echo "[2/7] 备份二进制文件..."
cp -p /usr/bin/ssh $BACKUP_DIR/
cp -p /usr/sbin/sshd $BACKUP_DIR/

# 安装新版本
echo "[3/7] 安装新版本..."
cd install
cp -af usr/* /usr/
cp -af etc/* /etc/

# 恢复配置
echo "[4/7] 恢复配置..."
cp -f $BACKUP_DIR/sshd_config /etc/ssh/sshd_config
cp -f $BACKUP_DIR/ssh_config /etc/ssh/ssh_config
cp -f $BACKUP_DIR/ssh_host_* /etc/ssh/ 2>/dev/null || true

# 修复兼容性(OpenSSH 10.x 不支持某些 GSSAPI 选项)
echo "[5/7] 修复兼容性..."
sed -i 's/^GSSAPIAuthentication/#&/' /etc/ssh/sshd_config
sed -i 's/^GSSAPICleanupCredentials/#&/' /etc/ssh/sshd_config
sed -i 's/^GSSAPIKexAlgorithms/#&/' /etc/ssh/sshd_config

# 验证
echo "[6/7] 验证配置..."
if ! /usr/sbin/sshd -t; then
    echo "配置验证失败,回滚..."
    cp -f $BACKUP_DIR/ssh /usr/bin/
    cp -f $BACKUP_DIR/sshd /usr/sbin/
    cp -f $BACKUP_DIR/sshd_config /etc/ssh/sshd_config
    systemctl restart sshd
    exit 1
fi

chmod 600 /etc/ssh/ssh_host_*_key
chmod 644 /etc/ssh/ssh_host_*_key.pub
chmod 600 /etc/ssh/sshd_config

# 重启
echo "[7/7] 重启服务..."
if ! systemctl restart sshd; then
    echo "启动失败,回滚..."
    cp -f $BACKUP_DIR/ssh /usr/bin/
    cp -f $BACKUP_DIR/sshd /usr/sbin/
    cp -af $BACKUP_DIR/* /etc/ssh/
    systemctl restart sshd
    exit 1
fi

if ! systemctl is-active --quiet sshd; then
    echo "服务异常"
    systemctl status sshd
    exit 1
fi

echo ""
echo "========================================="
echo "升级完成,当前版本:"
ssh -V
echo ""
systemctl status sshd --no-pager -l
echo "========================================="
echo ""
echo "备份: $BACKUP_DIR"
echo "回滚命令:"
echo "  cp -f $BACKUP_DIR/ssh /usr/bin/"
echo "  cp -f $BACKUP_DIR/sshd /usr/sbin/"
echo "  cp -af $BACKUP_DIR/* /etc/ssh/"
echo "  systemctl restart sshd"
EOF

chmod +x ~/openssh-build/upgrade.sh

脚本逻辑:

  • 备份配置和二进制文件
  • 安装新版本但保留原配置
  • 自动注释不兼容的 GSSAPI 选项
  • 验证配置语法
  • 失败自动回滚

配置兼容性

OpenSSH 10.x 移除了一些 GSSAPI 配置项,脚本会自动注释:

  • GSSAPIAuthentication
  • GSSAPICleanupCredentials
  • GSSAPIKexAlgorithms

打包传输

cd ~/openssh-build
tar -czf openssh-upgrade-package.tar.gz \
    openssh-10.2p1-openeuler-24.03.tar.gz \
    upgrade.sh

用跳板机传到内网服务器。

内网部署

生产升级前在测试环境完整跑一遍,确认编译参数、配置兼容性、回滚流程都没问题。
tar -xzf openssh-upgrade-package.tar.gz
tar -xzf openssh-10.2p1-openeuler-24.03.tar.gz
sudo ./upgrade.sh

输出内容大致为:

OpenSSH 升级脚本 - openEuler 24.03
=================================
[1/7] 备份配置...
备份到: /root/ssh-backup-20251015-143025
[2/7] 备份二进制文件...
[3/7] 安装新版本...
[4/7] 恢复配置...
[5/7] 修复兼容性...
[6/7] 验证配置...
[7/7] 重启服务...

=========================================
升级完成,当前版本:
OpenSSH_10.2p1, OpenSSL 3.0.9 30 May 2023
...
=========================================

验证

# 检查版本
ssh -V

# 检查服务
sudo systemctl status sshd

# 测试新连接(别关当前会话)
ssh username@localhost

# 看日志
sudo journalctl -u sshd -n 50 --no-pager
重要:确认新连接正常之前别关当前会话。

注意事项

保持活动会话:升级时至少留一个 SSH 会话,失败了能回滚。有条件的话准备 IPMI/KVM。

测试环境先试:生产升级前在测试环境完整跑一遍,确认编译参数、配置兼容性、回滚流程都没问题。

回滚命令:脚本会输出备份路径和回滚命令,保存好以备不时之需。

回滚

万一出问题可以使用下面的命令进行回滚:

BACKUP_DIR="/root/ssh-backup-20251015-143025"  # 改成实际路径
sudo cp -f $BACKUP_DIR/ssh /usr/bin/
sudo cp -f $BACKUP_DIR/sshd /usr/sbin/
sudo cp -af $BACKUP_DIR/* /etc/ssh/
sudo systemctl restart sshd
ssh -V

漏洞说明

CVE-2024-6387(高危):sshd 信号处理器竞态条件,可能导致远程代码执行。影响 OpenSSH 8.5p1 到 9.7p1。需要在 LoginGraceTime 内触发,32 位系统更容易利用。

CVE-2023-51767(高危):认证绕过,影响 9.6 之前的版本。

中危漏洞:CVE-2025-26465(拒绝服务)、CVE-2025-26466(信息泄露)、CVE-2025-32728(权限提升)。

参考

TAGS # linux
评论