HTTPS non sempre é tan seguro como parece. Atopáronse vulnerabilidades no 5,5% dos sitios HTTPS

HTTPS non sempre é tan seguro como parece. Atopáronse vulnerabilidades no 5,5% dos sitios HTTPS
Un dos principais sitios de Alexa (círculo central), protexido por HTTPS, con subdominios (gris) e dependencias (branco), entre os que hai outros vulnerables (sombreado discontinuo)

Hoxe en día, a icona de conexión segura HTTPS converteuse nun estándar e mesmo nun atributo necesario de calquera sitio serio. Se certificado falta, case todos os navegadores recentes mostran unha advertencia de que a conexión ao sitio "non é segura" e non recomenda transferirlle información confidencial.

Pero resulta que a presenza dun "bloqueo" na barra de enderezos non sempre garante a protección. Comprobando 10 sitios principais a partir da valoración, Alexa mostrou que moitos deles están suxeitos a vulnerabilidades críticas nos protocolos SSL/TLS, normalmente a través de subdominios ou dependencias. Segundo os autores do estudo, a complexidade das aplicacións web modernas aumenta moito a superficie de ataque.

Resultados da investigación

O estudo foi realizado por expertos da Universidade de Venecia Ca' Foscari (Italia) e da Universidade Técnica de Viena. Presentarán un informe detallado no 40th IEEE Symposium on Security and Privacy, que se celebrará do 20 ao 22 de maio de 2019 en San Francisco.

Probáronse os 10 principais sitios HTTPS da lista de Alexa e 000 hosts relacionados. Detectáronse configuracións criptográficas vulnerables en 90 hosts, é dicir, aproximadamente o 816% do total:

  • 4818 vulnerable a MITM
  • 733 son vulnerables ao descifrado TLS completo
  • 912 son vulnerables ao descifrado TLS parcial

898 sitios están completamente abertos á piratería, é dicir, permiten a inxección de scripts de terceiros, e 977 sitios cargan contido de páxinas mal protexidas coas que un atacante pode interactuar.

Os investigadores subliñan que entre os 898 recursos "completamente comprometidos" atópanse tendas en liña, servizos financeiros e outros grandes sitios. 660 de 898 sitios descargan scripts externos de hosts vulnerables: esta é a principal fonte de perigo. Segundo os autores, a complexidade das aplicacións web modernas aumenta moito a superficie de ataque.

Tamén se atoparon outros problemas: o 10% dos formularios de autorización teñen problemas coa transmisión segura de información, que ameaza con filtrar contrasinais, 412 sitios permiten a interceptación de cookies e o secuestro de sesións e 543 sitios están suxeitos a ataques á integridade das cookies (a través de subdominios). .

O problema é que nos últimos anos nos protocolos SSL/TLS e software identificou unha serie de vulnerabilidades: POODLE (CVE-2014-3566), BEAST (CVE-2011-3389), CRIME (CVE-2012-4929), BREACH (CVE-2013-3587) e Heartbleed (CVE-2014-0160). Para protexerse contra eles, requírese unha serie de opcións no servidor e no cliente para evitar o uso de versións vulnerables antigas. Pero este é un procedemento bastante non trivial, porque tales opcións implican escoller entre un amplo conxunto de cifrados e protocolos, que son bastante difíciles de entender. Non sempre está claro que paquetes e protocolos de cifrado se consideran "o suficientemente seguros".

Configuración recomendada

Non hai ninguén aprobado e acordado oficialmente lista de opcións HTTPS recomendadas. Entón, Xerador de configuración SSL de Mozilla ofrece varias opcións de configuración, dependendo do nivel de protección requirido. Por exemplo, aquí tes a configuración recomendada para un servidor nginx 1.14.0:

Modo moderno

Clientes compatibles máis antigos: Firefox 27, Chrome 30, IE 11 en Windows 7, Edge, Opera 17, Safari 9, Android 5.0 e Java 8

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:SSL:50m;
ssl_session_tickets off;


# modern configuration. tweak to your needs.
ssl_protocols TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
ssl_prefer_server_ciphers on;

# HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
add_header Strict-Transport-Security max-age=15768000;

# OCSP Stapling ---
# fetch OCSP records from URL in ssl_certificate and cache them
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;

resolver <IP DNS resolver>;

....
}

Soporte medio

Clientes compatibles máis antigos: Firefox 1, Chrome 1, IE 7, Opera 5, Safari 1, Windows XP IE8, Android 2.3, Java 7

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:SSL:50m;
ssl_session_tickets off;

# Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
ssl_dhparam /path/to/dhparam.pem;

# intermediate configuration. tweak to your needs.
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;

# HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
add_header Strict-Transport-Security max-age=15768000;

# OCSP Stapling ---
# fetch OCSP records from URL in ssl_certificate and cache them
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;

resolver <IP DNS resolver>;

....
}

Soporte antigo

Clientes compatibles máis antigos: Windows XP IE6, Java 6

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:SSL:50m;
ssl_session_tickets off;

# Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
ssl_dhparam /path/to/dhparam.pem;

# old configuration. tweak to your needs.
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:DES-CBC3-SHA:HIGH:SEED:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!RSAPSK:!aDH:!aECDH:!EDH-DSS-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA:!SRP';
ssl_prefer_server_ciphers on;

# HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
add_header Strict-Transport-Security max-age=15768000;

# OCSP Stapling ---
# fetch OCSP records from URL in ssl_certificate and cache them
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;

resolver <IP DNS resolver>;

....
}

Recoméndase que use sempre o paquete de cifrado completo e a última versión de OpenSSL. O conxunto de cifrado na configuración do servidor especifica a prioridade na que se utilizarán, dependendo da configuración do cliente.

A investigación mostra que non é suficiente instalar un certificado HTTPS. "Aínda que non manexamos as cookies como o fixemos en 2005, e o 'TLS decente' converteuse nun lugar común, resulta que estas cousas básicas non son suficientes para garantir un número sorprendentemente grande de sitios moi populares". din eles os autores da obra. Para protexer de forma fiable a canle entre o servidor e o cliente, cómpre supervisar coidadosamente a infraestrutura dos seus propios subdominios e hosts de terceiros desde os que se entrega o contido do sitio. Quizais teña sentido pedir unha auditoría a algunha empresa de terceiros especializada en seguridade da información.

HTTPS non sempre é tan seguro como parece. Atopáronse vulnerabilidades no 5,5% dos sitios HTTPS

Fonte: www.habr.com