Snykが読み解くNode.jsとnpmのオープンソースセキュリティの現状レポート2019
2019年10月9日
0 分で読めます「State of Open Source Security Report 2019」では、さまざまなプログラミング言語のエコシステムにおけるオープンソースセキュリティの現状を把握することを目指しました。500人を超えるオープンソースのメンテナーやユーザーから回答を集め、セキュリティリスクに関するプロセスや知識、一般的なメンテナーのスキルレベルについて分析しました。
アンケート回答者から得た知見に加え、Snyk独自の脆弱性データベースを含む複数の公開・非公開ソースのデータも分析しました。プログラミング言語によるセキュリティ問題の違いや、ユーザーがセキュリティ修正を含むバージョンアップを適用するまでの速さなどを評価しています。今年のレポートでは、Dockerユーザーへの脆弱性の影響や、セキュリティリスクを軽減するために知っておくべきことも調査しました。
簡単なテストを実行して、公開GitHubリポジトリやnpmパッケージに既知の脆弱性がないか確認しましょう。
npmエコシステム
Snyk Vulnerability Databaseを調べたところ、JavaScriptおよびNode.jsのエコシステムに特有の傾向が顕著な脆弱性タイプがいくつか見つかりました。まず、パスおよびディレクトリトラバーサルはnpmエコシステムで際立っており、2017年と2018年にはそれぞれ146件、143件と、過去最多の報告件数を記録しました。他のエコシステムでは、報告件数ははるかに少ない(あるいは、先を行っていると言うべきでしょうか?)状況です。いずれにせよ、報告される脆弱性が少ないのは喜ばしいことです。
これらの脆弱性のうち数百件は、SnykがFacebookのセキュリティ研究者であり、バークレー校のコンピューターサイエンス博士課程に在籍するLiang Gongと共同で行ったセキュリティ調査によって発見されました。この調査では、npmエコシステムに数十件のディレクトリトラバーサル脆弱性が見つかりました。また、開発者の多くのユースケースで繰り返し必要とされることから、静的・動的Webサーバーがnpmレジストリに広く存在することも明らかになりました。

もう一つ興味深い脆弱性タイプが、Node.jsにほぼ固有のReDoS(正規表現によるサービス拒否)です。この攻撃では、一部の正規表現パターンによって引き起こされる、最悪の場合に計算量が非線形に増大する脆弱性を悪用します。シングルスレッドのランタイムでは深刻な影響を及ぼす可能性があり、Node.jsがこの種の脆弱性の影響を特に受けやすいのはそのためです。もちろん、サーバーレス技術の普及に伴い、状況は変わるかもしれません。従量課金モデルでは、ReDoS攻撃によってシステムが動的にスケールし、サービス所有者に高額な費用が発生する可能性があります。いわば「資金枯渇によるサービス拒否」とでも呼べる状況です。
Node.jsランタイムには多くの強みがあることで知られています。シングルスレッドのイベントループもその一つですが、不適切に使えば最も弱い部分にもなり得ます。これは思っている以上によく起こります。2018年3月、公式Node.jsランタイムのセキュリティリリースには、Node.js 4.x系列に影響するコアのpathモジュールの深刻度の高いReDoS脆弱性を修正するパッチが含まれていました。Virginia TechのJames Davisが発見したこの脆弱性の修正は、問題を軽減するためNode.js 6.x以降にも適用されました。
この脆弱性がNode.jsに特有であることを示すため、2016年から2019年までの他のエコシステムも調べました。その結果、PHPで報告されたReDoS脆弱性は2017年の1件のみでした。JavaとRubyのエコシステムでは、2018年にそれぞれ1件が報告されています。一方Node.jsでは、過去3年間に合計116件が報告され、報告件数は増加傾向にあります。ただし、コードに存在する脆弱性と、実際に報告された脆弱性は区別することが重要です。この数字は、期間中にコードベースへ持ち込まれた脆弱性の数ではなく、発見されてコードベースから取り除かれた脆弱性の数を示しています。このグラフを見て、ReDoS脆弱性の発見と排除に注力できていることを喜ぶこともできます。そうすれば、今後、実際に悪用可能な問題が減ると期待できるからです。

レポートのその他の調査結果については続きを読む。新しいState of Open Source Security Report 2020もぜひご覧ください!


