node-ipcに悪意あるコードが含まれている問題について
node-ipcというnpmパッケージに悪意あるコードが含まれていた問題についてのメモ書きです。
2022-03-15に、node-ipcのメンテナーによって悪意あるコードを含むnode-ipcが公開されていた問題です。
問題のあるバージョン
-
9.2.2unpublish済み -
10.1.1, 10.1.2unpublish済み - 11.0.0+
2022-03-17時点で、問題が解決された新しいバージョンは公開されていません。
📝 それぞれのバージョンで挙動が異なります。
CVEがそれぞれ詳しいですが、具体的には10.1.1, 10.1.2はファイルを書き換えるマルウェア的な挙動をしています。詳細は次のIssueや記事を見てください。
- Issue #233 · RIAEvangelist/node-ipc
- CVE-2022-23812 | RIAEvangelist/node-ipc is malware / protest-ware
- Alert: peacenotwar module sabotages npm developers in the node-ipc package to protest the invasion of Ukraine | Snyk
問題がないバージョン
- 9.2.1
- 10.1.0
📝 10.1.3は一応問題はありませんが、悪意ある変更をメジャーアップデートとしてpublishし直す前に、一度revertしてpublishされた特殊なバージョンです。
影響を受けるパッケージやツール
node-ipcを利用しているパッケージが影響を受けている可能性があります。
以下のツールでは、node-ipcのバージョンを固定するなど修正を含めたものがリリースされています。
- Vue CLI
- Unity Hub Release Notes - Unity
確認方法
node-ipc
を利用しているかは、次のコマンドで確認できます。
npmの場合
npm ls node-ipc
yarnの場合
yarn why node-ipc
それぞれの出力結果に、影響を受けているnode-ipc
のバージョンがある場合は、対応が必要になります。
対応方法
メンテナーによる意図的な混入なので、修正されたバージョンは2022-03-17時点ではありません。
基本的な対応方法はcolors
パッケージの時と同じく、問題がなかったバージョンに固定する回避策が有効です。
ただし、patchとminorバージョンで公開されていたものは、既にunpublishされています。
基本的には、問題のある11.0.0へアップデートするのを避けるのが良いと思います。
また、悪意あるものがminorやpatchで公開されたときに自動的に更新されないように、package-lock.json
やyarn.lock
などのロックファイルでインストールしたバージョンを固定しておくのが有効です。
新規インストールや孫依存の更新なども含めたバージョンを完全に固定したい場合は、パッケージマネージャごとの指定方法で対応が必要です。
npmではpackage.json
のoverrides
フィールドで、node-ipc
の直接/間接的なバージョンを固定できます。
{
"overrides": {
"node-ipc@>9.2.1 <10": "9.2.1",
"node-ipc@>10.1.0": "10.1.0"
}
}
yarnでは、package.json
のresolutions
フィールドで、node-ipc
の直接/間接的なバージョンを固定できます。
10.1.0に固定する例:
{
"resolutions": {
"node-ipc": "10.1.0"
}
}
メモ書き
npmなどパッケージシステムのサプライチェーンの問題が起きた時に調べていることのメモ書きです。
今回のケースだと、問題報告されていたIssueに大体のことが書かれていました。
(今は消えてるので、CVE-2022-23812 | RIAEvangelist/node-ipc is malware / protest-wareを見るのが良さそうです)
また、Vueコミュニティで話題になったからかcnpmのbug-versionsに問題のバージョンの情報がすぐ反映されていました。
サプライチェーン攻撃的なパッケージの公開だと、複数のpatch/minor/majorバージョンが同時に公開されることがあるため、node-ipc - npmのような最新のバージョンだけだと少しわかりにくいです。
最近はOpen Source Insightsを見ていて、ここでは公開されたバージョンのEvent Historyやメンテナーの権限の変化なども確認できます。
また、GitHubのタグとnpmのdist-tagの内容が一致してるという保証もないため、実際のコードはnpmに公開されているものを確認するのが正しいと思います(npmでインストールされるため)
npmのバージョン間でのDiffは次のようなサービスが利用できます。
こういった実行時の攻撃が含まれるようなサプライチェーン攻撃は静的なチェックだと検知が難しいです。今回はあまりうまく機能しないケースだったと思いますが、Socketというサービスがサプライチェーン攻撃のチェックを目的としたサービスとして最近公開されています。(@ferossが作っている)
実際に問題あったバージョンにはssl-geospec.jsというファイルがネットワークアクセスをしているというマークは出ていたけど、これを見てどうこうは難しそうではあった。
この辺がもっとうまくできるといいなーとは思います。
余談として、今回のGitHub Advisory Databaseは、ちゃんとバージョンごとの中を見て書いてる感じがあってよかったです。(GitHub Advisory DatabaseのRSSフィードを作った | Web ScratchでRSSもあります)
- Hidden functionality in node-ipc · GHSA-8gr3-2gjw-jj7g · GitHub Advisory Database
- node-ipc behavior change · GHSA-3mpp-xfvh-qh37 · GitHub Advisory Database
- Embedded Malicious Code in node-ipc · CVE-2022-23812 · GitHub Advisory Database
バージョンごとの挙動が結構違うので、中見見てないとわかりにくいものだったなという感じがしました。
事後としては、実際にどのぐらいの人が影響を受けたのかを確認したいのですが、npmのversionsタブのインストール数はunpublishすると消えてしまうので、これの記録が見れるサービスがあるといいなーという感じがしています。
Discussion
いつも有用な記事をありがとうございます!
さっそく自プロダクトでもチェックすることができました。
なお「対応方法」の下記の例について、
colors
ではなくnode-ipc
に修正いただけますか。ありがとうございます。修正しました