JavaScriptライブラリにおける既知の脆弱性の発生頻度
Tim Kadlec
2017年3月9日
0 分で読めます先週のNDSS Symposiumで、クライアントサイドのJavaScriptライブラリがどれほど脆弱なのかを大規模に調査した取り組みについての興味深いホワイトペーパーが発表されました。
この調査では、13万3,000を超えるWebサイトのJavaScriptコードを分析しました。広く使われているJavaScriptライブラリ(最終的に72種類)をスキャンし、使用されているバージョンを特定したうえで、既知の脆弱性があるかどうかを調べました。結論は、控えめに言っても興味深いものでした。
非常に優れたレポートなので、ぜひ数分かけて読んでみることをおすすめします。すでにいくつかの要約が公開されています(Adrianの要約は特に優れています)。私たちも独自の見解をお伝えしたいと思います。
既知の脆弱性はよく見つかる
調査対象となったサイトの37%に、既知の脆弱性を含むライブラリが少なくとも1つ含まれていることが分かりました。私たちが目にした議論でも、この数字に不安を感じる人が多くいました。しかし実際には、これよりはるかに高い可能性があります。
この調査が対象としたのは、最も人気のある72種類のライブラリです。そのため、分析対象に含まれなかった、利用者の少ないライブラリも数多くあります。私たちが監視しているプロジェクトでは、依存関係の数は中央値で184に上ります。JavaScript開発では、利用者の少ないライブラリが非常に多く使われています。個々のライブラリの利用頻度は低くても、合計すると膨大な数になります。また、こうしたライブラリは貢献者が少ない傾向にあります。そのため、脆弱性が見つかっても、修正を含むアップデートの公開までにかなりの時間がかかる可能性があります。
調査対象となった脆弱性のリストにも、確実にいくつかの見落としがありました。研究者たちは、納得のいく脆弱性データベースを見つけられなかったため、できる限りの情報を集めてリストを作成しました。かなりうまくできていますが、私たちのデータベースに登録されている脆弱性のうち、少なくともいくつかは分析に含まれていないようです。たとえば、momentライブラリは人気ライブラリのリストに入っていましたが、多くのバージョンに含まれる既知の脆弱性を2件、発見できなかったようです。
新たな脆弱性の特定も試みていません。これは十分理解できます。新しい脆弱性を発見するには、かなりの労力と時間が必要です(当社のリサーチチームも同意するでしょう)。しかし、新たな脆弱性が公表される頻度は、開発者がライブラリをアップデートする頻度を大きく上回ります。レポート公開からわずか10日間で、npmライブラリに見つかった新たな脆弱性を7件追加しました。
これらすべてを踏まえると、37%でも深刻に思えますが、実態はさらに深刻だと分かります。
また、この37%はクライアントサイドのみを対象とした数字である点にも留意が必要です。当社のデータベースには、npmパッケージの既知の脆弱性が約400件登録されていますが、すべてがクライアントサイドのものではありません。この調査をJavaScriptエコシステム全体に広げれば、さらに深刻な結果になるでしょう。
新しいライブラリへのアップグレードには時間がかかる
分析対象となったサイトで使われていたライブラリのバージョンは、最新リリースより中央値で1,177日(3年以上!)古いものでした。
ソフトウェアやライブラリの新しいリリースがなかなか採用されないのは、今に始まった問題ではありません。JavaScriptエコシステムに限った話でもありません。どのオペレーティングシステムのアップデートを見ても、多くのユーザーが更新するまでには時間がかかります。しかも、そうしたシステムでは通常、アップデート通知を端末に直接送れるという利点があります。
JavaScriptライブラリも、セキュリティ面ではオペレーティングシステムと同じような課題を抱えています。しかし、アップデートを直接適用できる利点はなく、手作業もより多く必要です。
ライブラリのアップデートには、労力とリスクが伴います。アップグレードがあると知り、それを取得してテストし、場合によってはライブラリの使い方を変更するまでに時間がかかります。小規模な変更で機能に大きく影響しないアップグレードであれば、労力は多少減りますが、アップグレードしたいという意欲も低くなりがちです。
適切なsemverのバージョン管理によってアップグレードの複雑さは把握できますが、アップデートの緊急性を示す明確な指標はありません。論文で指摘されているように、ライブラリのリリースノートでは、脆弱性の修正について必ずしも明確に説明されているとは限りません。リリースの緊急性を判断するには、ライブラリに既知の脆弱性がないか監視する必要がありますが、今も大多数の開発者はそうしていません。
希望を持ち続ける
この論文の調査結果は、厳しい現実を突きつけるものでした。一般的に、私たちの業界はオープンソース開発がもたらす豊富なリソースを積極的に活用してきましたが、それに伴うリスクを認識し、身を守ることには、はるかに時間がかかっています。
表面的には落胆させられる調査結果かもしれません(論文の著者たちも、目にした状況に落胆していました)。それでも、私たちは楽観的です。近頃、セキュリティの重要性に対する一般の認識は少しずつ高まっています。セキュリティ層を追加するために、より強固でスマートなWeb標準も策定されてきました。ツールも進化しています。開発者にとって使いやすい方法でJavaScriptアプリケーションの既知の問題を監視し、重要なアップデートが公開されたときに通知を受け取ることは、十分に可能です。
まだ道のりは長いものの、JavaScriptのセキュリティを強化することは実現可能な課題です。