HTTP Strict Transport security (HSTS) è un response header che permette al server web di forzare l'utilizzo di TLS per i browser compatibili. Vedremo anche come i moderni browser, per alcuni siti, forzino staticamente questa policy connettendosi direttamente in HTTPS (preload) a prescindere dalla presenza di HSTS.

Come per gli scorsi capitoli, implementerò HSTS su blog.rev3rse.it e controllerò il punteggio su securityheaders.com. Se non sai a cosa mi sto riferendo, ti invito a leggere il primo articolo di questa serie, o di guardare il primo video pubblicato sul nostro canale YouTube.

Le specifiche di HSTS sono state pubblicate nel Novembre 2012 nel RFC 6797 https://tools.ietf.org/html/rfc6797 ma sono il risultato della visione progettuale di Jeff Hodges e Andy Steingruebl (PayPal) esposte nell'articolo pubblicato nel 2010 The Need for Coherent Web Security Policy Framework. Oggi praticamente tutti i browser supportano e applicano le policy specificabili tramite questo response header. È possibile verificare le versioni supportate sul sito https://caniuse.com/#feat=stricttransportsecurity che offre informazioni di compatibilità su qualsiasi feature e browser API.

HSTS è particolarmente efficace come contromisura di uno specifico attacco MiTM in cui l'attaccante si connette in HTTPS a un web server per conto della vittima a cui poi trasferisce i dati in HTTP.

Questo è possibile perchè al browser dell'utente è consentito connettersi utilizzando una connessione non sicura (HTTP) verso il web server di destinazione. Forzando il browser a poter utilizzare solo HTTPS, questa possibilità viene scongiurata direttamente sullo user agent dell'utente.

La sintassi del response header HSTS prevede 3 parametri:

  • max-age: tempo, in secondi, per cui il browser mette in cache e applica la policy HSTS (esempio: max-age=31536000 farà si che il browser per 1 anno si connetta al sito direttamente in HTTPS).
  • includeSubDomains: applica la policy HSTS a tutti i subdomain del dominio.
  • preload: indica che il sito vorrebbe essere incluso nella lista preload.

Per esempio:
Strict-Transport-Security: max-age=31536000

Preload

Per alcuni siti questo concetto viene applicato staticamente. Infatti, alcuni browser come Firefox e Chrome, hanno una lista “statica” di siti a cui viene applicata sempre una policy HSTS. In soldoni, il nostro browser si connette sempre in HTTPS verso alcuni siti che ovviamente includono google, ma anche paypal, twitter, ecc... come si evince dal codice sorgente di Chrome:

https://src.chromium.org/viewvc/chrome/trunk/src/net/http/transport_security_state_static.json

Implementazione

Come per tutti gli altri header che abbiamo trattato, ho implementato HSTS usando add_header su Nginx. Il risultato su securityheaders.com è il seguente: