En el post de hoy os hablamos sobre un protocolo que a los lectores más experimentados tal vez les resulte conocido, pero que no todo el mundo conoce: HSTS. Intentaremos explicar de forma sencilla en qué consiste este protocolo, para qué sirve y cómo ayuda a proteger nuestra seguridad en internet. Si quieres saber un poco más acerca de este protocolo y su funcionamiento, continúa leyendo.

¿Qué es HSTS?

HSTS (HTTP Strict Transport Security) es una política de seguridad que permite a un servidor web establecer la elección de que todas las conexiones que se lancen contra él se hagan a través de una conexión HTTP segura, es decir, aquella que se apoya sobre SSL/TLS (protocolo de cifrado para obtener conexiones seguras), o lo que es lo mismo, mediante HTTPS. Para los más técnicos, pueden encontrar la especificación de este protocolo en el RFC 6797 de la IETF (Internet Engineering Task Force o Grupo de Trabajo de Ingeniería de Internet) publicado en 2012.

Esta política es anunciada por parte del servidor al agente que solicita el servicio a través de un campo en la cabecera HTTP. Este campo se nombra como “Strict-Transport-Security”.

¿Por qué surge HSTS?

Como usuario de internet, te lanzamos una pregunta a la que debes responder sinceramente: ¿siempre escribes https:// antes de acceder a los sitios web?

Si tu respuesta es sí, enhorabuena, eres un usuario algo más precavido que la media. De lo contrario, si tu respuesta es no, entonces HSTS es para ti. Lo que hace este protocolo básicamente es garantizar que todas las conexiones se realizan de forma segura aunque el usuario no indique el protocolo al escribir la URL. Al no hacer esta indicación, un potencial atacante podría eliminar la seguridad de SSL/TLS, quedando la información transmitida al descubierto. Esto es así porque la primera conexión agente-servidor se realiza sin HTTPS, y por tanto sin cifrar, y es en este punto donde se encuentra la vulnerabilidad que posibilita ataques de XSRF o XSS.

En la siguiente imagen podemos observar un ejemplo de la cabecera “Strict-Transport-Security”. Podemos ver cómo en la cabecera de respuesta tras ejecutar curl (una herramienta para realizar peticiones http o https y visualizar los resultados) contra github.com se encuentra el campo “Strict-Transport-Security”.

Como podemos ver, el campo está presente y además tiene asociado un valor: max-age=31536000. Este valor indica el tiempo de duración/caducidad de este registro. Además, puede incluir otros parámetros, como “includeSubdomains”, que indica que se incluyan los subdominios del sitio web. Lo analizaremos un poco más en detalle más adelante.

El funcionamiento de HSTS

Intentaremos ilustrar paso a paso cómo funciona HSTS para que podáis entenderlo mejor. Lo que ocurre cuando accedemos a un recurso de un servidor que tiene HSTS activado, el proceso que se sigue es el siguiente:

1.- En este paso el usuario introduce la URL del recurso al que quiere acceder, sin indicar el protocolo a emplear. 2.- Si el servidor de la página solicitada tiene activado HSTS, el navegador hace una redirección interna y envía la petición al servidor con la conexión ya cifrada, es decir, empleando el protocolo https.

El navegador realiza una primera petición con una cabecera provisional, que no será enviada al servidor. Se realiza una redirección interna en el navegador y, entonces, se realiza una segunda petición que se envía cifrada al servidor.

Como podemos ver, la redirección se realiza por parte del navegador. Sin embargo, para que esta redirección suceda, es necesario que los servidores que alojan servicios web tengan implementado este protocolo.

¿Cómo implemento HSTS en mi servidor?

En cada tipo de servidor web deberemos actuar de una forma o modificar un archivo de configuración para establecer el protocolo HSTS en nuestro servidor. A continuación explicamos cómo implementarlo en distintos tipos de servidor.

HSTS en Apache Server

Para activar el protocolo HSTS en un servidor Apache, debemos añadirlo en el archivo de configuración, concretamente en el VirtualHost. Simplemente debemos añadir la siguiente línea:

<VirtualHost [IP del VirtualHost]>
    Headers always set Strict-Transport-Security "max-age=63072000; includeSubdomains;"
</VirtualHost>

Como podemos ver, se incluyen aquí el max-age (tiempo de duración/caducidad de la cabecera) y la inclusión de los subdominios.

HSTS en NGINX

Para servidores NGINX también debemos añadir en el archivo de configuración general. La línea que debemos añadir es similar a la que debemos añadir en los servidores Apache:

add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; ";

Esta no es la única forma de configurar HSTS en nuestro servidor (podríamos configurar la carga de las cabeceras mediante PHP por ejemplo), pero es la más recomendada.

Pero, como siempre, la seguridad al 100% no existe

Como sabrás si llevas un tiempo con nosotros o si alguna vez te has interesado por la seguridad (física o informática), una de las reglas generales de este mundo es que la seguridad al completo no se puede asegurar (un sistema es tan seguro como su eslabón más débil). Y con el protocolo HSTS no iba a ser menos. Exponemos a continuación qué problemas tiene:

Confianza en el primer uso o TOFU (Trust On First Use) y Super Cookies

La situación del TOFU se da cuando accedemos a un sitio web o servicio al que no habíamos accedido nunca previamente. En este primer momento, el cliente no tiene la cabecera HSTS, por lo que podría realizarse una primera conexión no cifrada y, por ende, el SSL Strip del que hablábamos al principio. Es aquí donde entran en juego mecanismos como el HPKP. Para simplificar, HPKP es un mecanismo que permite al navegador comprobar la autenticidad y confiabilidad de los certificados, transmitiendo al browser los certificados que debería ver. Si el navegador ve otros certificados, se impedirá la conexión, puesto que podríamos estar siendo víctimas de un ataque Man In The Middle. Este mecanismo podría servir de protección, pero no elimina la desventaja que supone la confianza en el primer uso.

Por otro lado existe el problema de las Super Cookies. Este tipo de registro almacena todo el historial de navegación, además de guardar los parámetros de las conexiones seguras aunque borres las Cookies de navegación. Este tipo de información permitiría hacer tracking de las conexiones del usuario (incluso navegando en modo incógnito).

Vulnerabilidades conocidas de HSTS

Como ya hemos dicho, la seguridad completa no existe. La vulnerabilidad más conocida de HSTS es la llamada “Delorean-SSLStrip” (este ataque puede montarse de forma no muy compleja con Kali Linux.) Esta vulnerabilidad se basa en el protocolo NTP (Network Time Protocol), un protocolo de Internet utilizado para sincronizar los relojes de los servidores en la red. Lo que se hace en este ataque es reconfigurar el reloj del navegador de la víctima, estableciéndolo en una fecha futura, consiguiendo así la caducidad de la cabecera HSTS. Al suceder esto, de nuevo se llega al problema de la primera conexión, por lo que se dan las condiciones necesarias para llevar a cabo un SSL Strip.

ATENCIÓN: Desde Infseg.com no apoyamos ni nos hacemos responsables del mal uso de la información que aquí se comparte. Pretendemos concienciar de los peligros y fallos de seguridad que existen, para que nuestros usuarios puedan protegerse ante ellos o saber responder si los sufren. No nos hacemos responsables del mal uso que se pueda dar a la información aquí compartida. Sé responsable con tus actos y no incurras en acciones ilegales.

Conclusiones

Como vemos, existen mecanismos para tratar de hacer nuestra navegación por internet más segura, a pesar de que, como todo (o casi todo), tiene vulnerabilidades que un potencial atacante podría utilizar contra nosotros. A pesar de ello, nunca está de más añadir un poco más de seguridad a nuestras conexiones. Recuerda que Internet no fue ideado como una red segura y que existen muchas vulnerabilidades que debemos tener en cuenta. Como consejos finales, podríamos decir que te fijes siempre en la URL a la que accedes, si se está utilizando HTTP o HTTPS, y, sobre todo, asegúrate de que estás llegando realmente al sitio legítimo que crees y no a una web/servidor montada por un atacante.

Existen extensiones que pueden ayudarnos un poco en esto, como por ejemplo HTTPS Everywhere, disponible para Firefox, Chrome, Ópera y sistemas Android. Esta extensión cifra la mayoría de conexiones y hace que se realicen mediante HTTPS siempre que le sea posible.

Este es sólo un ejemplo, estamos seguros de que existen más extensiones de este tipo o plugins que nos ayudan a mejorar nuestra privacidad y seguridad en la red. ¿Conoces alguno?

Fuentes

HSTS en Wikipedia

Eleven Paths [Vídeo en YouTube]

Si quieres ampliar un poco sobre HPKP