Skip to main content

npmのReDoS脆弱性が143%増加、XSSも増加を続ける

著者
the state op open source small

2019年2月26日

0 分で読めます

Snykの年次レポート「State of Open Source Security 2019」へようこそ。本レポートは複数の記事に分けてお届けします。

これらの情報をまとめた、手作りの素敵なPDFレポートもダウンロードできます。さらに詳しい内容も掲載しています。

「State of Open Source Security 2019」レポートをダウンロード

正規表現によるサービス拒否(ReDoS)

Node.jsランタイムには多くの強みがありますが、その一つであるシングルスレッドのイベントループは、正しく使わなければ最大の弱点にもなり得ます。これは思っている以上に頻繁に起きています。

正規表現によるサービス拒否(ReDoS)攻撃は、一部の正規表現パターンが引き起こす、最悪のケースで計算量が非線形に増大する脆弱性を悪用します。シングルスレッドのランタイムでは深刻な影響をもたらす可能性があり、Node.jsはこの種の脆弱性の影響を特に受けやすいのです。

過去3年間で公表されたReDoS脆弱性は増加傾向にあり、2018年だけで143%増加しました。

「正規表現によるサービス拒否(ReDoS)の開示が増加」と題された折れ線グラフ。2016年の約14件から2018年には72件に増加。

XSS脆弱性

クロスサイトスクリプティング(XSS)攻撃は、Webアプリケーションにとって長年増加し続ける課題です。Snykが監視しているすべてのエコシステムで、2018年にXSS脆弱性が急増する傾向が見られました。

OWASPが15年以上にわたって主要な懸念事項として挙げているにもかかわらず、オープンソースライブラリのXSS脆弱性は増加し続けている

これらのエコシステムの中で最も多くのXSS脆弱性が確認されたのはnpmで、合計225件が公表されました。次いでMaven Central Repositoryが167件、PyPIが163件でした。2018年に最も多くのXSS脆弱性が公表されたのはPHP Packagistエコシステムで56件、次いでnpmが54件、Maven Centralが29件でした。

XSSの脆弱性が2014年の約80件から2018年には175件へと増加し、2015年から2017年にかけて変動していることを示す折れ線グラフ。

パストラバーサル

パスおよびディレクトリトラバーサルの脆弱性はnpmエコシステムで突出しており、2017年に146件、2018年に143件と、いずれも過去最多の報告数となりました。他のエコシステムでは大幅に少なく、これは喜ばしいことです。

その理由として、本番環境と開発環境の両方でNode.jsを使って構築された静的・動的Webサーバーが数多く存在し、こうした脆弱性が見つかる可能性のあるパッケージも多いことが考えられます。

2016年から2018年にかけての、RubyGems、PHP Packagist、PyPI、Maven Central、npmにおけるパストラバーサル脆弱性を示す棒グラフ。

SQLインジェクション脆弱性

過去10年にわたりOWASP Top 10に一貫して取り上げられてきた、もう一つの一般的な攻撃手法がCWE-89です。これは一般にSQLインジェクションとして知られています。

過去3年間を調べると、レビュー対象とした主要3エコシステムでは、それぞれ異なる年にピークを迎えています。2016年と2017年はMavenのライブラリで公表されたSQLインジェクション脆弱性が最多となり、2018年にはPHP Packagistのライブラリで最多となりました。

エコシステム別・年別のSQLインジェクションの公表件数を示す棒グラフ:npm 3、0、4件、Maven Central 8、6、2件、PHP Packagist 4、5、16件。

機密情報の漏えい

Maven CentralとPHP Packagistのレジストリを調べたところ、情報露出に関連する脆弱性が最も多く、どちらのエコシステムも2018年にピークを迎えていました。

情報露出は意図せず起きることがよくあります。プログラムやシステムが、環境変数の名前や値など、機密性の高い情報を開示してしまう場合に発生します。また、URLパラメーターに機密データを含めるなど、「設計上」の理由で起きることもあります。

Maven Centralレジストリにおける情報露出脆弱性の例として、apache spark、jenkins core、keyclock-saml-coreの各パッケージがあります。たとえばJenkinsのssh-agent CIプラグインでは、Read権限を持つユーザーがビルドログを閲覧するとSSH秘密鍵が漏えいする状態でした。

PyPIレジストリにも、情報露出脆弱性が見つかったライブラリが多数あります。たとえばdjangoパッケージでは、View権限しか持たない管理者ユーザーにユーザーのパスワードハッシュが表示されていました。また、djangorestframework-api-keyパッケージはAPIキーを平文で保存していました。

2016~2018年のJavaエコシステムにおける機密情報露出の脆弱性を示す棒グラフ。Maven Centralの件数が最も多く、2018年には53件に達しています。

機密情報の平文送信

最後に、npmエコシステム特有の、触れておくべき脆弱性があります。CWE-319、別名「機密情報の平文送信」です。これは安全でないプロトコルを介してリソースにアクセスする脆弱性です。2016年にパッケージで新たに報告された脆弱性は44件でしたが、2017年には合計110パッケージに増え、250%の増加となりました。

「エコシステムのセキュリティの実態と世間の認識は、大きく異なることがよくあります。JavaScriptは型付けがないため、型の操作によって安全でない言語だというイメージが広まっています。しかし、ここ数年にnpmモジュールで発見された脆弱性の数は、Maven Centralで発見された数を依然として下回っています。一方で、Node.jsが今もシングルスレッドであるために、深刻化する脆弱性もあります。Node.jsの世界でより一般的なReDoS(またはその他のCPU枯渇型DoS)はその一例です。こうしたリスクを軽減できるよう、Worker Threadsが近いうちにNode.jsで利用可能になることを期待しています。ここ数年、Node.jsのセキュリティコミュニティはますます活発になっています。今後もエコシステムの安全性を高めるため、努力を続けていけるでしょう。」

Vladimir de Turckheim

Node.js Foundation, Node.js Security Working Group

注目トピック:悪意のあるパッケージ

悪意のあるパッケージについては、悪意のあるDockerコンテナや、さまざまなエコシステムの公開レジストリに登録された悪意のあるパッケージなど、いろいろな文脈で耳にしたことがあるでしょう。開発者がマルウェアの配布経路として悪用された事例も、Delphiコンパイラに感染したInducマルウェアや、iOSおよびOS Xの開発者を標的にしたXCodeGhostなど、これまでに取り上げてきました。

ただし、悪意のあるパッケージはすべて同じ種類ではありません。エコシステムのレジストリについては、大きく次のように分類できます。

  • 人気の高いパッケージによく似た名前を使う、タイポスクワッティング攻撃

  • メンテナーのCIアカウントやレジストリアカウントが侵害されて悪意のあるバージョンが公開されるケース、またはプロジェクトの依存関係リストに悪意のあるパッケージが含まれるケース

  • ソーシャルエンジニアリングによって、悪意のあるパッケージ(または依存関係に追加された後に悪意を持つパッケージ)をプロジェクトの依存関係リストに含めるケース

2018年には、悪意のあるパッケージの被害が他のレジストリより多いことで知られるnpmエコシステムで、これらすべての種類が確認されました。2018年12月に話題になったevent-streamパッケージは、一見無害なオープンソースへの貢献を装った手口で配布された、悪意のある依存関係を利用していました。

この攻撃によって、わずか2か月で悪意のあるパッケージが驚異の800万回ダウンロードされました。2018年の別の事例として、メンテナーのアカウントが侵害されたESLint-scopeパッケージがあります。また、2018年にはnpmレジストリで悪意のあるパッケージのタイポスクワッティング攻撃が合計11件確認されました。

2018年、悪意のあるパッケージのダウンロード数が過去最多の800万回を記録。npmとPyPIでは25件のタイポスクワッティング攻撃が発生

過去に見られた典型的なタイポスクワッティングに加え、ESLint-scope攻撃など、前年よりも巧妙なnpmエコシステムへの攻撃も確認されました。特にevent-streamのインシデントは高度な技術と標的型攻撃の性質を示しており、これまでエコシステムで見られた悪意ある攻撃の中でも、際立っていました。

npmレジストリとは対照的に、悪意のあるパッケージが確認された他のレジストリはRubyGemsとPythonのみでした。RubyGemsでは2018年に1件、Pythonでは2017年に10件、2018年に13件の悪意のあるパッケージが見つかりました。

続きを読む:

CTFを始めよう

オンデマンドのバーチャル入門ワークショップを視聴して、CTFの課題の解き方を学びましょう。