HTTPS nie zawsze jest tak bezpieczny, jak się wydaje. Luki wykryte w 5,5% witryn HTTPS

HTTPS nie zawsze jest tak bezpieczny, jak się wydaje. Luki wykryte w 5,5% witryn HTTPS
Jedna z najlepszych witryn Alexy (środkowe kółko), zabezpieczona przez HTTPS, z subdomenami (szary) i zależnościami (biały), wśród których znajdują się te podatne na ataki (cieniowanie przerywane)

W dzisiejszych czasach ikona bezpiecznego połączenia HTTPS stała się standardem, a nawet niezbędnym atrybutem każdej poważnej witryny. Jeśli certyfikat brakuje, prawie wszystkie najnowsze przeglądarki wyświetlają ostrzeżenie, że połączenie z witryną jest „niezabezpieczone” i nie zalecamy przekazywania do niego poufnych informacji.

Okazuje się jednak, że obecność „kłódki” w pasku adresu nie zawsze gwarantuje ochronę. Sprawdzanie 10 000 wiodących witryn Z rankingu Alexa pokazała, że ​​wiele z nich jest narażonych na krytyczne luki w protokołach SSL/TLS, zwykle poprzez subdomeny lub zależności. Według autorów badania złożoność nowoczesnych aplikacji internetowych znacznie zwiększa powierzchnię ataku.

Wyniki badania

Badanie przeprowadzili eksperci z Uniwersytetu Ca' Foscari w Wenecji (Włochy) oraz Politechniki Wiedeńskiej. Szczegółowy raport przedstawią na 40th IEEE Symposium on Security and Privacy, które odbędzie się 20-22 maja 2019 r. w San Francisco.

Przetestowano 10 000 najpopularniejszych witryn HTTPS z listy Alexa i 90 816 powiązanych hostów. Podatne na ataki konfiguracje kryptograficzne wykryto na 5574 hostach, czyli około 5,5% wszystkich:

  • 4818 podatne na MITM
  • 733 są podatne na pełne odszyfrowanie TLS
  • 912 są podatne na częściowe odszyfrowanie TLS

898 witryn jest całkowicie otwartych na ataki hakerów, co oznacza, że ​​umożliwiają wstrzykiwanie skryptów stron trzecich, a 977 witryn ładuje treści ze słabo chronionych stron, z którymi osoba atakująca może wchodzić w interakcję.

Badacze podkreślają, że wśród 898 „całkowicie przejętych” zasobów znajdują się sklepy internetowe, usługi finansowe i inne duże witryny. 660 z 898 witryn pobiera zewnętrzne skrypty z wrażliwych hostów: to jest główne źródło zagrożenia. Według autorów złożoność nowoczesnych aplikacji internetowych znacznie zwiększa powierzchnię ataku.

Stwierdzono również inne problemy: 10% formularzy autoryzacyjnych ma problemy z bezpiecznym przesyłaniem informacji, co grozi wyciekiem haseł, 412 witryn umożliwia przechwytywanie plików cookie i przejmowanie sesji, a 543 witryny są narażone na ataki na integralność plików cookie (poprzez subdomeny) .

Problem polega na tym, że w ostatnich latach w protokołach i oprogramowaniu SSL/TLS zidentyfikował szereg luk w zabezpieczeniach: POODLE (CVE-2014-3566), BEAST (CVE-2011-3389), CRIME (CVE-2012-4929), BREACH (CVE-2013-3587) i Heartbleed (CVE-2014-0160). Aby się przed nimi chronić, po stronie serwera i klienta należy wprowadzić szereg ustawień, aby uniknąć używania starych, podatnych na ataki wersji. Jest to jednak dość nietrywialna procedura, ponieważ takie ustawienia wymagają wyboru z obszernego zestawu szyfrów i protokołów, które są dość trudne do zrozumienia. Nie zawsze jest jasne, które zestawy szyfrów i protokoły są uważane za „wystarczająco bezpieczne”.

Zalecane ustawienia

Nie ma jednej oficjalnie zatwierdzonej i uzgodnionej listy zalecanych ustawień HTTPS. Więc, Generator konfiguracji Mozilla SSL oferuje kilka opcji konfiguracyjnych, w zależności od wymaganego poziomu ochrony. Na przykład, oto zalecane ustawienia dla serwera nginx 1.14.0:

Tryb nowoczesny

Najstarsi obsługiwani klienci: Firefox 27, Chrome 30, IE 11 w systemie Windows 7, Edge, Opera 17, Safari 9, Android 5.0 i 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>;

....
}

Średnie wsparcie

Najstarsi obsługiwani klienci: 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>;

....
}

Stare wsparcie

Najstarsi obsługiwani klienci: 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>;

....
}

Zaleca się, aby zawsze używać pełnego zestawu szyfrów i najnowszej wersji OpenSSL. Zestaw szyfrów w ustawieniach serwera określa priorytet, w jakim będą używane, w zależności od ustawień klienta.

Badania pokazują, że nie wystarczy po prostu zainstalować certyfikat HTTPS. „Chociaż nie obsługujemy plików cookie tak, jak robiliśmy to w 2005 r., a„ przyzwoity TLS ”stał się powszechny, okazuje się, że te podstawowe rzeczy nie wystarczą, aby zabezpieczyć zaskakująco dużą liczbę bardzo popularnych witryn” mówią autorzy pracy. Aby niezawodnie chronić kanał między serwerem a klientem, należy uważnie monitorować infrastrukturę z własnych subdomen i zewnętrznych hostów, z których dostarczana jest zawartość witryny. Może warto zlecić audyt jakiejś firmie zewnętrznej, która specjalizuje się w bezpieczeństwie informacji.

HTTPS nie zawsze jest tak bezpieczny, jak się wydaje. Luki wykryte w 5,5% witryn HTTPS

Źródło: www.habr.com