Skip to main content

El 77% de 433,000 sitios usa bibliotecas JavaScript vulnerables

Escrito por
Headshot of Tim Kadlec

Tim Kadlec

21 de noviembre de 2017

0 minutos de lectura

La semana pasada publicamos nuestro primer informe sobre el estado de la seguridad del código abierto. Entre los hallazgos mencionados en el informe, un análisis de alrededor de 433,000 sitios encontró que el 77% usa al menos una biblioteca JavaScript de front-end con una vulnerabilidad de seguridad conocida. Esta cifra coincide con la que informamos en marzo, pero gracias a que Google Chrome ahora usa Snyk en Lighthouse para detectar bibliotecas JavaScript vulnerables, podemos obtener resultados mucho más completos.

Los datos de Lighthouse se recopilan como parte de HTTP Archive y están disponibles para hacer consultas a través de BigQuery. Como resultado, podemos consultar datos de auditorías de Lighthouse a gran escala.

Cuántos sitios son vulnerables

Los datos del 15 de octubre (la ejecución más reciente disponible) en BigQuery incluyen información recopilada de 439,176 URL diferentes. Si descontamos las URL en las que Lighthouse no pudo ejecutarse o en las que la auditoría no se completó por algún motivo, obtenemos un conjunto de datos de 418,112 sitios diferentes para consultar.

La primera pregunta es cuántos de esos sitios tienen vulnerabilidades conocidas. Podemos consultar los informes para averiguarlo:

SELECT
  JSON_EXTRACT_SCALAR(report, "$.audits.no-vulnerable-libraries.score") AS score,
  COUNT(0) AS volume
FROM
  [httparchive:har.latest_lighthouse_mobile]
WHERE
  report IS NOT NULL
GROUP BY
  score
HAVING
  score IS NOT NULL
ORDER BY
  score

Los resultados coinciden bastante con nuestro estudio a menor escala de marzo: el 77.3% (323,132) de esos sitios no pasó la auditoría. En otras palabras, el 77.3% de esos sitios contiene al menos una biblioteca JavaScript del lado del cliente con una vulnerabilidad de seguridad conocida. La nueva versión del sitio HTTP Archive informará cómo cambia esta cifra con el tiempo.

Podemos profundizar aún más para ver cuántas vulnerabilidades conocidas contienen esas bibliotecas:

SELECT 
  REGEXP_EXTRACT(JSON_EXTRACT_SCALAR(report, "$.audits.no-vulnerable-libraries.displayValue"), r'^\S*') AS knownVulnerabilities,
  COUNT(0) AS volume
FROM
  `httparchive.lighthouse.2017_10_15_mobile`
WHERE
  report IS NOT NULL
AND
  JSON_EXTRACT_SCALAR(report, "$.audits.no-vulnerable-libraries.score") = 'false'
GROUP BY
  knownVulnerabilities
ORDER BY
  CAST(knownVulnerabilities as int64)
Gráfico de barras titulado «Sitios con X número de vulnerabilidades», que muestra que la mayor cantidad de sitios tiene una vulnerabilidad y que hay menos sitios con dos a seis.

Resulta que, si tienes al menos una vulnerabilidad conocida, es probable que tengas más. El 51.8% de los sitios vulnerables tiene más de una vulnerabilidad de seguridad conocida. Aunque la mayoría de esos sitios tiene una o dos, la larga cola es preocupante. El 9.2% de los sitios tiene bibliotecas con un total de cuatro o más vulnerabilidades de seguridad conocidas.

Qué bibliotecas suelen ser vulnerables con mayor frecuencia

Con los datos de auditoría de Lighthouse, también podemos saber qué bibliotecas suelen encontrarse vulnerables con más frecuencia.

Primero, podemos consultar cuáles son las bibliotecas que se detectan con más frecuencia, sean vulnerables o no. La siguiente consulta obtiene las diez bibliotecas detectadas con mayor frecuencia:

CREATE TEMPORARY FUNCTION getLibs(items STRING)
RETURNS ARRAY<STRING>
LANGUAGE js AS """
  try {
    return  items.match(/"name":"([^"]*)"/ig);
  } catch (e) {
    return [];
  }
""";

SELECT library, COUNT(0) Volume
FROM (
   SELECT getLibs(JSON_EXTRACT(report, "$.audits.no-vulnerable-libraries.extendedInfo.jsLibs")) AS libs
   FROM `httparchive.lighthouse.2017_10_15_mobile`
)
CROSS JOIN 
   UNNEST(libs) AS library
GROUP BY library
ORDER BY Volume DESC
LIMIT 10

Biblioteca

Número de detecciones

Porcentaje de adopción

jQuery

344,643

82.4%

jQuery UI

83,075

19.9%

Modernizr

63,122

15.1%

Bootstrap

57,154

13.7%

yepnope

41,537

9.9%

FlexSlider

33,002

7.9%

Underscore

17,633

4.2%

Google Maps

14,312

3.4%

Moment.js

14,038

3.4%

SWFObject

13,521

3.2%

Como era de esperarse, jQuery encabeza la lista. Esto coincide con lo que vimos en marzo y con lo que probablemente esperarías. Ninguna otra biblioteca se ha acercado a la popularidad universal de jQuery. Una salvedad: actualmente, React está infrarrepresentado. Cuando Lighthouse incorpore el script de detección actualizado, sus cifras aumentarán (y es probable que el porcentaje general de sitios vulnerables también aumente ligeramente).

Ahora cambiemos el enfoque y veamos qué bibliotecas tienen vulnerabilidades conocidas.

CREATE TEMPORARY FUNCTION getLibs(items STRING)
RETURNS ARRAY<STRING>
LANGUAGE js AS """
  try {
    return  items.match(/"name":"([^"]*)"/ig);
  } catch (e) {
    return [];
  }
""";

SELECT library, COUNT(0) Volume
FROM (
   SELECT getLibs(JSON_EXTRACT(report, "$.audits.no-vulnerable-libraries.extendedInfo.vulnerabilities")) AS libs
   FROM `httparchive.lighthouse.2017_10_15_mobile`
)
CROSS JOIN 
   UNNEST(libs) AS library
GROUP BY library
ORDER BY Volume DESC
LIMIT 10

Los primeros nombres de la lista son muy similares.

Biblioteca

Número de veces que se detectó una vulnerabilidad

Porcentaje de todas las instancias detectadas de esta biblioteca

jQuery

318,786

92.5%

jQuery UI

74,486

89.7%

Moment.js

10,245

73.0%

AngularJS

7,609

84.8%

Handlebars

3,129

60.7%

Mustache

1,925

51.0%

YUI 3

559

40.3%

jQuery Mobile

413

3.7%

Knockout

407

19.6%

React

181

10.2%

Los porcentajes no pintan un panorama alentador. El 92.5% de las versiones de jQuery, por mucho la biblioteca más popular de la web, que están en producción tiene una vulnerabilidad de seguridad conocida. De hecho, de las diez bibliotecas que con más frecuencia se encuentran con una vulnerabilidad conocida, seis son vulnerables en la mayoría de las versiones detectadas en producción.

Esto ocurre a pesar de que hay versiones sin estas vulnerabilidades disponibles para todas las bibliotecas de esta lista.

Biblioteca

Versión más antigua sin vulnerabilidades conocidas

Fecha de lanzamiento

jQuery

3.0.0

Junio de 2016

jQuery UI

1.10.0

Enero de 2013

Moment.js

2.15.2

Octubre de 2016

AngularJS

1.6.1

Diciembre de 2016

Handlebars

4.0.0

Septiembre de 2015

Mustache

2.2.1

Diciembre de 2015

YUI 3

3.10.3

Junio de 2016

jQuery Mobile

1.2.0

Octubre de 2012

Knockout

3.0.0

Octubre de 2013

React

0.14.0

Octubre de 2015

Las bibliotecas de front-end que con más frecuencia se encuentran vulnerables llevan entre uno y cinco años sin vulnerabilidades conocidas. La realidad es que las bibliotecas y los frameworks de front-end suelen dejar de actualizarse una vez que llegan a producción.

Hay motivos para tener esperanza

El panorama es bastante sombrío ahora mismo; no hay forma de negarlo. Aunque estos datos no significan que los sitios sean explotables en los 77% de los casos (es posible que eviten los métodos vulnerables), eso consuela poco. El 77% de los sitios está a una llamada a un método por parte de un solo desarrollador de volverse vulnerable. Como hemos visto en 2017, las vulnerabilidades de código abierto deben tomarse muy en serio.

Pero también hay un lado positivo. Aunque hay muchas vulnerabilidades en producción, ya se corrigieron en las propias bibliotecas. Hay versiones de cada una de las principales bibliotecas que no tienen vulnerabilidades de seguridad conocidas; solo tenemos que implementarlas en producción.

Para mejorar la situación, deben ocurrir algunas cosas. La primera es mejorar las herramientas y su adopción. Según nuestra encuesta sobre el estado de la seguridad del código abierto, el 38% de las personas que usan código abierto no utiliza ningún tipo de herramienta automatizada para mantener sus paquetes actualizados. Me atrevo a decir que, si analizáramos específicamente el uso de JavaScript de front-end, la adopción sería aún menor.

Esa cifra debería mejorar. Las mejoras en npm y Yarn han simplificado mucho la gestión de paquetes de front-end para los desarrolladores. Combinar un flujo de trabajo sólido para la gestión de paquetes con herramientas como Snyk, que te ayudan a detectar, prevenir, corregir y monitorear las dependencias de esos paquetes, contribuirá mucho a que la web sea más segura.

Lo segundo que necesitamos es aumentar el conocimiento y la comprensión general del problema. Por eso publicamos el informe sobre el estado de la seguridad del código abierto: para visibilizar los desafíos de proteger el código abierto y ayudar a encontrar formas de mejorar.

La auditoría de bibliotecas vulnerables en Lighthouse (y Sonar) también ayuda. Estas herramientas facilitan que los desarrolladores detecten problemas en los sitios que crean. Y gracias a HTTP Archive y BigQuery, tenemos acceso fácil a los datos que nos permiten ver la magnitud del problema.

Aunque los datos actuales no son alentadores, una mayor concientización y mejores herramientas pueden convertirlo en un problema que podremos resolver en el futuro.