升级OpenSSH版本规避远程代码执行漏洞。

说明

今天早上逛别人的博客的时候看到了这个重磅消息。OpenSSH爆出能远程通过root身份执行任意代码的漏洞,影响版本是 8.5p1 <= OpenSSH < 9.8p1,奇安信的报告可以点我查看。

上我的几个云服务器(ubuntu22.04和CentOS8Strem)看了看版本,Ubuntu的服务器中招了

1
2
3
4
5
6
$ sshd -V
unknown option -- V
OpenSSH_8.9p1 Ubuntu-3ubuntu0.6, OpenSSL 3.0.2 15 Mar 2022
usage: sshd [-46DdeiqTt] [-C connection_spec] [-c host_cert_file]
[-E log_file] [-f config_file] [-g login_grace_time]
[-h host_key_file] [-o option] [-p port] [-u len]

CentOS的服务器因为依赖项确实老旧,没有中招,因祸得福了属于是。

1
2
3
4
5
6
# sshd -V
unknown option -- v
OpenSSH_8.0p1, OpenSSL 1.1.1k FIPS 25 Mar 2021
usage: sshd [-46DdeiqTt] [-C connection_spec] [-c host_cert_file]
[-E log_file] [-f config_file] [-g login_grace_time]
[-h host_key_file] [-o option] [-p port] [-u len]

不过本次攻击如果服务器上有fail2ban的话能被拦截掉。我的服务器都安装了1panel里面的fail2ban组件,好欸!

修复措施

参考博客:https://learnku.com/articles/87482 和论坛 https://linux.do/t/topic/124761

编译和安装依赖项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 安装编译依赖
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

# 重启
sudo systemctl restart ssh

可以用下面的命令一键升级(和上面的一致只是整合在一起了)

1
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 && sudo systemctl restart ssh

处理后重新看看版本更新了没有,如下所示就是OK了——吗?

1
2
# ssh -V
OpenSSH_9.8p1, OpenSSL 3.0.2 15 Mar 2022

实际上,上文的步骤只更新了ssh(客户端),而且是一个环境变量导致的“假更新”,sshd(服务端)还没有变化,还是旧版本。用可执行文件的绝对路径查看版本就会漏出鸡脚,依然是旧版本没有被正常升级。

1
2
# /usr/bin/ssh -V
OpenSSH_8.9p1 Ubuntu-3ubuntu0.10, OpenSSL 3.0.2 15 Mar 2022

要更新一下软连接,才能正确更新ssh/sshd。

1
2
3
4
5
6
7
8
9
10
11
# 备份原来的ssh组件
mv /usr/sbin/sshd /usr/sbin/sshd.old
mv /usr/bin/ssh /usr/bin/ssh.old
mv /usr/bin/ssh-keygen /usr/bin/ssh-keygen.old
# 更新
cp /usr/local/bin/ssh /usr/bin/ssh
cp /usr/local/bin/ssh-keygen /usr/bin/ssh-keygen
cp /usr/local/sbin/sshd /usr/sbin/sshd
# 重启服务
sudo systemctl restart ssh
sudo systemctl restart sshd

如下所示,更新成功。

1
2
3
4
# sshd -V
OpenSSH_9.8p1, OpenSSL 3.0.2 15 Mar 2022
# ssh -V
OpenSSH_9.8p1, OpenSSL 3.0.2 15 Mar 2022

注意,必须使用cp来修改文件,而不能使用软连接!

后续

注意,升级完毕sshd后会导致服务器的ssh密钥发生变化,如果你的本地曾经链接过这个主机,会出现本地记录的公钥和服务器升级ssh后重新发送的公钥不一致的情况。

这时候需要修改C:\Users\用户名\.ssh\known_hosts这个文件(使用记事本打开就行了),将里面对应云服务器IP开头的记录全部删除,再重新链接服务器。

如果您不执行这一步操作,一些严格检查密钥的ssh终端软件可能会无法连接服务器,比如vscode的remote ssh插件,tabby则会在重新链接服务器的时候弹出密钥不一致的警告。反正修改一下准没错,修改了之后重新接受并保存云服务器发过来的新密钥就可以了。

PS:vscode的remove ssh插件在出现密钥不一致的时候会显示链接不上远程服务器,但是在错误日志中会打印出密钥不一致和开启了严格检查相关的字样(当然打印的错误信息是全英文的),我也是因此定位到这个问题的。所以说遇到问题的时候,不要有畏难情绪,一定要敢于看日志,敢于查日志。