SSL weak ciphers 漏洞修复过程

2,404

故事前言

最近接到了一个安全漏洞:ssl weak ciphers。一开始接到这个漏洞讲真,觉得一脸懵逼。发现触及知识点盲区了。。没办法,那我们一步一步去解剖。 首先这个问题在网上查阅时候,大多数都会带上 TLS/SSL ciphers。所以这里也一起讲解一下。

知识储备

什么是 TLS

TLS定义

TLS(Transport Layer Security,安全传输层),一种加密协议。TLS是建立在传输层TCP协议之上的协议,服务于应用层,它的前身是SSL(Secure Socket Layer,安全套接字层),以SSL 3.0 作为基础版。它实现了将应用层的报文进行加密后再交由TCP进行传输的功能。

TLS如何工作

TLS可以用于传输层安全协议(例如TCP)之上。TLS包含三个主要组件:加密,身份验证和完整性。

  • 加密:隐藏从第三方传输的数据。(通过加密方式实现)
  • 认证:确保交换信息的各方是他们声称的身份。(双方认证证书)
  • 完整性:验证数据是否未被伪造或篡改。(MAC 地址)

TLS握手过程

sequenceDiagram
    Client->>Server:ClientHello
    Server->>Client:ServerHello
    Server-->>Client:SendCertificate、Request Certificate
    Server->>Client:ServerHelloDone
    
    Client->>Server:ClientKeyExchange
    Client->>Server:ChangeCipherSpec
    Client->>Server:Finashed
    
    Server->>Client:ChangeCipherSpec
    Server->>Client:Finished

TLS 发展过程

  • 1995: SSL 2.0, 由Netscape提出,这个版本由于设计缺陷,并不安全,很快被发现有严重漏洞,已经废弃。
  • 1996: SSL 3.0. 写成RFC,开始流行。目前(2015年)已经不安全,必须禁用。
  • 1999: TLS 1.0. 互联网标准化组织ISOC接替NetScape公司,发布了SSL的升级版TLS 1.0版
  • 2006: TLS 1.1. 作为 RFC 4346 发布。主要修复了CBC模式相关的如BEAST攻击等漏洞
  • 2008: TLS 1.2. 作为 RFC 5246 发布 。增进安全性,目前应该主要部署的版本
  • 2015之后: TLS 1.3,还在制订中,支持0-rtt,大幅增进安全性,砍掉了aead之外的加密方式

什么是 SSL

其实就是上面说的 Secure Socket Layer,安全套接字层。位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL记录协议和SSL握手协议。 TLS 则是以SSL 3.0 作为基础推出的。

问题分析

漏洞定义

参考 :www.acunetix.com/vulnerabili…

语言 漏洞 描述
English SSL weak ciphers The remote host supports the use of SSL ciphers that offer either weak encryption or no encryption at all.
中文 SSL弱密码 远程主机支持使用SSL密码,该密码提供弱加密或完全不加密。

漏洞理解

估计就是开放了 SSL ,以及一些密码套件问题。为了确保数据传输的安全,TLS / SSL使用一个或多个密码套件。密码套件是身份验证,加密和消息身份验证代码(MAC)算法的组合。在TLS / SSL连接的安全设置协商以及数据传输期间使用它们。

处理办法

1. 禁用SSL 2.0 和 SSL 3.0

SSL 2.0是SSL的第一个公开版本。它于1995年发布。此版本的SSL包含多个安全问题。1996年,对协议进行了完全重新设计,并发布了SSL 3.0。

由于安全问题,SSL 2.0协议不安全,您应该完全禁用它。由于存在POODLE(在降级的传统加密上填充Oracle)漏洞,SSL 3.0也不安全,您也应该禁用它。如果启用,攻击者可能会检索安全连接的纯文本内容。此外,您不能在SSL 3.0中使用椭圆曲线密码术(请参阅下文)。

Internet Explorer 6是唯一仍使用SSL 3.0的浏览器。因此,除非仍然需要支持旧版Internet Explorer 6浏览器,否则应禁用SSL 3.0,如下所述。

2. 禁用 TLS 1.0 和 1.1

除非需要支持旧版浏览器,否则还应禁用TLS 1.0和TLS 1.1。PCI DSS(支付卡行业数据安全标准)指定从2018年6月30日起,将不再使用TLS 1.0。它还强烈建议您禁用TLS 1.1。这些协议可能会受到诸如FREAK,POODLE,BEAST和CRIME之类的漏洞的影响。如果您仍然必须支持TLS 1.0,请禁用TLS 1.0压缩以避免CRIME攻击。

您还应该禁用弱密码,例如DES和RC4。DES可能会在几个小时内损坏,并且发现RC4比以前认为的要弱。过去,建议使用RC4作为减轻BEAST攻击的一种方法。但是,由于对RC4的最新攻击,Microsoft已发布了针对它的公告。PCI DSS还禁止使用RC4批量密码。

如果禁用TLS 1.0和TLS 1.1,则以下用户代理及其旧版本可能会受到影响(不同操作系统上的特定用户代理版本可能会有所不同)。

  • Android 4.3
  • 铬29
  • 火狐26
  • Internet Explorer 10
  • Java 6u45、7u25
  • OpenSSL 0.9.8y
  • Safari 6.0

如何配置 TLS

Nginx的

根据您的业务用例(例如,需要支持旧版浏览器和法规要求),您可能需要使用略有不同的密码套件配置。您可以使用Mozilla SSL配置生成器来使用不同的浏览器配置文件(现代,中级或旧版)获得最佳的TLS配置。或者可以手动生成:ssl-config.mozilla.org/#server=ngi…

  1. 高级
# generated 2019-12-30, https://ssl-config.mozilla.org/#server=nginx&server-version=1.17.0&config=modern
server {
    listen 80 default_server;
    listen [::]:80 default_server;

    # redirect all HTTP requests to HTTPS with a 301 Moved Permanently response.
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    # certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
    ssl_certificate /path/to/signed_cert_plus_intermediates;
    ssl_certificate_key /path/to/private_key;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
    ssl_session_tickets off;

    # modern configuration
    ssl_protocols TLSv1.3;
    ssl_prefer_server_ciphers off;

    # HSTS (ngx_http_headers_module is required) (63072000 seconds)
    add_header Strict-Transport-Security "max-age=63072000" always;

    # OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;

    # verify chain of trust of OCSP response using Root CA and Intermediate certs
    ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates;

    # replace with the IP address of your resolver
    resolver 127.0.0.1;
}
  1. 中级
# generated 2019-12-30, https://ssl-config.mozilla.org/#server=nginx&server-version=1.17.0&config=intermediate
server {
    listen 80 default_server;
    listen [::]:80 default_server;

    # redirect all HTTP requests to HTTPS with a 301 Moved Permanently response.
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    # certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
    ssl_certificate /path/to/signed_cert_plus_intermediates;
    ssl_certificate_key /path/to/private_key;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
    ssl_session_tickets off;

    # curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam.pem
    ssl_dhparam /path/to/dhparam.pem;

    # intermediate configuration
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;

    # HSTS (ngx_http_headers_module is required) (63072000 seconds)
    add_header Strict-Transport-Security "max-age=63072000" always;

    # OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;

    # verify chain of trust of OCSP response using Root CA and Intermediate certs
    ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates;

    # replace with the IP address of your resolver
    resolver 127.0.0.1;
}
  1. 旧版
# generated 2019-12-30, https://ssl-config.mozilla.org/#server=nginx&server-version=1.17.0&config=old
server {
    listen 80 default_server;
    listen [::]:80 default_server;

    # redirect all HTTP requests to HTTPS with a 301 Moved Permanently response.
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    # certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
    ssl_certificate /path/to/signed_cert_plus_intermediates;
    ssl_certificate_key /path/to/private_key;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
    ssl_session_tickets off;

    # openssl dhparam 1024 > /path/to/dhparam.pem
    ssl_dhparam /path/to/dhparam.pem;

    # old configuration
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA;
    ssl_prefer_server_ciphers on;

    # HSTS (ngx_http_headers_module is required) (63072000 seconds)
    add_header Strict-Transport-Security "max-age=63072000" always;

    # OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;

    # verify chain of trust of OCSP response using Root CA and Intermediate certs
    ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates;

    # replace with the IP address of your resolver
    resolver 127.0.0.1;
}

参考文献:www.acunetix.com/blog/articl…