Skip to main content

77 % des 433 000 sites utilisent des bibliothèques JavaScript vulnérables

Écrit par
Headshot of Tim Kadlec

Tim Kadlec

21 novembre 2017

0 minutes de lecture

La semaine dernière, nous avons publié notre premier rapport sur l’état de la sécurité de l’open source. Parmi les découvertes mentionnées dans le rapport, une analyse d’environ 433 000 sites a révélé que 77 % d’entre eux utilisent au moins une bibliothèque JavaScript front-end présentant une vulnérabilité de sécurité connue. Ce chiffre est conforme à celui que nous avions communiqué en mars, mais grâce à Lighthouse de Google Chrome, qui teste désormais les bibliothèques JavaScript vulnérables avec Snyk, nous pouvons obtenir des résultats beaucoup plus complets.

Les données de Lighthouse sont recueillies dans le cadre de HTTP Archive et peuvent être interrogées via BigQuery. Nous pouvons ainsi interroger à très grande échelle les données d’audit de Lighthouse.

Évaluer le nombre de sites vulnérables

Les données du 15 octobre (la dernière exécution disponible) dans BigQuery contiennent des informations recueillies à partir de 439 176 URL différentes. Après avoir exclu les URL pour lesquelles Lighthouse n’a pas pu s’exécuter ou dont l’audit n’a pas abouti pour une raison ou une autre, nous obtenons un ensemble de données portant sur 418 112 sites différents.

La première question consiste à déterminer combien de ces sites présentent des vulnérabilités connues. Nous pouvons interroger les rapports pour obtenir cette information :

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

Les résultats sont tout à fait cohérents avec notre étude à plus petite échelle menée en mars : 77,3 % (323 132) de ces sites n’ont pas réussi l’audit. Autrement dit, 77,3 % de ces sites contiennent au moins une bibliothèque JavaScript côté client présentant une vulnérabilité de sécurité connue. La nouvelle version du site HTTP Archive rendra compte de l’évolution de ces chiffres au fil du temps.

Nous pouvons approfondir l’analyse pour voir combien de vulnérabilités connues se trouvent dans ces bibliothèques :

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)
Graphique à barres intitulé « Sites avec X vulnérabilités », montrant que le nombre de sites est le plus élevé pour une vulnérabilité et diminue de deux à six.

Il s’avère que si un site présente au moins une vulnérabilité connue, il en présente probablement plusieurs. 51,8 % des sites vulnérables en comptent plus d’une. La plupart de ces sites en présentent une ou deux, mais la longue traîne est préoccupante : 9,2 % des sites utilisent des bibliothèques cumulant au moins quatre vulnérabilités de sécurité connues.

Quelles sont les bibliothèques les plus souvent vulnérables ?

Les données d’audit de Lighthouse nous permettent également de déterminer quelles bibliothèques sont le plus souvent reconnues comme vulnérables.

Pour commencer, nous pouvons rechercher les bibliothèques les plus souvent détectées, qu’elles soient vulnérables ou non. La requête suivante récupère les dix bibliothèques les plus fréquemment détectées :

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

Bibliothèque

Nombre de détections

Taux d’adoption

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 %

Sans surprise, jQuery arrive en tête. Cela correspond tout à fait à ce que nous avions observé en mars et à ce que vous pouviez probablement anticiper. Aucune bibliothèque n’a encore réussi à égaler l’omniprésence de jQuery. À noter toutefois : React est actuellement sous-représenté. Une fois le script de détection mis à jour intégré à Lighthouse, ses chiffres augmenteront (et le pourcentage global de sites vulnérables devrait lui aussi légèrement progresser).

Voyons maintenant quelles bibliothèques sont reconnues comme présentant des vulnérabilités connues.

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

Les premières bibliothèques de la liste sont très similaires.

Bibliothèque

Nombre de détections de vulnérabilités

% de toutes les occurrences détectées de cette bibliothèque

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 %

Les pourcentages ne sont guère réjouissants. En production, 92,5 % des versions de jQuery — de loin la bibliothèque la plus populaire du Web — présentent une vulnérabilité de sécurité connue. En fait, parmi les dix bibliothèques les plus souvent reconnues comme vulnérables, six le sont dans la majorité des versions utilisées en production.

Et ce, alors que chacune des bibliothèques de cette liste propose des versions exemptes de ces vulnérabilités.

Bibliothèque

Version la plus ancienne sans vulnérabilité connue

Date de publication

jQuery

3.0.0

Juin 2016

jQuery UI

1.10.0

Janvier 2013

Moment.js

2.15.2

Octobre 2016

AngularJS

1.6.1

Décembre 2016

Handlebars

4.0.0

Septembre 2015

Mustache

2.2.1

Décembre 2015

YUI 3

3.10.3

Juin 2016

jQuery Mobile

1.2.0

Octobre 2012

Knockout

3.0.0

Octobre 2013

React

0.14.0

Octobre 2015

Les bibliothèques front-end les plus souvent reconnues comme vulnérables n’ont présenté aucune vulnérabilité connue depuis un à cinq ans. En réalité, les bibliothèques et frameworks front-end ne sont souvent plus mis à jour une fois déployés en production.

Des raisons d’espérer

La situation est plutôt sombre aujourd’hui, impossible de le nier. Ces données ne signifient pas que les 77 % de sites concernés sont tous exploitables (ils peuvent ne pas utiliser les méthodes vulnérables), mais c’est une bien maigre consolation. Sur ces 77 % de sites, il suffit qu’un développeur appelle une méthode pour créer une vulnérabilité. Comme nous l’avons constaté en 2017, les vulnérabilités open source doivent être prises très au sérieux.

Mais il y a aussi une bonne nouvelle. Malgré le grand nombre de vulnérabilités en production, celles-ci ont été corrigées dans les bibliothèques concernées. Toutes les grandes bibliothèques proposent des versions exemptes de vulnérabilités de sécurité connues : il ne reste qu’à les déployer en production.

Pour améliorer la situation, plusieurs changements sont nécessaires. Tout d’abord, il faut de meilleurs outils et une adoption plus large de ces derniers. Selon notre enquête sur l’état de la sécurité de l’open source, 38 % des personnes qui utilisent l’open source n’ont recours à aucun outil automatisé pour maintenir leurs packages à jour. Je serais prêt à parier que ce taux d’adoption serait encore plus faible si l’on se penchait spécifiquement sur l’utilisation de JavaScript front-end.

Ce chiffre devrait s’améliorer. Les améliorations apportées à npm et Yarn ont considérablement simplifié la gestion des packages front-end pour les développeurs. En associant un processus fiable de gestion des packages à des outils comme Snyk, qui vous aident à détecter, prévenir, corriger et surveiller les dépendances de vos packages, vous contribuerez grandement à renforcer la sécurité du Web.

Il faut également mieux faire connaître le problème et le comprendre. C’est pourquoi nous avons publié le rapport sur l’état de la sécurité de l’open source : pour mettre en lumière les défis liés à la sécurisation de l’open source et contribuer à trouver des pistes d’amélioration.

L’audit des bibliothèques vulnérables dans Lighthouse (et Sonar) est également utile. Ces outils permettent aux développeurs de repérer plus facilement les problèmes sur les sites qu’ils créent. Et grâce à HTTP Archive et BigQuery, nous disposons de données facilement accessibles pour mesurer l’ampleur du problème.

Les données actuelles sont certes peu encourageantes, mais une meilleure sensibilisation et de meilleurs outils peuvent permettre de résoudre ce problème à l’avenir.