Pronto los navegadores web dejarán ejecutar JS de terceros sólo si se ha verificado el hash correspondiente

El borrador de la Integridad de Subrecursos (en inglés Subresource Integrity) del W3C está muy avanzado y ya lo implementan Mozilla Firefox Developer Edition 43 y otros navegadores modernos. Gracias a esta especificación se controla la carga de JavaScript de terceros evitándose modificaciones inesperadas o maliciosas, simplemente añadiendo al sitio web un código como este:
 
<script src="https://code.jquery.com/jquery-2.1.4.min.js"
integrity="sha384-R4/ztc4ZlRqWjqIuvf6RX5yb/v90qNGx6fS48N0tRxiGkqveZETq72KgDVJCp2TC"
crossorigin="anonymous"></script>

Como veis, la idea es incluir el script junto con su hash (por ejemplo, SHA-384) al crear la página web. El navegador puede entonces descargar el script y calcular el hash sobre el archivo descargado. El script sólo se ejecutará si ambos hashes coinciden, es decir, si comprueba su integridad criptográfica.
La seguridad de una función resistente a colisiones asegurará que cualquier modificación genere un hash diferente y esto ayudará al sitio web a detectar y prevenir cualquier modificación de un servicio CDN (redes de distribución de contenidos) comprometido o de un atacante malicioso.

Una nota importante es que para que funcione la Integridad de Subrecursos, el CDN debe soportar Cross-Origin Resource Sharing (CORS). El atributo crossorigin en el fragmento de código anterior fuerza que se cargue CORS y el valor anónimo significa que el navegador debe omitir cualquier cookie o autenticación que el usuario pueda haber asociado al dominio. Esto evita las fugas de datos de crossorigin, y también hace que la petición sea más pequeña.

Además, no sé si os habréis dado cuenta, pero el atributo de integridad también incluye el nombre digest. Eso es porque la sintaxis permite múltiples tokens lo que a su vez permite a los propietarios del sitio especificar hashes diferentes así como los valores de múltiples scripts que pueden estar detrás de una URL. Esto es útil para el browser sniffing o para la negociación de contenidos.

 
<script src="https://code.jquery.com/jquery-2.1.4.min.js"
integrity="sha384-R4/ztc4ZlRqWjqIuvf6RX5yb/v90qNGx6fS48N0tRxiGkqveZETq72KgDVJCp2TC
sha256-8WqyJLuWKRBVhxXIL1jBDD7SDxU936oZkCnxQbWwJVw="
crossorigin="anonymous"></script>

Luego es probable que los administradores no quieran presentar su sitio como una web inaccesible si los navegadores de los usuarios no pueden verificar todos los hashes de los elementos cargados desde un recurso CDN. Para ello pueden mantenerse copias de los scripts en el propio sitio web y cargar el script directamente en caso necesario, añadiendo el siguiente código al fragmento anterior:

 
<script>window.jQuery || /* reload from own domain here */;</script>

Respecto a si la Integridad de Subrecursos funciona tanto en HTTP como en HTTPS, evidentemente el navegador puede averiguar si un script se modificó en la CDN en HTML plano, pero no estará protegido de que un atacante activo modifique el atributo de la integridad del HTML. Por lo tanto para proporcionar confidencialidad, integridad y autenticidad lo mejor es usar HTTPS en todo sitio web.

Y más cosas para terminar. La Integridad de Subrecursos puede verificar también CSS utilizando el atributo de integridad en el tag <link> y si queréis probar la compatibilidad con navegadores o jugar con ejemplos, echar un vistazo a https://srihash.org/, que puede hacer todo el trabajo sucio de calcular hashes, así como comprobar si tu CDN ya lo soporta. BootstrapCDN, CloudFlare y GitHub ya están experimentando con ello...

Fuente: Do not let your CDN betray you: Use Subresource Integrity

Comentarios