PaPoo
cover

npmの信頼が、またひとつ薄くなった

この記事を読んでまず思ったのは、「パッケージを入れるだけでここまでやられるのか」という、かなり素朴で、それでいて重い怖さでした。npm の malware というだけなら珍しくないのですが、今回は単に credential を抜くだけで終わらず、感染した package からさらに別の package へ広がっていく“worm”になっている。しかも開発者の手元だけでなく CI 環境まで狙っているので、被害の入口がかなり広い。ライブラリを install した瞬間の lifecycle script がこんなに危ないのだと、あらためて突きつけられます。

特に引っかかったのは、「署名や provenance があるから安心、とはならない」点です。GitHub Actions の正規の release workflow を通っていて、OpenID Connect や SLSA の provenance まで付いていたとある。でも、それでも中身が安全だとは言えなかった。ここはかなり厄介で、いまの開発現場が頼っている“信頼の見え方”が、攻撃者の動き方と相性が悪いのだと思います。証明書や badge があると人はつい安心してしまうけれど、今回の話は「その証明はビルドの正当性を示すのであって、ソースの健全性までは保証しない」と冷たく言っているように読めました。

もうひとつ、地味だけど実務的に嫌なのは、被害範囲の数がぶれていて、しかもそのぶれ方が普通の人には役に立ちにくいことです。何百件、何千件と数字が並ぶのに、本文では「パッケージの数」であって「感染した端末の数」ではないと何度も釘を刺している。これは誠実ではある一方で、現場の防御としては「結局うちの lockfile はどうか」「その version が実際に解決されたのか」という細かい確認しかない。大きな数字を見て安心もできないし、逆に過剰に悲観しても外す。こういうとき、流行の“namespace 単位で止める”みたいな雑な対処が効きにくいのも納得でした。

それと、Claude Code や VS Code の hook を使って実行経路を増やしているのがいやらしいです。普通のインストール経路だけでなく、ワークスペースを信頼したとき、フォルダを開いたときにも動くようにしてある。つまり「自分で clone した repo だから安全だろう」という気持ちすら崩しにくる。開発ツールが便利になるほど、こういう“作業の自然な流れ”に乗せた攻撃が効いてしまうんだなと思いました。しかも hooks は必ず自動実行されるわけではない、という書き方もいやらしい。完全な即死ではなく、ちょっとした確認不足で踏ませる設計です。

結局、この記事でいちばん印象に残ったのは、信頼の層が全部まとめて試されている感じでした。package registry、GitHub Actions、workspace trust、CI、そして開発者の「たぶん大丈夫だろう」という感覚まで。どれか一段だけ固めても足りない。面倒ですが、lockfile と実際に解決された version を見る、install scripts をむやみに許さない、という地味な守りを積むしかないのだろうと思います。派手さはないけれど、こういう事件を見るとその地味さこそが本体だと感じます。


参考: Keyv-linked npmワーム、数百のパッケージを汚染し Claude Code と VS Code のフックを仕込む

同じ著者の記事