Skip to main content

433,000サイトの77%が脆弱なJavaScriptライブラリを使用

著者
Headshot of Tim Kadlec

Tim Kadlec

2017年11月21日

0 分で読めます

先週、初の年次オープンソースセキュリティの現状レポートを公開しました。レポートで明らかになったことの一つは、約433,000サイトを分析した結果、その77%が既知のセキュリティ脆弱性を持つフロントエンドJavaScriptライブラリを少なくとも1つ使用していることです。この数値は3月に報告したものと一致していますが、Google ChromeのLighthouseがSnykを使って脆弱なJavaScriptライブラリを検査するようになったことで、より徹底した調査が可能になりました。

LighthouseのデータはHTTP Archiveの一環として収集されており、BigQueryを使ってクエリできます。そのため、Lighthouseの監査データを非常に大規模に調べることができます。

脆弱性のあるサイト数を調べる

BigQueryで利用できる最新のデータ(10月15日分)には、439,176件の異なるURLから収集されたデータが含まれています。Lighthouseを実行できなかったURLや、何らかの理由で監査が完了しなかったURLを除くと、クエリ対象となるサイトは418,112件です。

まず、これらのサイトのうち、既知の脆弱性があるサイトの数を調べます。レポートに対してクエリを実行すると、結果が得られます。

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

結果は3月に実施した小規模な調査とほぼ一致しています。サイトの77.3%(323,132件)が監査に不合格でした。つまり、サイトの77.3%に既知のセキュリティ脆弱性を持つクライアントサイドJavaScriptライブラリが少なくとも1つ含まれています。新しいHTTP Archiveサイトでは、この数値の経時変化が報告される予定です。

さらに詳しく調べて、これらのライブラリに含まれる既知の脆弱性の数を確認できます。

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)
「脆弱性の数別サイト数」というタイトルの棒グラフ。脆弱性が1件のサイトが最も多く、2~6件のサイトはそれより少ないことを示しています。

既知の脆弱性が1つでもあれば、複数の脆弱性を抱えている可能性が高いことが分かりました。脆弱性のあるサイトの51.8%には、既知のセキュリティ脆弱性が複数あります。大半のサイトでは脆弱性が1つか2つですが、裾野の広がりは深刻です。サイトの9.2%では、ライブラリに既知のセキュリティ脆弱性が合計4つ以上あります。

脆弱性が見つかる頻度の高いライブラリ

Lighthouseの監査データを使うと、脆弱性が見つかる頻度の高いライブラリも把握できます。

まず、脆弱かどうかにかかわらず、検出頻度の高いライブラリをクエリで確認できます。次のクエリでは、最もよく見つかるライブラリを10件取得します。

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

ライブラリ

検出回数

採用率

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%

予想どおり、jQueryがトップです。これは3月に確認した結果と一致しており、皆さんの予想どおりでしょう。jQueryのように広く普及したライブラリは、まだほかにありません。ただし注意点があります。現在、Reactは実際より少なく報告されています。更新された検出スクリプトがLighthouseに取り込まれると、数値は増加し(脆弱性のあるサイト全体の割合も多少増える可能性があります)。

次に、既知の脆弱性を含むことが判明したライブラリを見てみましょう。

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

上位のいくつかは、先ほどのリストとよく似ています。

ライブラリ

脆弱性が見つかった回数

検出された当該ライブラリ全体に占める割合

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%

割合を見ると、状況は楽観できません。Webで圧倒的な人気を誇るライブラリjQueryは、本番環境で使われているバージョンの92.5%に既知のセキュリティ脆弱性があります。実際、既知の脆弱性を含むことが最も多い10のライブラリのうち、6つは本番環境で使われているバージョンの過半数に脆弱性があります。

このリストにあるすべてのライブラリには、こうした脆弱性を含まないバージョンが存在するにもかかわらず、このような状況です。

ライブラリ

既知の脆弱性がない最古のバージョン

リリース日

jQuery

3.0.0

2016年6月

jQuery UI

1.10.0

2013年1月

Moment.js

2.15.2

2016年10月

AngularJS

1.6.1

2016年12月

Handlebars

4.0.0

2015年9月

Mustache

2.2.1

2015年12月

YUI 3

3.10.3

2016年6月

jQuery Mobile

1.2.0

2012年10月

Knockout

3.0.0

2013年10月

React

0.14.0

2015年10月

脆弱性が見つかることの多いフロントエンドライブラリは、いずれも既知の脆弱性がないバージョンがリリースされてから、すでに1年から5年が経過しています。実際には、フロントエンドのライブラリやフレームワークは、本番環境に導入された後、更新されないことがよくあります。

希望の兆し

今の状況は厳しく、否定のしようがありません。このデータは、77%のサイトすべてが悪用可能だという意味ではありません(脆弱なメソッドを回避している可能性もあります)。しかし、それはわずかな慰めにすぎません。開発者がメソッドを1回呼び出すだけで、77%のサイトが脆弱になる可能性があるのです。2017年に目の当たりにしたように、オープンソースの脆弱性は深刻に受け止める必要があります。

一方で、明るい面もあります。本番環境には数多くの脆弱性がありますが、ライブラリ自体ではすでに修正されています。主要なライブラリはいずれも、既知のセキュリティ脆弱性がないバージョンを提供しています。あとは、それらを本番環境に導入するだけです。

状況を改善するには、いくつかのことが必要です。第一に、ツールの改善と普及です。オープンソースセキュリティの現状に関する調査によると、オープンソースを使う人の38%は、パッケージを最新の状態に保つための自動化ツールをまったく使っていません。フロントエンドのJavaScript利用に絞って調べれば、導入率はさらに低いだろうと思います。

この数値は改善されるはずです。npmとYarnの改善によって、開発者にとってフロントエンドのパッケージ管理はずっと簡単になりました。堅実なパッケージ管理のワークフローと、Snykのように依存パッケージの検出、予防、修正、監視を支援するツールを組み合わせれば、Webのセキュリティ向上に大きく役立ちます。

第二に、この問題に対する一般的な認知と理解を高める必要があります。オープンソースのセキュリティ確保に伴う課題を明らかにし、改善策を見つけるために、「オープンソースセキュリティの現状」レポートを公開しました。

Lighthouse(およびSonar)に脆弱なライブラリを監査する機能があることも役立ちます。こうしたツールにより、開発者は構築するサイトの問題を簡単に見つけられます。また、HTTP ArchiveとBigQueryのおかげで、問題の広がりを把握するためのデータにも簡単にアクセスできます。

現時点のデータは心強いものではありませんが、認知度とツールの向上によって、将来的には解決できる問題です。

カテゴリー: