HTTPS non è sempre così sicuro come sembra. Vulnerabilità riscontrate nel 5,5% dei siti HTTPS

HTTPS non è sempre così sicuro come sembra. Vulnerabilità riscontrate nel 5,5% dei siti HTTPS
Uno dei migliori siti di Alexa (cerchio centrale), protetto da HTTPS, con sottodomini (grigio) e dipendenze (bianco), tra cui ce ne sono di vulnerabili (ombreggiatura tratteggiata)

Al giorno d'oggi, l'icona della connessione sicura HTTPS è diventata uno standard e persino un attributo necessario di qualsiasi sito serio. Se certificato mancante, quasi tutti i browser recenti mostrano un avviso che la connessione al sito è "non sicura" e sconsigliamo di trasferirvi informazioni riservate.

Ma si scopre che la presenza di un "lucchetto" nella barra degli indirizzi non sempre garantisce protezione. Controllo di 10 siti principali dalla valutazione, Alexa ha dimostrato che molti di essi sono soggetti a vulnerabilità critiche nei protocolli SSL/TLS, solitamente tramite sottodomini o dipendenze. Secondo gli autori dello studio, la complessità delle moderne applicazioni web aumenta notevolmente la superficie di attacco.

Risultati dello studio

Lo studio è stato condotto da esperti dell'Università Ca' Foscari di Venezia (Italia) e del Politecnico di Vienna. Presenteranno un rapporto dettagliato al 40° IEEE Symposium on Security and Privacy, che si terrà dal 20 al 22 maggio 2019 a San Francisco.

Sono stati testati i primi 10 siti HTTPS dell'elenco Alexa e 000 host correlati. Sono state rilevate configurazioni crittografiche vulnerabili su 90 host, ovvero circa il 816% del totale:

  • 4818 vulnerabile al MITM
  • 733 sono vulnerabili alla decrittazione TLS completa
  • 912 sono vulnerabili alla decrittazione TLS parziale

898 siti sono completamente aperti all'hacking, ovvero consentono l'iniezione di script estranei e 977 siti caricano contenuti da pagine scarsamente protette con cui un utente malintenzionato può interagire.

I ricercatori sottolineano che tra le 898 risorse “completamente compromesse” ci sono negozi online, servizi finanziari e altri siti di grandi dimensioni. 660 siti su 898 scaricano script esterni da host vulnerabili: questa è la principale fonte di pericolo. Secondo gli autori, la complessità delle moderne applicazioni web aumenta notevolmente la superficie di attacco.

Sono stati rilevati anche altri problemi: il 10% dei moduli di autorizzazione ha problemi con la trasmissione sicura delle informazioni, che rischia di far trapelare le password, 412 siti consentono l'intercettazione dei cookie e il dirottamento della sessione e 543 siti sono soggetti ad attacchi all'integrità dei cookie (tramite sottodomini) .

Il problema è che negli ultimi anni nei protocolli e software SSL / TLS identificato una serie di vulnerabilità: POODLE (CVE-2014-3566), BEAST (CVE-2011-3389), CRIME (CVE-2012-4929), BREACH (CVE-2013-3587) e Heartbleed (CVE-2014-0160). Per proteggersi da essi, sono necessarie una serie di impostazioni sul lato server e client per evitare di utilizzare vecchie versioni vulnerabili. Ma questa è una procedura piuttosto non banale, perché tali impostazioni comportano la scelta da un ampio set di cifrari e protocolli, che sono piuttosto difficili da capire. Non è sempre chiaro quali suite di cifratura e protocolli siano considerati "abbastanza sicuri".

Impostazioni raccomandate

Non esiste un elenco ufficialmente approvato e concordato di impostazioni HTTPS consigliate. COSÌ, Generatore di configurazione SSL di Mozilla offre diverse opzioni di configurazione, a seconda del livello di protezione richiesto. Ad esempio, ecco le impostazioni consigliate per un server nginx 1.14.0:

Modalità moderna

Client supportati meno recenti: Firefox 27, Chrome 30, IE 11 su 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>;

....
}

Supporto medio

Client supportati meno recenti: 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>;

....
}

Vecchio supporto

Client supportati meno recenti: 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>;

....
}

Si consiglia di utilizzare sempre la suite di cifratura completa e l'ultima versione di OpenSSL. La suite di crittografia nelle impostazioni del server specifica la priorità in cui verranno utilizzate, a seconda delle impostazioni del client.

La ricerca mostra che non è sufficiente installare solo un certificato HTTPS. "Anche se non gestiamo i cookie come facevamo nel 2005 e il 'TLS decente' è diventato un luogo comune, si scopre che queste cose di base non sono sufficienti per proteggere un numero sorprendentemente elevato di siti molto popolari", говорят gli autori dell'opera. Per proteggere in modo affidabile il canale tra il server e il client, è necessario monitorare attentamente l'infrastruttura dai propri sottodomini e host di terze parti da cui viene fornito il contenuto per il sito. Forse ha senso ordinare un audit da una società di terze parti specializzata nella sicurezza delle informazioni.

HTTPS non è sempre così sicuro come sembra. Vulnerabilità riscontrate nel 5,5% dei siti HTTPS

Fonte: habr.com