Skip to main content

npmレジストリ上のパッケージの動作について、私たちはどれほど理解しているのでしょうか?

著者
How much do you really know about the npm package registry

2019年4月22日

0 分で読めます

『オープンソースセキュリティの現状レポート 2019』では、ここ数年の言語別パッケージリポジトリの成長について詳しく紹介しました。ご覧いただいたとおり、npmは毎年、圧倒的な差をつけて首位に立っています。

この記事の執筆時点で、npmには96万を超えるパッケージが登録されており、2018年だけで25万以上のパッケージが追加されました。

そこで、npmエコシステムにおけるパッケージの動作について、どれほど把握しているか考えたことはありますか?パッケージ同士はどの程度つながっているのでしょうか?

現在最大のオープンソースパッケージレジストリを探ってみましょう!

最近発表された研究論文『Security Issues in Language-based Sofware [sic] Ecosystems』(K. Vaidya、Ruturaj、Lorenzo De Carli、Drew Davidson、Vaibhav Rastogi、2019年)では、npmやPyPIなどのオープンソース言語リポジトリに対するセキュリティ攻撃を調査しています。主に悪意のあるパッケージに焦点を当て、各言語エコシステム固有の特性がその影響にどう関わるかを分析しています。

この研究はとても興味深く、研究データをもとにいくつか質問を作り、Twitterのような公開の場で尋ねてみたいと思いました。パッケージの健全性や他のパッケージとのつながりについて、JavaScript開発者がnpmエコシステムをどう捉えているかを調べるためです。

npmレジストリのパッケージにまつわる誤解

この研究論文から、一般向けアンケートとして投稿する次の質問に関連するデータを取り出しました。

  1. npmのパッケージのうち、依存関係も被依存関係もないものは何パーセントでしょうか?

  2. npmにおけるパッケージの依存チェーンの平均的な深さはどれくらいでしょうか?

  3. npmのパッケージのうち、放置されていると考えられるものはいくつでしょうか?(*過去12か月間にリリースがないなどの指標に基づく)

興味深いこれらの質問を選び、Twitterにアンケートを投稿して回答を集めることにしました。

npmの孤立パッケージ

最初の質問:npmのパッケージのうち、依存関係も被依存関係もないものは何パーセントでしょうか?

npmには959,567個?
#npmのパッケージのうち、依存関係も被依存関係もないものは何パーセントでしょうか?#javascript #nodejs #npmjsリツイートしてください!

— Liran Tal (@liran_tal) 2019年4月15日

正解は、npmのパッケージの28%には依存関係も被依存関係もありません。

見てのとおり、回答者の66%は、npmレジストリがパッケージ同士のつながりで非常に複雑に入り組んでいると考えています。しかし研究論文によると、npmレジストリの全パッケージのうち、依存関係も被依存関係もないものはわずか28%。この回答を選んだ人は、わずか7%でした。

PyPIリポジトリでは、この割合は36%に上がります。

npmの依存チェーンの深さ

2つ目の質問:npmにおけるパッケージの依存チェーンの平均的な深さはどれくらいでしょうか?

#npmjsには961,600個
npmにおけるパッケージの依存チェーンの平均的な深さは?#javascript #nodejs #npmjsリツイートしてください!

— Liran Tal (@liran_tal) 2019年4月17日

正解は、npmにおけるパッケージの依存チェーンの深さは平均4.39パッケージです。

レポートによると、依存関係ツリーの深さ、つまり最も長い依存チェーンの長さは、平均で4パッケージを超えています。これに対してPyPIでは、わずか1.7です。

表3:ノード数、平均出次数、依存関係ツリーのサイズ、深さで比較したnpmとPyPIのパッケージ依存関係グラフ。

ここから、JavaScript開発者は再利用可能な小さなコード単位を作り、それをプロジェクト間で積極的に再利用する傾向があると考えられます。

npmの放置されたパッケージ

3つ目の質問:npmのパッケージのうち、放置されていると考えられるものはいくつでしょうか?

最後の興味深いアンケートです!
#npmのパッケージのうち、放置されている[1]と考えられるものはどれくらいでしょうか?

[1] 過去12か月間にリリースがないなどの指標に基づく
リツイートしてください。#javascript #nodejs #npmjs #opensource— Liran Tal (@liran_tal) 2019年4月18日

正解は、npmのパッケージの61%が過去12か月間にリリースを公開していません。

先行研究を引き継ぎ、この調査ではリリース状況を指標として、放置されたパッケージを定義しています。つまり、メンテナーが過去12か月間にパッケージのリリースを行っていない場合、そのパッケージは放置されていると見なされます。

メンテナンスされていないパッケージと、機能が完成して成熟段階に達し、追加リリースが不要なパッケージを区別するのは簡単ではありません。この指標には異論もあるかもしれませんが、実際の数値は衝撃的です。

レポートによると、調査時点でnpmにあった約80万1,000個のパッケージのうち、約49万6,000個は過去12か月間にリリースがありませんでした。つまり、npmのパッケージの61%は新しいリリースを一切公開していないのです。

PyPIリポジトリでも同様で、全パッケージの57%が過去12か月間にリリースされていません。

放置されたパッケージはダウンロード頻度も低いのでしょうか?そうとは限りません。

レポートが示すように、どちらのエコシステムでも累計ダウンロード数は数十億に達しています。

次のグラフは、レポートの基準に照らして放置されていると見なした、ダウンロード数上位20個のパッケージを示しています。wordwrapやis-objectなどのパッケージは、年間で数億回ダウンロードされています。

放棄されたnpmパッケージのダウンロード数を示す棒グラフ。wordwrapとlodashが上位を占め、20個のパッケージ全体ではおおむね減少傾向にある。

まとめ

オープンソースソフトウェアの成長に伴い、公開されている言語別パッケージリポジトリとそのセキュリティに関する調査は、今後さらに増えるでしょう。

2017年1月から2019年1月までにMaven Central、npm、NuGet、PyPI、RubyGemsでインデックス化されたパッケージの総数を示す折れ線グラフ。

この研究は、次のように結論づけています。

  • パッケージリポジトリやパッケージマネージャーの改善を提言しています。たとえば、タイポスクワッティング攻撃への対策として、意図していないパッケージを誤ってインストールしようとしている場合に、ユーザーへ警告することが推奨されています。

  • こうしたエコシステムの性質から、「悪用されやすい状態にあり、今後インシデントの数は増える一方だ」とレポートは述べています。

オープンソースを活用しましょう。安全を守りましょう。

CTFを始めよう

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