公開日
NPM脆弱性の48.6%は悪意ある罠?主要言語の最新セキュリティ調査結果

現代のソフトウェア開発において、オープンソースソフトウェア(OSS)の利用はもはや当たり前となっています。便利なライブラリやフレームワークを誰もが活用できることで、開発のスピードは飛躍的に向上しました。しかし、その利便性の裏側で、セキュリティリスクが静かに、そして急速に深刻化しているとしたら、あなたはどうしますか?
本記事では、ノースイースタン大学などの研究チームが発表した論文「Open Source, Open Threats? Investigating Security Challenges in Open-Source Software」(2025年)の最新の調査結果に基づき、OSS利用に潜むセキュリティの厳しい現実を、具体的なデータとともに解き明かしていきます。
1. 脆弱性は「パッケージ増加ペース」をはるかに上回って急増している
10の主要プログラミング言語における3万件以上の脆弱性レポートを分析した本調査によると、OSSエコシステムの拡大は、利便性をもたらすと同時に、攻撃者にとっての「攻撃対象領域」の拡大も意味します。研究によれば、OSSパッケージの数は年平均で約25%という驚異的なペースで増加しています。しかし、問題は、報告される脆弱性の数がそれをはるかに上回るペースで増えていることです。
上の図が示すように、NPM、Maven、PyPIといった主要なエコシステムで、脆弱性の報告数は右肩上がりに増え続けています。
さらに衝撃的なのは、その増加率です。OSSパッケージ全体の年間成長率が平均25%であるのに対し、脆弱性を持つパッケージの数は年平均で98%も増加しています。これは、新規パッケージの公開スピードの約4倍の速さで、危険性が増していることを示唆しています。単に数が増えているだけでなく、セキュリティの悪化が加速しているという、非常に憂慮すべき事態です。
2. 危険性が増す2つの要因:脆弱性の「長期化」と「集中化」
脆弱性の問題は、単に数が増えているだけではありません。その「質」に目を向けると、さらに2つの深刻な傾向が見えてきます。それは、一度発見された脆弱性が修正されないまま「長く残り続ける」こと、そして危険性が「特定のパッケージに集中する」ことです。
一度見つかった脆弱性は、なかなか修正されない?
脆弱性は発見されればすぐに修正される、と期待したいところですが、現実は異なります。研究では、脆弱性が最初に含まれたバージョンがリリースされてから、修正されたバージョンがリリースされるまでの期間、すなわち「脆弱性の寿命」を分析しています。
上記の図が示すように、驚くべきことに、脆弱性の平均寿命は調査期間(2017年〜2024年)を通じて85%も長くなっています。 2017年には平均1,056日(約2.9年)だったものが、2024年には1,956日(約5.4年)にまで延びています。これは、脆弱性を報告するコミュニティの努力が活発になっている一方で、修正が追いつかず、危険な状態がより長く放置されているという厳しい現実を浮き彫りにしています。
危険なパッケージはごく一部?エコシステムで異なる脆弱性の集まり方
すべてのパッケージが等しく危険なわけではありません。脆弱性は、特定のエコシステムやパッケージに集中する傾向があります。この「集中度」を、脆弱性を持つパッケージ1つあたりの平均脆弱性数で見てみましょう。
この図を見ると、エコシステムによって傾向が大きく異なることがわかります。例えば、PHPのパッケージマネージャであるComposerでは、1つの脆弱なパッケージあたり平均4.92件もの脆弱性が報告されており、特定のパッケージが繰り返し攻撃対象になっていることが伺えます。一方で、JavaScriptのNPM(1.75件)やGo(1.70件)では、脆弱性がより広範囲のパッケージに分散している傾向が見られます。
このようなエコシステムごとの特性を理解することは、リスク評価や対策を立てる上で非常に重要です。
3. どんな脆弱性に注意すべき?共通の脅威とエコシステム固有のリスク
では、具体的にどのような種類の脆弱性が多発しているのでしょうか。研究では、CWE(共通脆弱性タイプ一覧)を分析し、プラットフォーム共通の脅威と、特定の言語に根差したリスクを明らかにしています。
要注意!全脆弱性の半数を占める”トップ7”の脅威
驚くべきことに、数多く存在する脆弱性の種類の中で、ごく一部のタイプが大部分を占めていることが分かりました。
上記の図が示す通り、平均して、たった7種類のCWEが、報告された全脆弱性の50%以上を占めています。 これは、対策を講じるべき優先順位が高い脆弱性タイプが存在することを意味します。特に、クロスサイトスクリプティング(CWE-79)やパストラバーサル(CWE-22)といったWebアプリケーションにおける古典的な脆弱性は、依然として多くのエコシステムで主要な脅威となっています。
言語ごとに異なる!C/C++やJavaScript特有の脆弱性
一方で、プログラミング言語の特性に深く関連する脆弱性も存在します。
- C/C++: 手動でのメモリ管理が求められるため、ヒープベースのバッファオーバーフロー(CWE-122)や解放済みメモリの使用(CWE-416)といったメモリ関連の脆弱性が多く報告されています。
- JavaScript (NPM): プロトタイプベースの継承という言語仕様を悪用する「プロトタイプ汚染」(CWE-1321)が特有の脅威として挙げられます。NPMではこの脆弱性が560件以上も報告されています。
これらの言語固有のリスクは、開発者がその言語の特性を深く理解し、安全なコーディングを実践する必要があることを示しています。
4. 【要注意】脆弱性の正体は「意図的な攻撃」だった - NPMでは報告の約半数が悪意あるパッケージ
これまで見てきた脆弱性の多くは、設計上のミスや実装の不備といった「過失」に起因するものでした。しかし、今、最も警戒すべき脅威は、それらとは一線を画す「意図的に仕組まれた攻撃」です。研究では、この「埋め込まれた悪意のあるコード」(CWE-506)の分析に焦点を当てています。
エコシステム | CWE-506の報告数 | 当該エコシステムのCWE総数に占める割合 |
---|---|---|
NPM | 3,893 | 48.58% |
PyPI | 518 | 13.92% |
NuGet | 29 | 2.33% |
Crates | 11 | 0.86% |
RubyGems | 4 | 0.36% |
Maven | 1 | 0.02% |
Others | 0 | 0.00% |
Total | 4,456 | - |
これらは、人気ライブラリに似せた名前で開発者を騙す「タイポスクワッティング」や、組織内のプライベートなパッケージ名で公開リポジトリに登録して悪意あるコードを注入させる「依存関係かく乱(Dependency Confusion)」といった、巧妙なサプライチェーン攻撃の一環です。もはや脆弱性は「うっかり生まれるもの」だけでなく、「意図的に作られ、仕掛けられるもの」へと変化しているのです。
5. まとめ:OSSの恩恵を安全に享受するために
今回の調査結果は、OSSを利用する全ての開発者とセキュリティ担当者に警鐘を鳴らすものです。改めて重要なポイントを振り返りましょう。
- 脆弱性の増加はOSSの成長ペースを4倍も上回っている。
- 脆弱性の寿命は長期化しており(平均5年以上)、危険な状態が長く放置されている。
- 注意すべき脆弱性の種類は偏っており、クロスサイトスクリプティングなど上位7タイプが全体の半数を占める。
- 最大の脅威は「意図的に埋め込まれた悪意のあるパッケージ」であり、特にNPMでは報告の約半数がこれに該当する。
OSSは強力なツールですが、その利用には相応の責任が伴います。利用するパッケージの脆弱性情報を定期的にチェックし、依存関係をクリーンに保ち、そして何よりも「ただ存在するだけの脆弱性」だけでなく「悪意を持って仕掛けられた攻撃」が潜んでいる可能性を常に意識することが、これからのソフトウェア開発には不可欠と言えるでしょう。
Webサービスや社内のセキュリティにお困りですか? 弊社のサービス は、開発チームが抱える課題を解決し、生産性と幸福度を向上させるための様々なソリューションを提供しています。ぜひお気軽にご相談ください!
参考資料: