
npmレジストリ上で正規のソフトウェアプロジェクトを装った10個の悪意のあるパッケージが、Windows、Linux、macOSシステムから機密データを収集する情報窃取コンポーネントをダウンロードします。
これらのパッケージは7月4日にnpmにアップロードされ、複数の難読化層によって標準的な静的解析メカニズムを回避し、長期間検出されませんでした。
サイバーセキュリティ企業Socketの研究者によると、これら10個のパッケージは約10,000回ダウンロードされ、システムのキーチェーン、ブラウザ、認証サービスから認証情報を盗み出しました。
記事執筆時点でも、Socketがnpmに報告したにもかかわらず、これらのパッケージは依然として利用可能です:
- typescriptjs
- deezcord.js
- dizcordjs
- dezcord.js
- etherdjs
- ethesjs
- ethetsjs
- nodemonjs
- react-router-dom.js
- zustand.js
Socketの研究者によれば、これらのパッケージは正規に見せかけるため偽のCAPTCHAチャレンジを使用し、PyInstallerでパッケージ化された24MBの情報窃取マルウェアをダウンロードします。
攻撃者はユーザーを誘導するためにタイポスクワッティング(正規名のスペルミスやバリエーションを利用する手法)を用い、TypeScript(JavaScriptの型付きスーパーセット)、discord.js(Discordボットライブラリ)、ethers.js(Ethereum JSライブラリ)、nodemon(Nodeアプリの自動再起動)、react-router-dom(Reactブラウザルーター)、zustand(最小限のReact状態管理)などの正規名を模倣しました。
npmプラットフォームで正規パッケージを検索する際、開発者がパッケージ名を誤入力したり、検索結果に表示された悪意のあるパッケージを選択してしまう可能性があります。
インストール時、自動的に「postinstall」スクリプトがトリガーされ、ホストのOSに合わせた新しいターミナルが起動します。このスクリプトは「app.js」をインストールログに表示されない形で実行し、すぐにウィンドウをクリアして検出を回避します。
「app.js」ファイルはマルウェアローダーであり、自己デコードevalラッパー、動的生成キーによるXOR復号、URLエンコードされたペイロード、強力な制御フロー難読化という4つの難読化層を使用しています。
スクリプトはターミナル上にASCIIで偽のCAPTCHAを表示し、インストールプロセスに正当性があるように見せかけます。

出典:Socket
次に、被害者のジオロケーションやシステムのフィンガープリント情報を攻撃者のコマンド&コントロール(C2)サーバーに送信します。この情報を取得した後、マルウェアは外部ソースからプラットフォーム固有のバイナリ(24MBのPyInstallerパッケージ実行ファイル)をダウンロードし、自動的に起動します。
情報窃取マルウェアは、Windows Credential Manager、macOS Keychain、Linux SecretService、libsecret、KWalletなどのシステムキーチェーンや、Chromium系およびFirefoxブラウザに保存されたプロファイル、保存済みパスワード、セッションクッキーなどのデータを標的とします。
さらに、一般的なディレクトリ内のSSHキーを探し、OAuth、JWT、その他のAPIトークンの発見と窃取も試みます。
盗まれた情報は圧縮アーカイブにまとめられ、一時的に/var/tmpまたは/usr/tmpに保存された後、攻撃者のサーバー(195[.]133[.]79[.]43)に送信されます。
上記のいずれかのパッケージをダウンロードした開発者は、感染のクリーンアップとすべてのアクセストークンやパスワードの変更を推奨します。情報が漏洩している可能性が高いためです。
npmや他のオープンソースインデックスからパッケージを取得する際は、スペルミスがないか二重に確認し、信頼できる発行元や公式リポジトリから入手していることを必ず確認してください。