一、实验背景
zlib是一个通用的,无专利的,可供许多不同的程序使用的无损数据压缩库。
# yum info zlib
zlib1.2.8版本中的crc32.c文件的‘crc32_big’函数存在安全漏洞,攻击者可利用该漏洞造成拒绝服务(应用程序崩溃)。
zlib 安全漏洞
https://www.anquanke.com/vul/id/1143541
http://www.cnnvd.org.cn/web/xxk/ldxqById.tag?CNNVD=CNNVD-201612-754
yum仓里中,zlib的rpm包版本较低,需要从官网下载最新的源码包,编译安装升级。
二、实验环境
操作系统:CnetOS7.5
开发机: 192.168.1.101 (联网)
实验机: 192.168.1.102 (不联网)
三、实验预期
在开发机器上,用最新的zlib源码包,编译制作离线升级安装包,然后拉到实验机上升级zlib。
四、在开发机上安装编译工具
# yum -y install make gcc
三、在开发机上下载zlib源码包编译安装
查看原zlib版本
# wget https://www.zlib.net/zlib-1.2.11.tar.gz
# tar -zxvf zlib-1.2.11.tar.gz
# cd zlib-1.2.11
# ./configure --help
# ./configure --libdir=/lib64/
注意:这里我们没有加 --prefix=/usr/local/zlib 预安装目录,只加了 库文件的生成路径 --libdir=/lib64/
Linux默认的一些关于目录的软连接
# make
# make install
注意:从输出可以看出,make install 这一步实际上是对编译生成zlib相关文件的一个分发,也就是将编译生成文件拷贝到相关路径,我们在做离线升级安装包的时候,直接拷贝这些命令加到脚本就可以了!
卸载原zlib包,这样就完成zlib的升级
# rpm -qa | grep zlib | xargs rpm -e --nodeps
# rm -f /lib64/libz.so.1.2.7
注:卸载zlib,顺序很重要,如果卸早,上一步make就会失败,提示:zlib的库文件,libz.so*没有,无法完成编译!
zlib这个基础库相当重要,一旦玩崩了,会导致跟多基本命令无法使用,服务器重启起不来!
刷新系统库文件
# ldconfig
# ll /lib64/libz.*
从上可以看出,编译时带 --libdir=/lib64/ 新的库文件 直接就放置到了 /lib64/ 目录下了!
四、在开发机上制作离线升级安装包
在编译安装的 zlib-1.2.11目录新建 zlibUpgrade.sh 脚本
# vim zlib-1.2.11/zlibUpgrade.sh
##################################################
#!/bin/bash
parent_path=$( cd "$(dirname "${BASH_SOURCE}")" ; pwd -P )
cd "$parent_path"
rm -f /lib64//libz.a
cp libz.a /lib64/
chmod 644 /lib64//libz.a
cp libz.so.1.2.11 /lib64/
chmod 755 /lib64//libz.so.1.2.11
rm -f /usr/local/share/man/man3/zlib.3
cp zlib.3 /usr/local/share/man/man3
chmod 644 /usr/local/share/man/man3/zlib.3
rm -f /lib64//pkgconfig/zlib.pc
cp zlib.pc /lib64//pkgconfig
chmod 644 /lib64//pkgconfig/zlib.pc
rm -f /usr/local/include/zlib.h /usr/local/include/zconf.h
cp zlib.h zconf.h /usr/local/include
chmod 644 /usr/local/include/zlib.h /usr/local/include/zconf.h
rpm -qa | grep zlib | xargs rpm -e --nodeps
rm -rf /lib64/libz.so.1.2.7
ldconfig
ls -l /lib64/libz*
######################################################
# chmod +x zlib-1.2.11/zlibUpgrade.sh
# tar -zcf zlib-1.2.11Upgrade.tar.gz zlib-1.2.11
如果需要批量升级其他机器,没有必要在每台机器上都编译安装一遍,将zlib-1.2.11Upgrade.tar.gz拷贝过去,解压执行脚本即可完成升级。
你也可以将其做成ansible playbook,用ansible完成批量升级安装。
五、升级测试机的zlib
# tar -zxf zlib-1.2.11Upgrade.tar.gz
# cd zlib-1.2.11
# sh -x zlibUpgrade.sh
# ll /lib64/libz.*
六、参考
zlib home site
https://www.zlib.net/
处理绿盟科技安全评估的系统漏洞
https://www.cnblogs.com/xiaolinstudy/p/10069015.html
Linux系统删除zlib导致系统不能正常开机解决办法
https://blog.csdn.net/waitinghxl/article/details/50233437?utm_source=blogxgwz4