目录

一、故障重现

二、救援过程


一、故障重现

近日为了解决CVE-2021-3449: 拒绝服务漏洞、CVE-2021-3450: 证书校验漏洞,自己编译了openssl-1.1.1k。
亲测发现:
只升级openssl的版本,动态库版本没有升级,系统可用。
升级openssl版本,同时升级libcrypto.so.1.1动态库版本,导致严重的故障,系统不可用。

原因是详细描述在这https://github.com/openssl/openssl/issues/11471,因此不建议自行编译升级openssl。

如果贸然升级,替换了libcrypto.so.1.1动态库,将导致严重的故障:
ssh无法远程登录服务器
root等账户无法本地登录,登录时输入root账户直接报错Login Error
passwd命令遇到authentication token manipulation error报错。
yum、rpm等命令都依赖libcrypto.so.1.1,救援模式下也无法卸载高版本的openssl。

二、救援过程

先找一台linux服务器,挂磁盘,创建分区(本例/dev/sdc1),格式化,并挂在到/mnt

[root@toy ~]# mount /dev/sdc1 /mnt/
[root@toy ~]# cd /mnt

下载原来openssl-1.1.1g版本相关的rpm包,用rpm2cpio和cpio命令从rpm包提取归档文件,也就是原来可用的openssl、libcrypto.so、libssl.so等文件,这些文件提取出来后放在usr/bin和usr/lib64目录下。

[root@toy mnt]# rpm2cpio openssl-1.1.1g-12.el8_3.x86_64.rpm | cpio -dium
[root@toy mnt]# rpm2cpio openssl-devel-1.1.1g-12.el8_3.x86_64.rpm | cpio -dium
[root@toy mnt]# rpm2cpio openssl-libs-1.1.1g-12.el8_3.x86_64.rpm | cpio -dium
[root@toy mnt]# rpm2cpio openssl-perl-1.1.1g-12.el8_3.x86_64.rpm | cpio -dium
[root@toy mnt]# rpm2cpio openssl-pkcs11-0.4.10-2.el8.x86_64.rpm | cpio -dium

[root@toy mnt]# tree -L 2 usr/
usr/
├── bin
│   ├── CA.pl
│   ├── c_rehash
│   ├── make-dummy-cert
│   ├── openssl
│   ├── renew-dummy-cert
│   ├── tsget -> tsget.pl
│   └── tsget.pl
├── include
│   └── openssl
├── lib
├── lib64
│   ├── engines-1.1
│   ├── libcrypto.so -> libcrypto.so.1.1.1g
│   ├── libcrypto.so.1.1 -> libcrypto.so.1.1.1g
│   ├── libcrypto.so.1.1.1g
│   ├── libp11.so.3 -> libp11.so.3.4.2
│   ├── libp11.so.3.4.2
│   ├── libssl.so -> libssl.so.1.1.1g
│   ├── libssl.so.1.1 -> libssl.so.1.1.1g
│   ├── libssl.so.1.1.1g
│   └── pkgconfig
└── share
    ├── doc
    ├── licenses
    └── man

关闭这台服务器后,把这个磁盘挂在到故障服务器,启动后进入救援模式。

把这个分区(在这里就是/dev/sdb1)挂载到/sysroot/mnt目录。将提取的1.1.1g版本的归档文件,覆盖到相应的/bin、/lib64等目录,同时删除1.1.1k版本的库文件,ldconfig一下。再重启就可以正常登录服务器了。

switch_root:/# ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sdb  /dev/sdb1
switch_root:/# mount -o rw,remount /sysroot
switch_root:/# mount /dev/sdb1 /sysroot/mnt/
switch_root:/# chroot /sysroot/

sh-4.4# cd /mnt
sh-4.4# cp -r ./usr/bin/*   /usr/bin
sh-4.4# cp -r ./usr/lib64/* /usr/lib64
sh-4.4# rm /usr/lib64/libcrypto.so.1.1.1k
sh-4.4# rm /usr/lib64/libssl.so.1.1.1k
sh-4.4# ldconfig

sh-4.4# cd
sh-4.4# touch .autorelabel

sh-4.4# exit
switch_root:/# exit

进入服务器后用yum downgrade命令,降级重新安装openssl-1.1.1g。

yum downgrade openssl openssl-devel openssl-libs openssl-perl openssl-static --allowerasing

经验教训,升级务必使用测试机充分测试,虚拟化环境能做快照就做快照。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐