• (转)OpenSSL CVE-2016-0800 和 CVE-2016-0703 漏洞修复细节拾趣


    原文:https://www.freebuf.com/vuls/97727.html

    1. 引子

    本来最近和360 Nirvan Team的DQ430愉快的参加某加密厂商的年度大会,结果openssl也出来碰热闹,也许真是为了DH兄弟送大礼,苦了我们这些安全运维的。

    感谢Shawn的指点!
    hf! 

    2. 细节

    360在内部信息安全实践历程中,“360信息安全部”逐步秉承最佳安全实践,在https等ssl领域逐渐做出了明显的变化。

    比如重要系统中禁止不安全的加密套件使用,来减少ssl的攻击面。

    我们在今天的内部运维修复中发现了个有趣的现象或者说尝试,我们想去确定禁止不安全的加密套件会对今天的两个高危漏洞有什么影响。

    CVE-2016-0800
    CVE-2016-0703

    0800漏洞官方已经描述了如果是cipher none的话,能保证是不受影响的,或者说这是一个缓解措施。

    但是0703就不一样了,我们花了几个小时尝试去证明如果ciphernone的话确实也是不受影响的。

    0703过程大略如下:

    client:
    send hello msg ( 包括 ciphers,和一个随机数 cr )
    server:
    send hello msg ( 包括 ciphers,和一个随机数 sr )
    client:
    send  masterkey msg ( 指定一个 cipher,且包含 masterkey 的一部分明文 mkc 和一部分密文 mks,mkc长度可为0 )
    server:
    send verify msg
    client:
    send finish msg
    server:
    send finish msg

    这个过程由于client可以指定不安全的算法(RC4-MD5  SSLv2 Kx=RSA(512) Au=RSA  Enc=RC4(40)   Mac=MD5  export)
    导致密文部分只有40bit

    client 根据 cr, mk = mkc||mks, 和收到的 verify msg,可计算出 server key

    server_key =MD5(mk||”0″||cr||sr)

    所以我们认为攻击的条件依然需要类似RC4_128_WITH_MD5 的套件。

    a、关键是 client 指定了 export cipher,导致 mks 只有5个字节

    b、不止 RC4_128_WITH_MD5 一个 export,默认情况,openssl 编译出来共有两个 exportcipher:

    EXP-RC2-CBC-MD5         SSLv2Kx=RSA(512) Au=RSA  Enc=RC2(40)   Mac=MD5  export

    EXP-RC4-MD5            SSLv2 Kx=RSA(512) Au=RSA  Enc=RC4(40)   Mac=MD5  export

    c、计算出的 server_key 是 session key,双方可以互相计算

    server_key = MD5(mk||”0″||cr||sr)
    client_key = MD5(mk||”1″||cr||sr)
    (“||”见 RSA PKCS1#v1.5)

    d、server 回应的 verify msg 中大有玄机,是最终利用的关键,与sslv2标准有关,且听下回分解吧。

    3. 结尾

    虽然能表明“360信息安全部”的安全实践能有效抵挡 CVE-2016-0703的攻击,但在此依然希望大家按照官方的建议去升级对应的补丁。

    gl!

    以下是我们的基本修复建议:

    漏洞编号:CVE-2016-0703

    漏洞说明:
    使用OpenSSL并支持SSLv2协议的服务器可接受指向长度非零非导出密钥组件的SSLv2连接握手,攻击者可利用这个缺陷解密已经建立的加密会话。

    漏洞等级:高

    漏洞编号:  CVE-2016-0800

    漏洞说明:
    SSLv2协议中存在一个填充内容缺陷,攻击者可以利用这个缺陷解密使用新版SSL/TLS协议会话中由RSA算法加密的内容。通过这种利用方式,可造成DROWN攻击(Decrypting RSA usingObsolete and Weakened eNcryption)

    漏洞等级:高

    漏洞详情:地址 

    受影响的服务版本:
    Apache:                     非2.4.x版本
    Nginx:                        0.7.64、0.8.18及更早版本
    Postfix:                      早于2.9.14、2.10.8、2.11.6、3.0.2的版本 (在2015.07.20之前发布)
    Openssl:                    1.0.2a、1.0.1m、1.0.0r、0.9.8zf及更早版本

    检测方式

    OpenSSL版本检测:

    openssl   version
    若版本低于修复版本请更新openssl

    针对web  server:

    openssl s_client -connect  待测域名或IP:443-ssl2

    针对SMTP server:

    openssl s_client -connect  待测域名或IP:25-starttls smtp -ssl2

    如果出现如下错误信息,则SSLv2已禁用:

    419:error:1407F0E5:SSL routines:SSL2_WRITE:ssl handshake failure:s2_pkt.c:428:

    修复步骤

    (1). 升级OpenSSL软件包

    CentOS、Redhat 可以通过以下命令来升级

    #yum clean
    #yum update openssl

    对应的RPM包:
    CentOS5:                  openssl-0.9.8e-39.el5_11、   openssl-devel-0.9.8e-39.el5_11、          openssl-perl-0.9.8e-39.el5_11
    CentOS6:                  openssl-1.0.1e-42.el6_7.4、 openssl-devel-1.0.1e-42.el6_7.4、         openssl-perl-1.0.1e-42.el6_7.4、   openssl-static-1.0.1e-42.el6_7.4
    CentOS7:                  openssl-1.0.1e-51.el7_2.4、 openssl-devel-1.0.1e-51.el7_2.4、         openssl-libs-1.0.1e-51.el7_2.4、   openssl-perl-1.0.1e-51.el7_2.4、        openssl-static-1.0.1e-51.el7_2.4

    (2). ubuntu 版本可以通过以下命令来升级

    #apt-get upgrade openssl

    2. 禁用 Apache、Nginx、Postfix 中的SSLv2

    在Apache 的 SSL 配置文件中禁用SSLv2
    SSLProtocol all -SSLv2
    重启apache服务

    在 Nginx 的 SSL 配置文件中设置只允许使用 TLS 协议:

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    重启nginx服务

    在Postfix配置中禁用SSLv2

    # Minimal recommended settings.  Whenever the built-in defaults are
    # sufficient, let the built-in defaults stand by deleting any explicit
    #overrides.  The default mandatory TLS protocols have never included
    # SSLv2,check to make sure you have not inadvertently enabled it.
    smtpd_tls_protocols= !SSLv2, !SSLv3
    smtpd_tls_mandatory_protocols= !SSLv2, !SSLv3
    tlsproxy_tls_protocols= $smtpd_tls_protocols
    tlsproxy_tls_mandatory_protocols= $smtpd_tls_mandatory_protocols
    smtp_tls_protocols= !SSLv2, !SSLv3
    smtp_tls_mandatory_protocols= !SSLv2, !SSLv3
    lmtp_tls_protocols= !SSLv2, !SSLv3
    lmtp_tls_mandatory_protocols= !SSLv2, !SSLv3
    smtpd_tls_ciphers= medium
    smtp_tls_ciphers= medium
    # Other bestpractices
    # Stronglyrecommended:
    #http://www.postfix.org/FORWARD_SECRECY_README.html#server_fs
    smtpd_tls_dh1024_param_file=${config_directory}/dh2048.pem
    smtpd_tls_eecdh_grade= strong
    # Suggested,not strictly needed:
    smtpd_tls_exclude_ciphers=
    EXPORT, LOW,MD5, SEED, IDEA, RC2
    smtp_tls_exclude_ciphers=
    EXPORT, LOW,MD5, aDSS, kECDHe, kECDHr, kDHd, kDHr, SEED, IDEA, RC2
  • 相关阅读:
    Python标准库:内置函数dict(**kwarg)
    如何把 excel 的数据导入到数据库里面去
    正在载入数据中效果
    站点公司亚马逊砸了10亿也没能做成智能手机,技术是须要沉淀和积累的
    零积分下载,2014年辛星mysql教程秋季版第一本已经完工,期待您的支持
    【C语言】在两个数成对出现的数组中找到一个单独的数。
    3.跟我学solr---使用solrj加入索引
    使用CAShapeLayer的path属性与UIBezierPath画出扫描框
    UI设计四要素
    swift 工作日志
  • 原文地址:https://www.cnblogs.com/liujiacai/p/10219833.html
Copyright © 2020-2023  润新知