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 配置项,脚本会自动注释:
GSSAPIAuthenticationGSSAPICleanupCredentialsGSSAPIKexAlgorithms
打包传输
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(权限提升)。