最近 OpenSSH CVE-2024-6387 闹得沸沸扬扬,网上也流传出了升级教程,但有些教程是错误的!!!

# 错误做法

错误示例:只 make install 后就不管了

这里 make install 完后需要替换二进制文件才能真正完成升级!!!

当然有些人可能会说为什么我 make install 后使用 sshd -V 输出版本号是 9.8p1,那是因为环境变量的锅!!!

检查方法很简单

输入 ls /usr/local/sbin -la | grep sshd 可以发现该二进制文件是 make install 时生成的(日期),然后输入 ls /usr/sbin -la | grep sshd ,可以发现这个 sshd 文件创建日期远落后于第一个 sshd 文件(当然你也可以通过绝对路径运行 /usr/sbin/sshd -V 输出版本信息查看),接着我们输入 ps aux | grep sshd 可以发现当前正在运行的是 /usr/sbin 下的 sshd!!!并且通过 cat /etc/systemd/system/sshd.service 也可以看出 sshd 服务是使用的 /usr/sbin 下的 sshd,跟新版本的 sshd 半毛钱关系没有!!!

人话来说就是如升

原因分析:环境变量的锅

输入 echo $PATH 可以看到自己当前的环境变量

这是我的环境变量: /bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

我也不知道是 make install 时添加了环境变量还是我之前自己添加了环境变量,导致当我输入 sshd -V 时系统将文件定位到了 /usr/local/sbin 目录下的 sshd, ssh -V 则定位到了 /usr/local/bin 下的 ssh 二进制文件,因此输出了 9.8p1 的版本信息,让我误以为升级完成(网上部分教程害人不浅),但其实根本没有完成升级!!!

Tips:部分教程用 ssh -V 输出版本信息, ssh 是客户端, sshd 才是服务端

# 正确做法

前面的步骤都是一样的

1
2
3
4
5
6
7
8
9
10
11
sudo apt-get update
sudo apt-get install -y build-essential zlib1g-dev libssl-dev

wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.8p1.tar.gz

tar -xzf openssh-9.8p1.tar.gz
cd openssh-9.8p1

./configure
make
sudo make install

然后这里我们需要替换二进制文件

这里因为我使用软连接好像有点问题因此选择直接把二进制文件 copy 过来(这里先把 sshd 的写了,openssh 其他组件可以依葫芦画瓢进行替换)

1
2
3
4
5
6
#备份原来的sshd
mv /usr/sbin/sshd /usr/sbin/sshd.old
#复制二进制文件
cp /usr/local/sbin/sshd /usr/sbin/sshd
#重启sshd服务
sudo systemctl restart sshd

重新连接后会提示密钥指纹变更的情况,同意接受即可

下面是可选更新组件

1
2
3
4
5
6
7
8
9
#备份原来的组件
mv /usr/bin/ssh /usr/bin/ssh.old

mv /usr/bin/ssh-keygen /usr/bin/ssh-keygen.old

#更新ssh客户端
cp /usr/local/bin/ssh /usr/bin/ssh
#更新密钥生成组件
cp /usr/local/bin/ssh-keygen /usr/bin/ssh-keygen

Tips:sshd 的配置文件将会定位到 /usr/local/etc 下,因此可能需要迁移原配置文件。

# 简单方法

使用 --prefix 来手动指定安装目录

将原先 ./configure 命令改为 ./configure --prefix=/usr --sysconfdir=/etc/ssh ,这样在完成 make install 后将会将编译完成的软件安装至 /usr/sbin/usr/bin ,而不会安装在 /usr/local/sbin 内,并且配置文件无需迁移,后面的复制命令也无需使用。