【救援过程】升级openssl导致libcrypto.so.1.1动态库不可用

news/2024/7/2 23:03:04

目录

一、故障重现

二、救援过程


一、故障重现

近日为了解决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# ldconfigsh-4.4# cd
sh-4.4# touch .autorelabelsh-4.4# exit
switch_root:/# exit

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

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

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


http://lihuaxi.xjx100.cn/news/235887.html

相关文章

201671030129 周婷 《英文文本统计分析》结对项目报告

项目内容这个作业属于哪个课程软件工程这个作业的要求在哪里软件工程结对项目课程学习目标熟悉软件开发整体流程及结对编程,提升自身能力本次作业在哪个具体方面帮助我们实现目标体验组队编程,体验一个完整的工程任务一: 作业所点评博客GetHu…

Ansible01-Ansible基础和部署

目录 一、Ansible简介 二、安装部署Ansible 2.1、在控制节点安装ansible 2.2、对Linux和Unix受管节点要求 2.3、基于 Microsoft Windows 的受管主机 2.4、受管网络设备 三、Ansible配置文件 3.1、ansible.cfg配置文件推荐做法 3.2、ansible.cfg配置文件内容 四、Ansi…

循环获取结构体中的健名与值的实现

为什么80%的码农都做不了架构师&#xff1f;>>> type Person struct {Name stringAge int }func main() {a : &Person{"Name", 1}v : reflect.ValueOf(a).Elem() //a需要是引用k : v.Type()for i : 0; i < v.NumField(); i {key : k.Field(i)…

Ansible02-实施playbook

一、编写和运行playbook 1.1、编写playbook play 是针对清单中选定的主机运行的一组有序任务。playbook 是一个文本文件&#xff0c;其中包含由一个或多个按特定顺序运行的 play 组成的列表。 playbook 是以 YAML 格式编写的文本文件&#xff0c;通常使用扩展名 .yml 保存。…

P1541 乌龟棋 题解(洛谷,动态规划递推)

题目:P1541 乌龟棋 感谢大神的题解(他的写的特别好) 写一下我对他的代码的理解吧(哎,蒟蒻就这能这样...) 代码: #include<bits/stdc.h> #define ll long long using namespace std; ll num[350100]; ll p[5]; ll f[41][41][41][41]; int main() {ios::sync_with_stdio(fa…

【重磅上线】思维导图工具XMind:ZEN基础问题详解合集

XMind是XMind Ltd公司旗下一款出色的思维导图和头脑风暴软件。黑暗的UI设计、独特的ZEN模式、丰富的风格和主题、多分支的颜色等等功能会让你的工作更加便捷与高效。在视觉感官上也会给你带来最佳的体验感。 对于初学者来说&#xff0c;肯定会遇到各种各样的问题&#xff0c;有…

Ansible03-管理变量、加密、事实

目录 一、管理变量 1.1、变量的基本用法 1.2、使用已注册变量捕获命令输出 二、管理加密 2.1、ansible-vault常用场景 三、管理事实 3.1、事实基本用法 3.2、创建自定义事实 3.3、魔法变量hostvars、group_names、groups、inventory_hostname 一、管理变量 1.1、变量…