【救援过程】升级openssl导致libcrypto.so.1.1动态库不可用
编译打包openssl-1.1.1k并给服务器升级,由于1.1.1k版本的libcrypto.so.1.1动态库与1.1.1g版本的不同,导致有依赖的命令均不能正常使用。不建议自行升级openssl到1.1.1k,特别是不要替换libcrypto.so.1.1动态库。yum、rpm命令也依赖libcrypto.so库,在救援模式下调用yum、rpm卸载openssl-1.1.1k也不可能。最终提取
目录
一、故障重现
近日为了解决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
经验教训,升级务必使用测试机充分测试,虚拟化环境能做快照就做快照。
更多推荐
所有评论(0)