OpenSSL的严重bug

OpenSSL今天曝出一严重Bug,牵连的版本非常多,多个linux发行版中招。

Bug详情

OpenSSL v1.0.1到1.0.1f中发现了一个非常严重bug(CVE-2014-0160),该bug允许攻击者读取存在bug的系统的64kb处理内存,暴露加密流量的密钥,用户的名字和密码,以及访问的内容。攻击者可以利用该bug窃听通信,直接从服务和用户窃取数据。OpenSSL已经发布了1.0.1g修正bug,Debian发行版也在半小时修复了bug,Fedora发布了一个权宜的修正方案。

该bug是在2011年引入到OpenSSL中,使用OpenSSL 0.9.8的发行版不受影响,但Debian Wheezy、Ubuntu 12.04.4、 Centos 6.5、Fedora 18、SuSE 12.2、OpenBSD 5.4、FreeBSD 8.4和NetBSD 5.0.2之后的版本都受到影响。如果你运行存在该bug的系统,那么最好废除所有密钥。【摘自OpenSSL严重bug允许攻击者读取64k内存,Debian半小时修复

查看系统OpenSSL情况

openssl version -a命令查看版本,如果发现版本号刚好处于v1.0.1到v1.0.1f间,恭喜!躺着中枪的感觉。赶紧升级版本吧!

升级

目前centos和ubuntu各软件源均未添加修复版升级,可自行去OpenSSL官网下载最新的1.0.1g版本安装。

遇到问题,可参看:O​p​e​n​s​s​l​ ​升​级​遇​到​的​问​题,其他问题google即可。

详细解决方案

截止4月9日,各大安全厂商和平台陆续推出升级方案,这里总结如下:

存在此漏洞的版本OpenSSL 1.0.1 和OpenSSL 1.0.2-beta存在此漏洞,更老版本OpenSSL(1.0.0和0.9.8)不受影响 ,但官网有相关patch,所以建议升级。

检查相关服务是否有此漏洞:

修补方法:

  • 如果为OpenSSL 1.0.1版本,应尽快升级到OpenSSL 1.0.1g(已修复漏洞)
  • 无法立即升级的用户可以加-DOPENSSL_NO_HEARTBEATS参数重新编译OpenSSL
  • 如果为OpenSSL 1.0.2-beta版本,建议暂时用OpenSSL 1.0.1g替代,等OpenSSL 1.0.2-beta2修复版本发布,再更新至OpenSSL 1.0.2-beta2

具体实施:

  • 希望安装OpenSSL 1.0.1g,则按如下方式操作
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    wget http://www.openssl.org/source/openssl-1.0.1g.tar.gz 
    tar -zxvf openssl-1.0.1g.tar.gz && cd openssl-1.0.1g/
    ./config
    make && make install
    echo "/usr/local/ssl/lib" >> /etc/ld.so.conf
    ldconfig -v
    openssl version -a #验证版本正确升级
    ```

    - 如果不方便立即升级,建议重新下载源码加-DOPENSSL_NO_HEARTBEATS参数编译安装(OpenSSL 1.0.1e为例)

wget http://www.openssl.org/source/openssl-1.0.1e.tar.gz
tar -zxvf openssl-1.0.1e.tar.gz && cd openssl-1.0.1e/
./config -DOPENSSL_NO_HEARTBEATS
make && make install
echo “/usr/local/ssl/lib” >> /etc/ld.so.conf
ldconfig -v
openssl version -a | grep DOPENSSL_NO_HEARTBEATS #验证版本正确升级

1
2

- 确认依赖OpenSSL库的服务,例如nginx, apache等web服务,如果是静态编译了openssl库的,需要在升级完OpenSSL后重新编译服务程序,使用动态链接库的,需要重启一下服务

mv /usr/bin/openssl{,.OFF}
mv /usr/include/openssl{,.OFF}
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
openssl version -a #验证版本正确升级

1
2
3
4
5
6
7
8

- 如果发现升级出现问题可以采用一下方法进行回滚OpenSSL
```shell
rm -rf /usr/bin/openssl /usr/include/openssl
mv /usr/bin/openssl{.OFF,}
mv /usr/include/openssl{.OFF,}
sed s#/usr/local/ssl/lib##g /etc/ld.so.conf
ldconfig -v