「悪性パッケージ23万件」のほとんどはゴミだった
公開データベースに登録された悪性パッケージを全件ダウンロードして数え直したら、64.5%が「悪意あるコードを含まない」ものでした。では本当に危険なものは何件なのか——答えは0.5%です。
この記事の内容
「オープンソースの悪性パッケージが過去最多」「npmに数十万件の不正パッケージ」。こうした見出しを目にする機会が増えました。数字はどんどん大きくなり、そのたびに「オープンソースはもう危険なのではないか」という不安が広がります。
では、その数字は何を数えたものなのでしょうか。
幸いなことに、この分野のデータは公開されています。OpenSSF(Open Source Security Foundation)が運営する悪性パッケージのデータベースは、誰でも全件ダウンロードできます。そこで実際に全23万5,296件を手元のデータベースに取り込み、登録日・エコシステム・報告元・手口で分解してみました。結果は、見出しの印象とはかなり違うものでした。
結論を先に言えば、数字の大部分は実際の脅威ではなく、数字の小さい部分にこそ本物の危険がありました。この記事の目的は、大きな数字に驚くのをやめて、どこを見るべきかを整理することです。オープンソースの利用をやめるべきだという主張ではまったくありません。なお本記事の集計は2026年8月8日時点のスナップショットであり、データベースは日々更新されています。
23万件という数字の正体
まず全体像です。エコシステム(パッケージの配布先)別に分けると、極端に偏っています。
| エコシステム | 登録数 | 割合 | 主な用途 |
|---|---|---|---|
| npm | 219,273 | 93.2% | JavaScript / Node.js |
| PyPI | 11,630 | 4.9% | Python |
| RubyGems | 3,512 | 1.5% | Ruby |
| NuGet | 777 | 0.3% | .NET / C# |
| GitHub Actions | 52 | 0.02% | CI/CD |
| VSCode拡張 | 20 | 0.01% | エディタ拡張 |
| Go / crates.io / Maven / Packagist | 32 | 0.01% | Go / Rust / Java / PHP |
npmだけで93.2%。ここまで偏るのは、npmが世界最大のパッケージ登録数を持ち、誰でも即座に無審査で公開できるためです。ただし、この偏りにはもうひとつ理由があります。それは次の数字を見るとわかります。
登録された年で分けると、こうなります。
| 年 | 登録数 | 推移 |
|---|---|---|
| 2021年 | 5 | |
| 2022年 | 7,451 | |
| 2023年 | 8,783 | |
| 2024年 | 12,555 | |
| 2025年 | 192,859 | |
| 2026年(8月8日まで) | 13,643 |
2025年だけで19万件。全体の82%です。「悪性パッケージが爆発的に増えた」という見出しは、この数字を指しています。
ところが、月単位まで分解すると、話がまったく変わります。
| 年月 | 登録数 | 推移 |
|---|---|---|
| 2025年8月 | 35,472 | |
| 2025年9月 | 5,724 | |
| 2025年10月 | 1,489 | |
| 2025年11月 | 142,256 | |
| 2025年12月 | 1,201 | |
| 2026年1月 | 619 | |
| 2026年7月 | 4,767 |
2025年11月の1か月だけで142,256件。全体の60.5%
前月の1,489件から、約96倍。翌月にはまた1,201件に戻っています。これは「攻撃が急増した」のではなく、何か特殊な出来事が1回あったことを示す形です。
グラフにすれば、11月だけが天を突く棒になります。この1本を含んだまま「悪性パッケージは前年比15倍」と書けば、間違いなく読者を誤解させます。では、11月に何があったのか。
犯人は「報酬目当てのゴミ」だった
手がかりは、報告元のデータにありました。11月に登録された142,256件のうち、142,153件(99.9%)が同一の報告元——Amazon Inspector からの登録だったのです。
そしてパッケージ名を並べると、異様な光景が現れます。
調べたところ、これは「IndonesianFoods(インドネシアン・フーズ)」と呼ばれるワーム型のスパムキャンペーンでした。2024年4月にセキュリティ企業Phylumが最初に発見し、その後Sonatypeが約15,000件、SourceCodeREDが67,579件と報告を重ね、最終的にAmazon Inspectorが15万件超を特定したものです。
なぜこんなものを大量に作るのか
目的は暗号資産の報酬でした。
tea.xyz(ティー)は、オープンソースへの貢献に応じて開発者に暗号資産を配る仕組みです。パッケージに tea.yaml という設定ファイルを置いて自分のウォレットを登録しておくと、そのパッケージの「貢献度」に応じて報酬が入ります。
攻撃者はここを突きました。パッケージに仕込まれた auto.js や publishScript.js というスクリプトを実行すると、7〜10秒ごとに新しいパッケージ名を自動生成して公開し続ける無限ループが始まります。1日あたり約17,000件のペースです。互いに依存関係を張り合わせることで「たくさん使われている人気パッケージ」に見せかけ、報酬を水増ししていました。
Amazon Inspector自身が公式に明言しています。「従来のマルウェアとは異なり、これらのパッケージはあからさまに悪意のあるコードを含んでいない(Unlike traditional malware, these packages do not contain overtly malicious code)」。同社はこれを「レジストリの汚染(registry pollution)」と表現しています。
つまり、間違ってインストールしても、あなたのパソコンから情報が盗まれるわけではありません。実害は「検索結果が汚れる」「レジストリの資源が浪費される」「依存関係が無駄に膨らむ」といった、エコシステム全体への迷惑が中心です。
なぜ1か月に集中したのか
ここが数字のからくりです。時系列を並べるとはっきりします。
| 日付 | 出来事 |
|---|---|
| 2024年4月 | Phylumが最初に発見。以後、実際の公開は1年半以上にわたって継続 |
| 2025年10月24日 | Amazon Inspectorが新しい検知ルールを導入 |
| 2025年11月7日ごろ | 大量のパッケージを検知、組織的なキャンペーンと判断 |
| 2025年11月8日 | OpenSSFへ情報を共有し、対応を調整 |
| 2025年11月 | 1件あたり平均30分でMAL-IDを採番し、まとめてデータベースへ登録 |
「11月に攻撃が96倍になった」のではない
実際に起きたのは、1年半かけて作られていたゴミが、2025年11月に一括で登録されたということです。データベースの「登録日」は、パッケージが作られた日でも、攻撃が起きた日でもありません。誰かが見つけて報告した日です。
月別グラフの棒は「その月に何が起きたか」ではなく「その月に誰が何を報告したか」を表しています。ここを取り違えると、統計はまるごと意味を失います。
報告元別に全体を見ると、この1回の出来事がデータベース全体を支配していることがわかります。
| 報告元 | 件数 | 全体に占める割合 |
|---|---|---|
| Amazon Inspector | 151,791 | 64.5% |
| GitHub Advisory(GHSA) | 25,966 | 11.0% |
| ReversingLabs | 17,217 | 7.3% |
| Checkmarx | 6,516 | 2.8% |
| OpenSSF Package Analysis | 5,749 | 2.4% |
| Google Open Source Security | 2,001 | 0.9% |
※ 1件が複数の報告元から登録される場合があるため、合計は100%になりません。
本物は0.5%。そちらが本当に危ない
ここまでの話で「では脅威は誇張なのか」と思われたかもしれません。逆です。
同じデータベースを「Shai-Hulud(シャイ・フルード)」という名前で検索すると、1,185件が出てきます。全体のわずか0.50%。しかしこの0.5%こそが、npmの歴史でもっとも深刻な攻撃でした。
| 比較 | tea.xyz報酬狙い(IndonesianFoods) | Shai-Hulud |
|---|---|---|
| 登録件数 | 151,791件(64.5%) | 1,185件(0.50%) |
| 悪意あるコード | 含まない | 含む |
| 目的 | 暗号資産の報酬の水増し | 認証情報の窃取 |
| 汚染されたパッケージ | 攻撃者が自作した無名のもの | 実際に使われている有名なもの |
| 実害 | 検索結果の汚染・資源の浪費 | 開発者の鍵が盗まれ、CI/CDまで波及 |
何をする攻撃だったのか
Shai-Huludは自己増殖する(ワーム型の)マルウェアです。動作はこうです。
| 手順 | やること |
|---|---|
| 1 | 汚染されたパッケージがインストールされると、スクリプトが自動実行される |
| 2 | 環境変数や .npmrc を漁り、npmトークン・GitHubのアクセストークン・SSH鍵・AWS/GCP/Azureの鍵を収集 |
| 3 | 盗んだ認証情報を、公開のGitHubリポジトリに書き出して外部へ持ち出す |
| 4 | 盗んだnpmトークンで、その開発者が管理する他のパッケージすべてに自分を注入して再公開 |
| 5 | 1に戻る(=感染が自動的に広がる) |
4番目が決定的です。1人の開発者のトークンを盗めば、その人が管理する全パッケージが汚染される。それを入れた次の開発者からまたトークンが盗まれる。人間が操作しなくても、勝手に広がっていく設計になっていました。
実際に汚染された名前を、手元のデータから拾ってみます。
第2章で見た teagood-cuekin100 のような、誰も使わない自動生成の名前とはまったく違います。これらは実際の開発現場で使われているライブラリです。
2025年11月24日に観測された第2波(Shai-Hulud 2.0)では、手口が変わりました。
① スクリプトの実行タイミングをインストール前(pre-install)に変更し、後段で動く静的スキャンをすり抜けるようにした。
② 数日のうちに1,000件以上のnpmパッケージと25,000〜27,000件のGitHubリポジトリに波及した。
③ もっとも悪質な点として、認証情報の窃取にも持ち出しにも失敗した場合、被害者のホームディレクトリ配下の書き込み可能なファイルを上書きして破壊する挙動が報告されています。
盗めなければ壊す。単なる情報窃取を超えた設計です。
手元のデータでも、Shai-Hulud関連の登録は2025年9月(203件)に始まり、2026年5月(498件)、2026年8月(446件)と断続的に再燃しています。終わった事件ではありません。
件数の大きさと、危険度は無関係
64.5%を占めるゴミは、踏んでも実害がほとんどない。0.5%しかない本物は、踏んだら開発環境ごと乗っ取られる。「何件見つかったか」は、危険度をまったく表していません。
なお、npmを狙った攻撃は他にも起きています。週1億回ダウンロードされる axios が乗っ取られた事件については、npmサプライチェーン攻撃とは?週1億回DLのaxios乗っ取り事件を徹底解説で、攻撃の3時間を分単位で追っています。
手口の内訳と、狙われる名前
23万件のうち、手口まで分類できたのは17,071件(全体の7.3%)にとどまります。残りは「悪意あるコードが見つかった」という記録だけで、詳細な分類がされていません。したがってこれは全体の縮図ではなく、分類できた範囲での内訳です。
| 手口 | 件数 | どういうものか |
|---|---|---|
| テスト・ゴミ | 6,506 | 研究者の検証用や、単なる無意味なパッケージ |
| 依存関係混乱 | 6,192 | 社内用の非公開パッケージと同じ名前を公開側に登録し、間違って取り込ませる |
| ブランド詐称 | 3,977 | 有名企業名を名前に含め、公式だと誤認させる |
| タイポスクワッティング | 367 | 打ち間違いを狙って似た名前を登録する |
| スコープ詐称 | 15 | 組織名の部分(@から始まる箇所)を偽装する |
| 自己増殖(ワーム) | 14 | 感染したものが自動的に他へ広がる |
件数として目立つのが依存関係混乱(Dependency Confusion)です。社内でしか使っていない company-internal-utils のような名前を、攻撃者が先回りして公開レジストリに登録しておく。すると設定によっては、社内版ではなく公開されている偽物のほうが取り込まれてしまう、という手口です。
打ち間違いで狙われているパッケージ
タイポスクワッティングの標的を集計すると、はっきりした傾向がありました。
| 本物のパッケージ名 | 偽物の登録数 | 何のライブラリか |
|---|---|---|
requests | 47 | Python:HTTP通信の定番中の定番 |
colorama | 39 | Python:ターミナルの文字色 |
pillow | 27 | Python:画像処理 |
scikit-learn | 21 | Python:機械学習 |
beautifulsoup4 | 21 | Python:HTML解析 |
matplotlib | 20 | Python:グラフ描画 |
tensorflow | 17 | Python:機械学習 |
selenium | 14 | Python:ブラウザ自動操作 |
lodash | 10 | JavaScript:ユーティリティ |
flask | 8 | Python:Webフレームワーク |
狙われているのは「Pythonの入門者が最初に打つ名前」
上位10個のうち8個がPython、しかも requests・pillow・matplotlib など、プログラミングを学び始めて最初に触るライブラリばかりです。request(sが抜けている)のような偽物が16件も登録されています。
攻撃者は熟練者ではなく、打ち間違いに気づきにくい初心者を狙っています。
ちなみに、第1章で見た「2番目に多い月」である2025年8月の35,472件も調べてみました。こちらの上位は @zalastax(4,135件)、test(1,952件)、project(999件)、@malware(648件)といった名前で占められています。実際の攻撃というより、研究・検証目的で登録されたものや、名前を押さえるためのプレースホルダーが大半と見られます。手口分類でも「テスト・ゴミ」が6,506件と最多でした。
上位2つの月が、どちらも「攻撃ではないもの」で占められている
1位の2025年11月(142,256件)は報酬狙いのスパム、2位の2025年8月(35,472件)は検証・プレースホルダー中心。この2か月だけで全体の75.5%です。データベースの大部分は、攻撃の記録ではありません。
この手の統計を読むときの3つの罠
ここまでの分析から、セキュリティ統計を読むときに共通して使える教訓が3つ抽出できます。これはパッケージの話に限りません。
罠1:「登録日」は「発生日」ではない
2025年11月の142,256件は、その月に作られたものではなく、その月に報告されたものでした。実際の公開は1年半にわたって続いていたものです。
脆弱性データベースでも漏えい事故のデータベースでも、同じ問題が起きます。グラフの山が「攻撃の山」なのか「報告の山」なのかを、必ず確認してください。大きな組織が一括で報告すると、その月だけが跳ね上がります。
罠2:1つの報告元が全体を左右する
このデータベースは、Amazon Inspector 1社の報告だけで64.5%を占めています。つまり「悪性パッケージの傾向」を語っているつもりで、実際にはAmazon Inspectorの検知ルールの傾向を語ってしまう危険があります。
検知する側が新しいルールを入れれば数字は増え、その分野への関心を失えば数字は減ります。数字の増減は、脅威の増減であると同時に、観測体制の増減でもあります。
罠3:件数と危険度は別の軸
第3章で見たとおりです。64.5%のゴミより、0.5%のワームのほうが桁違いに危険でした。「過去最多」という見出しは、危険が最大であることを意味しません。
この3つは、どのセキュリティ統計にも当てはまります
「〇〇が過去最多」という記事を読んだら、①いつ起きたものを、いつ数えたのか ②誰が数えたのか ③件数のうち本当に危険なものは何件か——この3つを確認する。それだけで、数字に振り回されることは大幅に減ります。
では、何をすればいいのか
データから見えた実際の脅威に対して、効果のある順に並べます。プログラミングを学び始めた方から、業務で開発している方まで対象です。
1. インストール時のスクリプト自動実行を止める(Shai-Hulud対策の本丸)
Shai-Huludは、パッケージを入れた瞬間に自動で走るスクリプトによって動きました。これを止めるだけで、多くの攻撃は無力化されます。
ただし、一部のパッケージはビルドに必要なスクリプトを持っているため、動かなくなる場合があります。まずCI/CD環境から適用するのが現実的です。
2. 打ち間違いを目視でなくコピーで防ぐ
第4章のとおり、標的はPythonの定番ライブラリです。パッケージ名は記憶で打たず、公式ドキュメントやPyPI・npmの公式ページからコピーする。これだけでタイポスクワッティングはほぼ防げます。requests と request、colorama と colourama の差は、目視では見落とします。
3. バージョンを固定する
Shai-Huludは、正規のパッケージの新しいバージョンとして汚染版を公開しました。つまり「いつも使っている安全なライブラリ」が、ある日突然汚染された版に更新される形です。
package-lock.json や requirements.txt でバージョンを固定し、更新するときは意図して更新する運用にしてください。自動で最新版を取りに行く設定は、この攻撃に対して無防備です。
4. トークンの棚卸しと有効期限の設定
盗まれたのはnpmトークン、GitHubのアクセストークン、SSH鍵、クラウドの鍵でした。無期限のトークンを発行したまま忘れていないかを確認してください。期限を切っておけば、盗まれても被害は期限までに限定されます。
5. 社内用パッケージ名を先に押さえる
依存関係混乱(6,192件)への対策です。社内でしか使わない名前でも、公開レジストリ側に同名を先回りで登録しておくか、社内レジストリを明示的に優先する設定にしておきます。
① 悪性パッケージ23万5,296件のうち、60.5%が2025年11月の1か月に集中していた。
② その正体は、暗号資産の報酬を狙ったスパム15万件。Amazon Inspector自身が「悪意あるコードを含まない」と明言している。
③ 数字が跳ねたのは攻撃が増えたからではなく、1年半分がまとめて報告されたから。
④ 本当に危険なShai-Huludワームは1,185件(0.50%)。ただしこちらは実在の人気ライブラリを汚染し、鍵を盗み、自己増殖した。
⑤ タイポスクワッティングの標的は requests などPython入門者が最初に打つ名前に集中している。
⑥ 統計を読むときは「いつ起きたか/誰が数えたか/本当に危険なのは何件か」の3点を確認する。
大きな数字は不安をかき立てますが、行動の指針にはなりません。23万件に怯えるかわりに、1,185件がどう動いたかを知るほうが、はるかに役に立ちます。そして、そのために必要なデータは、すべて無料で公開されています。
オープンソースそのものの脆弱性については、実際に使われているツールを題材にしたOllama に CVSS 9.1の重大脆弱性|APIキーと会話データが盗まれる前に今すぐ確認もあわせてご覧ください。
よくある質問
結局、npmやPyPIは使わないほうがいいのですか?
そういう話ではありません。世界中のソフトウェアがこれらの上に成り立っており、使わない選択肢は現実的ではありません。重要なのは「入れる瞬間」と「更新する瞬間」に注意を集中させることです。第6章の5つの対策は、いずれも利便性をほとんど損なわずに実行できます。
tea.xyz は悪いサービスなのですか?
tea.xyz自体は、オープンソースへの貢献に報酬を出すことを目的とした仕組みです。問題は、その報酬の計算方法が悪用可能だったことにあります。「貢献度」を機械的に測ろうとすると、機械的に水増しできてしまう——報酬設計にはこの種の難しさが常につきまといます。この記事はtea.xyzの是非を論じるものではありません。
自分のプロジェクトが汚染されているか確認する方法は?
npm audit(npm)や pip-audit(Python)で既知の問題を確認できます。加えて、Shai-Huludの場合は身に覚えのないバージョンが公開されていないか、GitHubに作った覚えのないリポジトリがないかの確認が有効です。心当たりがある場合は、npmトークンとGitHubのアクセストークンをただちに無効化して再発行してください。
「悪意あるコードを含まない」なら、15万件は放置していいのですか?
いいえ。直接の攻撃力はなくても、検索結果を汚し、レジストリの運用資源を浪費し、依存関係を無意味に膨らませます。何より本物の脅威を見つけにくくするという害があります。この記事で示したとおり、0.5%の本物が64.5%のゴミに埋もれる状況そのものが、防御側にとって不利益です。
この記事の23万件という数字は、今も同じですか?
いいえ。2026年8月8日時点のスナップショットです。データベースは日々更新されており、新しい一括報告があれば、また特定の月だけが跳ね上がります。むしろ「また跳ねたときに、それが一括報告かどうかを見抜けること」がこの記事の目的です。
プログラミング初心者ですが、何から始めればいいですか?
まずパッケージ名をコピーして貼り付ける習慣だけ徹底してください。第4章のとおり、狙われているのは初学者が最初に使うライブラリです。手で打たなければ、この記事で挙げた脅威のうち、あなたに直接届きうるものの多くは避けられます。
出典
- 集計対象:OpenSSF Malicious Packages Repository(OSV形式で公開)の全登録 235,296件を2026年8月8日に取得し、独自にデータベース化して集計。https://github.com/ossf/malicious-packages / https://osv.dev/
- AWS Security Blog「Amazon Inspector detects over 150,000 malicious packages linked to token farming campaign」(検知ルール展開 2025年10月24日、OpenSSFへの共有 2025年11月8日、”these packages do not contain overtly malicious code” の記述を含む)https://aws.amazon.com/blogs/security/
- IndonesianFoods ワームの経緯・命名パターン・公開速度(7〜10秒ごと/1日約17,000件)については The Hacker News の報道(2025年11月)による。初期発見は Phylum(2024年4月)、その後 Sonatype・SourceCodeRED・Endor Labs が段階的に規模を報告。
- Unit 42(Palo Alto Networks)「”Shai-Hulud” Worm Compromises npm Ecosystem in Supply Chain Attack」(2025年9月初出・11月26日更新。@ctrl/tinycolor の汚染、窃取対象の認証情報、自己増殖の仕組み、第2波の規模)https://unit42.paloaltonetworks.com/npm-supply-chain-attack/
- 第2波における pre-install への変更、破壊的挙動、および 25,000件超のリポジトリ波及については、Unit 42 のほか Wiz・Datadog Security Labs・Netskope など複数の独立した分析が一致して報告している。
※ 手口の分類(依存関係混乱・タイポスクワッティング等)は、登録内容から当サイトが独自に判定したものであり、分類できたのは全体の7.3%です。分類済みの範囲での内訳としてお読みください。


コメント