cat posts/%e4%bb%8a%e9%80%b1%e3%81%ae%e3%82%bb%e3%82%ad%e3%83%a5%e3%83%aa%e3%83%86%e3%82%a3%e8%80%83%e5%af%9f%ef%bc%9a%e8%8d%b7%e7%89%a9%e3%81%ae%e4%b8%ad%e3%81%ab%e9%85%8d%e9%81%94%e5%93%a1%e3%81%8c%e6%bd%9c.md

今週のセキュリティ考察:荷物の中に配達員が潜んでいた——npm ChainDrop サプライチェーンワーム

「宅配業者に見せかけた侵入者が、荷物の中に隠れて届け先に上がり込み、次の荷物にも乗り移っていった。」——今週のnpmサプライチェーン攻撃は、まさにそういう話だ。

「荷物の中に配達員が潜んでいた」を技術的に解く

2026年8月4日、npmレジストリで「ChainDrop」と名付けられた自己増殖型マルウェアが確認された。発端はkeyv@6.0.0——多くのプロジェクトが依存するキャッシュ抽象化ライブラリ——への悪意あるコードの混入だ。

通常のサプライチェーン攻撃(ソフトウェアの製造・配布ルートを狙う攻撃)は「汚染されたパッケージを配る」で終わる。ChainDropが違うのは、感染したパッケージが実行されると、受け取ったプロジェクトの依存先にも感染を広げる点だ。SafeDepの調査では最終的に79パッケージ名にわたる353バージョンが汚染され、月間合計20億ダウンロード規模に達した。

flowchart LR
    A["攻撃者
悪意あるコード混入"] -->|"keyv@6.0.0に混入"| B["汚染パッケージ
(npm)"]
    B -->|"npm install"| C["開発者の
プロジェクト"]
    C -->|"自己増殖
感染拡大"| D["依存ライブラリ群
79パッケージ"]
    D -->|"フック書き換え"| E["Claude Code/
VS Code hooks"]
    E -->|"認証情報送信"| F["攻撃者
サーバー"]
    style A fill:#c0392b,color:#fff
    style B fill:#c0392b,color:#fff
    style F fill:#c0392b,color:#fff
    style D fill:#e67e22,color:#fff
    style E fill:#e67e22,color:#fff
    style C fill:#27ae60,color:#fff

攻撃コードは、開発環境内の.claude/hooks.vscode/settings.jsonを書き換え、認証情報や環境変数を外部サーバーに送信する仕組みが仕込まれていた。

「人気がある=信頼できる」という思い込みが崩れた瞬間

「月間200万ダウンロード」という数字はバッジではなく、ただ「多くの人が使っている」事実に過ぎない。ChainDropはまさにその信頼を逆用した。人気ライブラリを踏み台にすることで、攻撃者はゼロから悪意あるパッケージを公開するより格段に多くのプロジェクトに到達できる。しかも「依存先のパッケージ」という位置は、多くの開発者が積極的に監視していない場所だ。

さらに見落としやすいのは、package-lock.jsonで「バージョンを固定しているつもり」でも、間接依存(依存の依存)まで細かく確認しているプロジェクトが少ない、という現実だ。ワームが自己増殖する仕組みもここを突いている。

自分のプロジェクトに「配達員」が紛れ込んでいないか

ChainDropが狙った「開発ツールフックへの書き込み」は、npmに限った手法ではない。PythonのSetuptools、RubyのGemspec、RustのCargo build.rsも、インストール時に任意コードを走らせる機構を持っている。「インストール時スクリプトが走るのは正常」だからこそ見落とされやすい——今回の攻撃が突いた盲点はそこだ。

# 脆弱性と依存の確認
npm audit

# lockfileの意図しない変更がないか確認
git diff package-lock.json | grep '"version"'

今週の問い

今週、自分のプロジェクトで更新された依存関係はあるか。その変更内容を——changelogでもgit diffでも——一行でも確認しただろうか?

参考: The Hacker News — Keyv-Linked npm Worm / BleepingComputer — ChainDrop