技術約6分で読めます

MALFEXの悪性npmパッケージ8件はインストール時と読み込み時の両方で動く

いけさん目次

TL;DR

影響 Windows環境でMALFEX関連の悪性npmパッケージ8件を導入・実行した場合。遠隔操作マルウェア(Overlord)や情報窃取ソフト(movinlike)の感染リスク

注意 インストール時の自動実行(install scripts)に加えて、パッケージ読み込み(require())時にも動作。スクリプト停止後も読み込み時の実行経路が残る

対応 プロジェクトのロックファイルを検索して混入を確認。導入や実行の履歴がある場合はWindows端末をネットワークから隔離して調査し、漏洩した認証情報を安全な別端末から再発行


postinstall などのインストールスクリプトを停止していても、アプリやスクリプトがパッケージを読み込んだ時点で実行されるマルウェアがある。
関数を呼び出す前でも、require() や import で読み込まれた瞬間にトップレベルのコードが動くためだ。
MALFEXにはインストール時に動くものと読み込み時に動くものの両方が含まれ、同じ攻撃者によるパッケージでも実行タイミングが分かれている。

CloudSEKの9月30日の報告では、2023年8月から2026年9月までの活動が同一の攻撃者によるものと特定された。
続くCheckmarxの10月5日の解析では、関連する12パッケージのうち8件が悪性と判定されている。

悪性コードを含む8パッケージと依存関係

Checkmarxが挙げた既知の悪性バージョンを整理した。
この一覧にない版の安全を保証するものではなく、調査時に照合するための表だ。

パッケージ報告された悪性バージョン役割
tlxbnhd0.0.1Overlord(遠隔操作マルウェア)を取得する処理
tldriver0.0.1Overlordを取得する処理
mxdriver0.0.1、0.0.2Overlordを取得する処理
native-runner1.0.0〜1.0.3img-to-native を依存パッケージとして取り込む
img-to-native1.0.0〜1.0.3画像に埋めた実行ファイルを復号する
cdn-img-fetch1.0.0〜1.0.3悪性データを含む画像を取得する
function-color1.0.0、1.7.3function-flag を依存パッケージとして取り込む
function-flag1.7.3、2.3.5〜2.3.9、3.0.0、4.0.0別の実行ファイルを取得して起動する

10月1日時点の集計で、8件の総ダウンロード数は40,767回、そのうち function-flag が37,419回を占めていた。
依存関係経由での自動取得も含まれるため、感染した端末の数そのものとは一致しない。

インストール時に動く経路と、読み込み時に動く経路

tlxbnhd、tldriver、mxdriver は、インストールの前後に実行される preinstall / postinstall スクリプトからWindows用の実行ファイルを取得する。
CloudSEKは、PNG画像として配られたファイルからAutoIt(Windowsの操作自動化ツール)の実行環境とスクリプトを展開し、外部から端末を遠隔操作するRAT(Overlord)へつながる仕組みを報告した。

情報窃取ソフト movinlike へつながるのは別の経路で、native-runner → img-to-native → cdn-img-fetch と依存が連なる。
この経路では、アプリ側が require() でパッケージを読み込んだ時点で画像の取得が始まる。
画像内のデータを復号した実行ファイルが、さらに窃取用のプログラムを取得する。CloudSEKによると、Discordやブラウザ、Telegramのトークンや認証データが窃取対象になる。

function-color → function-flag は、インストール後に別の実行ファイルを取得する経路だ。
ただしCheckmarxの調査時には、function-flag 1.7.3の配信サーバーが応答しなかったため、取得されるはずのファイルを入手できていない。
そのため、この経路の最終的なプログラムがOverlordや movinlike と同じものかは分かっていない。

インストールスクリプト停止後の読み込みも確認する

npmの ignore-scripts の仕様を使うと、package.json に書かれたスクリプトの自動実行は防げる。
ただし npm run や npm test で明示的に指定したスクリプトは実行され、テストやアプリの実行中に悪性パッケージが読み込まれればコードはそのまま動く。

npmのinstall scripts許可制の記事で扱ったのも、インストール中の自動実行を制御する仕組みだ。
MALFEXの img-to-native 系列は読み込み時に動くため、依存パッケージとして追加された名前だけでなく、コード内でそれを呼び出していないかも確認する必要がある。

以前のViteVenomでは付属CLIの実行が攻撃の契機だった。
インストール時の自動実行を遮断した環境でも、後から実行される読み込み処理の調査が要る。

公開後にも更新されるセキュリティ勧告

Checkmarxの報告は、cdn-img-fetch のアドバイザリ(セキュリティ勧告)が当初 1.0.0 と 1.0.1 だけを挙げていた点を指摘している。
しかし10月8日更新のOSV(オープンソース脆弱性データベース)のMAL-2026-17320では、1.0.3 も追加された。

さらにOSVのJSONデータには、個別バージョンとは別に introduced: "0" で始まる影響範囲が指定されている。
これは特定バージョンではなく全過去バージョンが影響を受ける範囲を示す記号で、OSVの画面上もそのように表示される。
個別一覧に 1.0.2 が抜けているからといって、安全と判断して検査から外すことはできない。実際の検出結果は、監査ツール側のデータ更新状況と範囲の解釈で変わる。

ロックファイルの検索とWindows端末の確認

プロジェクトで直接追加したパッケージだけでなく、推移的依存(依存先がさらに読み込むパッケージ)も検索対象になる。
以下は依存定義やロックファイルの中身を検索するコマンド例で、パッケージの追加や実行は行わない(rg がない環境では、エディタのファイル横断検索で各ロックファイルを対象にパッケージ名を検索する)。

rg -n --hidden \
  -g 'package.json' -g 'package-lock.json' -g 'npm-shrinkwrap.json' \
  -g 'pnpm-lock.yaml' -g 'yarn.lock' \
  -g '!node_modules/**' -g '!**/node_modules/**' -g '!.git/**' \
  'tlxbnhd|tldriver|mxdriver|native-runner|img-to-native|cdn-img-fetch|function-color|function-flag' .

検索でヒットした行では、実際のパッケージ名と解決されたバージョン番号を確認する。
現在の作業ツリーから消えていても、過去のビルド成果物やロックファイルの変更履歴、キャッシュに残っている場合がある。

Windows環境で該当パッケージを使っていた場合は、パッケージの削除だけでなく端末側の痕跡も調べる。
CloudSEKが挙げたOverlordの痕跡には、%LOCALAPPDATA%\ScopeSmart Technologies Inc\AutoIt3.exe と、自動再実行用のスケジュールタスク \Maiden がある。
依存パッケージを削除しても、OS側に追加された実行ファイルやタスクは残るためだ。該当端末はネットワークから隔離して調査し、漏洩した認証情報(APIキー、トークン、Cookieなど)は安全な別の端末から再発行する。