📑

node-ipcに悪意あるコードが含まれている問題について

2022/03/17に公開約5,700字2件のコメント

node-ipcというnpmパッケージに悪意あるコードが含まれていた問題についてのメモ書きです。

2022-03-15に、node-ipcのメンテナーによって悪意あるコードを含むnode-ipcが公開されていた問題です。

問題のあるバージョン

2022-03-17時点で、問題が解決された新しいバージョンは公開されていません。

📝 それぞれのバージョンで挙動が異なります。
CVEがそれぞれ詳しいですが、具体的には10.1.1, 10.1.2はファイルを書き換えるマルウェア的な挙動をしています。詳細は次のIssueや記事を見てください。

問題がないバージョン

  • 9.2.1
  • 10.1.0

📝 10.1.3は一応問題はありませんが、悪意ある変更をメジャーアップデートとしてpublishし直す前に、一度revertしてpublishされた特殊なバージョンです。

https://github.com/RIAEvangelist/node-ipc/issues/233#issuecomment-1063557929

影響を受けるパッケージやツール

node-ipcを利用しているパッケージが影響を受けている可能性があります。

以下のツールでは、node-ipcのバージョンを固定するなど修正を含めたものがリリースされています。

確認方法

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.jsonyarn.lockなどのロックファイルでインストールしたバージョンを固定しておくのが有効です。

新規インストールや孫依存の更新なども含めたバージョンを完全に固定したい場合は、パッケージマネージャごとの指定方法で対応が必要です。

npmではpackage.jsonoverridesフィールドで、node-ipcの直接/間接的なバージョンを固定できます。

{
  "overrides": {
    "node-ipc@>9.2.1 <10": "9.2.1",
    "node-ipc@>10.1.0": "10.1.0"
  }
}

yarnでは、package.jsonresolutionsフィールドで、node-ipcの直接/間接的なバージョンを固定できます。

10.1.0に固定する例:

{
  "resolutions": {
    "node-ipc": "10.1.0" 
  }
}

メモ書き

npmなどパッケージシステムのサプライチェーンの問題が起きた時に調べていることのメモ書きです。

今回のケースだと、問題報告されていたIssueに大体のことが書かれていました。

https://github.com/RIAEvangelist/node-ipc/issues/233

(今は消えてるので、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やメンテナーの権限の変化なども確認できます。

node-ipc | npm | Open Source Insights

また、GitHubのタグとnpmのdist-tagの内容が一致してるという保証もないため、実際のコードはnpmに公開されているものを確認するのが正しいと思います(npmでインストールされるため)

npmのバージョン間でのDiffは次のようなサービスが利用できます。

こういった実行時の攻撃が含まれるようなサプライチェーン攻撃は静的なチェックだと検知が難しいです。今回はあまりうまく機能しないケースだったと思いますが、Socketというサービスがサプライチェーン攻撃のチェックを目的としたサービスとして最近公開されています。(@ferossが作っている)

https://socket.dev/npm/package/node-ipc/overview/10.1.2

実際に問題あったバージョンにはssl-geospec.jsというファイルがネットワークアクセスをしているというマークは出ていたけど、これを見てどうこうは難しそうではあった。

この辺がもっとうまくできるといいなーとは思います。

余談として、今回のGitHub Advisory Databaseは、ちゃんとバージョンごとの中を見て書いてる感じがあってよかったです。(GitHub Advisory DatabaseのRSSフィードを作った | Web ScratchでRSSもあります)

バージョンごとの挙動が結構違うので、中見見てないとわかりにくいものだったなという感じがしました。

https://twitter.com/azu_re/status/1503905637956128770

事後としては、実際にどのぐらいの人が影響を受けたのかを確認したいのですが、npmのversionsタブのインストール数はunpublishすると消えてしまうので、これの記録が見れるサービスがあるといいなーという感じがしています。

https://www.npmjs.com/package/node-ipc

Discussion

いつも有用な記事をありがとうございます!
さっそく自プロダクトでもチェックすることができました。

なお「対応方法」の下記の例について、colorsではなくnode-ipcに修正いただけますか。

{
  "resolutions": {
    "colors": "10.1.0" 
  }
}

ありがとうございます。修正しました

ログインするとコメントできます