relocation error: /usr/lib64/libssl.so.10: symbol private_ossl_minimum_dh_bits, version libcrypto.so
果断快速解决办法,从相同版本系统复制文件:
/usr/lib64/libssl.so.1.0.1e
覆盖马上恢复
relocation error: /usr/lib64/libssl.so.10: symbol private_ossl_minimum_dh_bits, version libcrypto.so
果断快速解决办法,从相同版本系统复制文件:
/usr/lib64/libssl.so.1.0.1e
覆盖马上恢复
我们在最佳实践文章中建议大家如何去配置协议和密码套件,但是如果服务器软件(nginx、apache等)所使用的ssl协议库存在SSL漏洞,或者不支持那些现代化的密码套件和特性,那么无论你如何去修改配置都无法改善现在的安全问题。
所以我们在配置前,或者发现按照推荐配置进行了调整《SSL/TLS安全评估报告》还是无法满足要求,那么可以检查下所使用的OpenSSL等加密库是否版本过低。
nginx -V
nginx version: nginx/1.10.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
或者通过openssl命令查看(适用于非自己通过openssl源码编译的)
openssl version
OpenSSL 1.0.1以下不支持tls1.2
升级前请做好测试
https://www.trustasia.com/openssl-heartbleed
OpenSSL 1.0.1g 已修复该漏洞
OpenSSL 1.0.0 分支版本不受此漏洞影响
OpenSSL 0.9.8 分支版本不受此漏洞影响
OpenSSL 1.0.2 Beta2 不受此漏洞影响
Heartbleed检测工具>>
https://www.trustasia.com/OpenSSL-DROWN-attack
OpenSSL 1.0.1h+
OpenSSL 1.0.0m+
OpenSSL 0.9.8za+
https://www.trustasia.com/OpenSSL-CVE-2016-2107-Padding-Oracle
1、OpenSSL 1.0.2用户需更新到1.0.2h 。
2、OpenSSL 1.0.1用户需更新到1.0.1t 。
3、使用包管理系统的用户可以直接更新到2016年5月3日 之后的版本。
CBC padding oracle检测 检测工具>>
OpenSSL CCS漏洞
此漏洞是 OpenSSL ChangeCipherSpec 设计缺陷造成,被称为 CCS 注入漏洞。
https://www.trustasia.com/openssl-ccs
OpenSSL 1.1.0 应升级到 1.1.0a 或更高版本。
OpenSSL 1.0.2 应升级到 1.0.2i 或更高版本。
OpenSSL 1.0.1 应升级到 1.0.1u 或更高版本。
注意:
OpenSSL官方已停止对 0.9.8和 1.0.0 两个版本的升级维护,请使用这两个版本的用户将其升级至更高版本。
首先升级openssl 到 openssl-1.1.0h
wget https://www.openssl.org/source/openssl-1.1.0h.tar.gz
tar -zxvf openssl-1.1.0h.tar.gz
cd openssl-1.1.0h
./config –prefix=/usr
make
make install
openssl version -a
nginx配置参考:
listen 443 ssl http2;
add_header Strict-Transport-Security max-age=15768001;
ssl_certificate /usr/local/nginx/conf/vhost/Nginx/1_www.dnsdizhi.com_bundle.crt;
ssl_certificate_key /usr/local/nginx/conf/vhost/Nginx/2_www.dnsdizhi.com.key;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE;
ssl_prefer_server_ciphers on;
完毕后可以用:https://www.ssllabs.com/ssltest/ 或者 https://myssl.com/ 检查就是能达到A+,当然其实达到A就不错了。如facebook、v.qq.com、www.google.com都是A。区别在哪里?就是没有配置add_header Strict-Transport-Security max-age=15768001;,说真的就是不用配置的,没必要。
1、查看源版本
[root@zj ~]
# openssl version -a
OpenSSL 1.0.1e
2、下载openssl-1.0.1u.tar.gz
wget wget https://www.openssl.org/source/old/1.0.1/openssl-1.0.1u.tar.gz
3、更新zlib
yum
install
-y zlib
4、解压安装
tar
zxf openssl-1.0.1u.tar.gz
cd
openssl-1.0.1u.tar.gz
.
/config
shared zlib
make
make
install
mv
/usr/bin/openssl
/usr/bin/openssl
.bak
mv
/usr/include/openssl
/usr/include/openssl
.bak
ln
-s
/usr/local/ssl/bin/openssl
/usr/bin/openssl
ln
-s
/usr/local/ssl/include/openssl
/usr/include/openssl
echo
“
/usr/local/ssl/lib
” >>
/etc/ld
.so.conf
ldconfig -
v
5、查看是否升级成功
[root@zj ~]
# openssl version -a
OpenSSL 1.0.1u 22 Sep 2016
built on: Tue May 8 11:13:07 2018
platform: linux-x86_64
options: bn(64,64) rc4(8x,char) des(idx,cisc,16,int) idea(int) blowfish(idx)
compiler: gcc -I. -I.. -I../include -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -Wa,--noexecstack -m64 -DL_ENDIAN -O3 -Wall -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM
OPENSSLDIR: "/usr/ssl"
wget https://www.openssl.org/source/old/1.0.1/openssl-1.0.1u.tar.gz;tar -zxvf openssl-1.0.1u.tar.gz ;cd openssl-1.0.1u;./config --prefix=/usr;make;make install;ldconfig -v;openssl version -a
相关软件下载地址
Apache:http://httpd.apache.org/
Nginx:http://nginx.org/en/download.html
OpenSSL:http://www.openssl.org/
openssl-poc
附件说明
PoC.py : 漏洞利用测试PoC脚本
showssl.pl:OpenSSL动态库版本检测脚本
安装OpenSSL步骤
由于运营环境不同,以下过程仅供参考。openssl属于系统应用,被较多应用依赖,由于环境不同等因素,请先在测试环境进行充分测试。
从官方下载最新版本的opensssl库
wget https://www.openssl.org/source/openssl-1.0.1g.tar.gz
解压下载的openssl压缩包
tar -zxvf openssl-1.0.1g.tar.gz
进入解压后的openssl文件夹
cd openssl-1.0.1g
执行文件夹中的config文件,这里openssl的安装目录默认是/usr/local/ssl(由于系统环境差异路径可能不一致,下同),注意添加zlib-dynamic参数,使其编译成动态库
代码如下 | 复制代码 |
./config shared zlib-dynamic config完成后执行 make 命令 make make 命令执行完后再执行 make install 命令,安装openssl make install 重命名原来的openssl命令 mv /usr/bin/openssl /usr/bin/openssl.old 重命名原来的openssl目录 mv /usr/include/openssl /usr/include/openssl.old 将安装好的openssl 的openssl命令软连到/usr/bin/openssl ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl 将安装好的openssl 的openssl目录软连到/usr/include/openssl ln -s /usr/local/ssl/include/openssl /usr/include/openssl 修改系统自带的openssl库文件,如/usr/local/lib64/libssl.so(根据机器环境而定) 软链到升级后的libssl.so ln -s /usr/local/ssl/lib/libssl.so /usr/local/lib64/libssl.so 执行命令查看openssl依赖库版本是否为1.0.1g: strings /usr/local/lib64/libssl.so |grep OpenSSL 在/etc/ld.so.conf文件中写入openssl库文件的搜索路径 echo “/usr/local/ssl/lib” >> /etc/ld.so.conf 使修改后的/etc/ld.so.conf生效 |
ldconfig -v
查看现在openssl的版本是否是升级后的版本
openssl version
更新Webserver的 OpenSSL依赖库
如果webserver在安装编译时加载了openssl,还需对webserver进行重启或者重新编译操作。因webserver安装时分为动态编译和静态编译openssl两种方式,所以具体操作方式也不同。
判断webserver是否为动态编译ssl的两种方法
wget -c https://www.openssl.org/source/openssl-1.0.1s.tar.gz tar -zxvf openssl-1.0.1s.tar.gz cd openssl-1.0.1s ./config shared zlib-dynamic make && make install mv /usr/bin/openssl /usr/bin/openssl.old mv /usr/include/openssl /usr/include/openssl.old ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl ln -s /usr/local/ssl/include/openssl /usr/include/openssl ln -s /usr/local/ssl/lib/libssl.so /usr/local/lib64/libssl.so strings /usr/local/lib64/libssl.so |grep OpenSSL echo "/usr/local/ssl/lib" >> /etc/ld.so.conf ldconfig -v openssl version
通过ldd命令查看依赖库
查看编译参数
如输入以命令/usr/sbin/nginx -V,查看nginx的编译参数,参数中不存在–with-openssl则为动态编译ssl的,反之为静态:
更新OpenSSL库
a) 如果webserver是动态编译ssl安装的,直接重启apache,nginx等相应webserver服务即可。
b) 如果webserver是静态编译ssl安装的,可参照以下方法更新:
apache静态编译ssl的情况:
源码重新安装apache,使用ssl静态编译:
执行apache的configure文件时,除了业务需要的参数外,需要指定ssl为静态编译
代码如下 | 复制代码 |
./configure –enable-ssl=static –with-ssl=/usr/local/ssl (openssl的安装路径) |
安装apache
代码如下 | 复制代码 |
make && make install |
恢复原有apache配置,重启服务即可
nginx静态编译ssl的情况:
源码重新安装nginx,使用ssl静态编译:
执行nginx的configure文件时,除了业务需要的参数外,需要指定ssl为静态编译,编译参数带上–with-openssl便表明为静态编译ssl
代码如下 | 复制代码 |
./configure –with-http_ssl_module –with-openssl=/usr/local/ssl (openssl的安装路径) |
安装nginx
代码如下 | 复制代码 |
make && make install |
恢复原有nginx配置,重启服务即可
如有其他使用openssl的情况,参照apache和nginx的解决方式。
测试漏洞是否存在
使用附件PoC.py根据脚本提示检测是否存在漏洞。
如:
测试https://192.168.0.1漏洞是否存在执行命令如下
代码如下 | 复制代码 |
python PoC.py -p 443,8443 192.168.0.1 |
检测动态库libssl.so版本
检测当前进程使用的libssl.so版本
执行附件showssl.pl检查脚本,无信息输出或无漏洞版本openssl输出,表示升级成功;如输出中有unknown,请业务自查libssl.so.1.0.0的版本是否是受影响的版本。
(详情见附件)
代码如下 | 复制代码 |
#!/usr/bin/perl -w my @listInfo = `lsof |grep libssl|awk ‘{print $1″ “$2” “$NF}’|sort -u`; foreach my $info (@listInfo) { my ($procName, $procPid, $libPath) = split(/s/, $info); next if (!defined($procName) || !defined($procPid)|| !defined($libPath)); my $version = `strings $libPath|grep -E “^OpenSSL [0-9]+.[0-9]+”`; chomp $version; if ($version =~ /s*OpenSSLs*1.0.1[a-f]{0,2}/) { print “$procName($procPid) : $libPath ($version).n”; } } |
检测系统使用的libssl.so版本
执行命令:
代码如下 | 复制代码 |
strings /usr/local/lib64/libssl.so |grep OpenSSL |
查看openssl依赖库版本是否为1.0.1g
注:/usr/local/lib64/libssl.so 路径仅供参考,由具体机器环境决定,参考升级步骤