npmマルウェア「MALFEX」、14か月間検知されず稼働
1人の攻撃者によるnpmのサプライチェーン攻撃「MALFEX」は、2023年以降に12個のパッケージを公開し、ダウンロード数は40,767回に達した。一部は今もアドバイザリーなしで公開されている。
4 分で読めます

数字で見る
- npm packages published by one operator
- 12
- total downloads, per Checkmarx
- 40,767
- downloads of function-flag alone
- 37,419
- when the first package appeared
- Aug 2023
1人の攻撃者が2023年8月からnpmにマルウェアを公開し続けており、その一部は2026年9月末の時点でもインストールできる状態だった。セキュリティ企業のCloudSEKは9月30日にこのキャンペーンをMALFEXと名付けた。同社は、14か月間どのセキュリティアドバイザリーにも指摘されなかった悪意あるパッケージを1つ見つけた。Checkmarxは10月5日、このキャンペーンのパッケージ全体で40,767回のダウンロードがあったと続報を出した。依存関係ツリーにこれらのパッケージが1つでもあれば、それをインストールしたWindowsマシンでリモートアクセスツールが動いている可能性がある。
攻撃の仕組み
npmはJavaScriptのパッケージレジストリだ。パッケージをインストールすると、npmは「postinstall」スクリプトを実行できる。これはパッケージの作者が選んだコマンドである。MALFEXはこのスクリプトを使い、開発者がnpm installを実行した瞬間にWindows向けマルウェアをダウンロードして起動する。
ペイロードは目立たない形で隠されている。CloudSEKによると、スクリプトはPNG画像に偽装したWindowsプログラムをダウンロードする。Checkmarxは3つの別々の配布経路をたどった。
- Overlord RAT。 パッケージ
tlxbnhd、tldriver、mxdriverは、api.imghippo.comから偽のPNGを取得する。中には署名付きのAutoIt3プログラムと、Overlordを読み込む暗号化スクリプトが入っている。OverlordはGoで書かれたオープンソースのリモートアクセスツールだ。リモートアクセスツール、つまりRATは、攻撃者が離れた場所からマシンを操作できるようにする。 - 情報窃取型マルウェア。
native-runner、img-to-native、cdn-img-fetchの連鎖が、「cavecrew」というGitHubアカウントから暗号化されたプログラムを取得する。続いて、Checkmarxが「movinlike」と呼ぶ64MBのNode.js製スティーラーをダウンロードする。 - 長期稼働のダウンローダー。
function-flagは、discloud.app、squareweb.app、render.com、Discord CDNプロキシなど、入れ替わるホストから新しいペイロードを取得し続ける。
3つの経路はいずれもWindowsを狙っている。Checkmarxによると、ダウンローダーはmacOSとLinuxでは失敗する。頼っているWindows専用の設定が、そこには存在しないためだ。
何を盗み、どう隠れるか
Overlordには固定のサーバーアドレスがない。Checkmarxは「運営者がSolanaのトランザクションに投稿する暗号化されたメモを読み取り、復号し、その結果をサーバーリストとして使える」と書いている。Solanaは公開ブロックチェーンなので、運営者はマルウェアを変更せずにサーバーを移せる。
スティーラーが狙うのは、8種類のDiscordクライアントと、Chrome、Edge、Brave、Opera、Vivaldi、YandexのCookieだ。Telegram Desktopと、MetaMask、Phantom、Coinbaseの暗号資産ウォレットも狙う。盗んだデータはDiscordのWebhook経由で外に出る。CheckmarxはこのWebhookが2026年9月26日に作成されたとしている。
永続化の手口も目立たない。Checkmarxは、5分ごとに実行される\Maidenというスケジュールタスクを見つけた。その日付は2020年1月1日に書き換えられている。運営者はさらに、悪意あるコードをスペースで右へ大きく押しやり、通常のエディタ画面の端より先に置いている。
CloudSEKによると、運営者はmalfexkkj、malfex_user、cavecrewなど複数のハンドルで、自分の仕事に「Murizada」と署名している。
確認すべきパッケージ
| パッケージ | 役割 | ダウンロード数(Checkmarx調べ) | 状況 |
|---|---|---|---|
| function-flag | ダウンローダー | 37,419 | 公開中、アドバイザリーなし |
| function-color | 記載なし | 300 | 公開中、アドバイザリーなし |
| cdn-img-fetch | スティーラーの連鎖 | 643 | アドバイザリーの対象は1.0.0-1.0.1のみ |
| img-to-native | スティーラーの連鎖 | 967 | アドバイザリーあり |
| native-runner | スティーラーの連鎖 | 872 | Checkmarxが掲載 |
| tlxbnhd | Overlord RAT | 139 | 押収済み |
| tldriver | Overlord RAT | 138 | 押収済み |
| mxdriver | Overlord RAT | 289 | 押収済み |
2社の数え方はわずかに異なる。CloudSEKは、function-flag、cdn-img-fetch、function-colorがまだインストール可能だとしている。同社は「アドバイザリーのない3つのパッケージが、防御側が今日対処できる唯一の現役の脅威だ」と書いている。cdn-img-fetchの食い違いについては、Checkmarxが理由を説明している。アドバイザリーMAL-2026-17320の対象はバージョン1.0.0と1.0.1だが、悪意あるバージョンは1.0.2と1.0.3だという。
Checkmarxによると、運営者が公開したパッケージは全部で12個で、悪意あるものが8個、無害なおとりが4個だ。10月1日までの1週間でも、これらのパッケージは3,017回ダウンロードされた。
今月は開発者が頻繁に標的にされている。10月初めには、別のキャンペーンが偽の採用担当者のリポジトリの中で、Gitのpost-checkoutフックにマルウェアを隠していると報じられた。
開発者にとっての意味
- 今すぐロックファイルを検索する。
package-lock.json、yarn.lock、pnpm-lock.yamlで、表にあるすべてのパッケージ名を探す。推移的依存関係も含める。npm ls <name>を使うと、パッケージの入手元がわかる。 - アドバイザリーだけを信用しない。
cdn-img-fetchのアドバイザリーは誤ったバージョンを対象にしており、公開中の2つのパッケージにはアドバイザリーがなかった。npm auditが問題なしでも、このキャンペーンに対して安全だとは言えない。 - 可能な場所ではインストールスクリプトを無効にする。
npm install --ignore-scripts、または.npmrcのignore-scripts=trueで、postinstallのコードは実行されなくなる。スクリプトを許可するのは、必要なパッケージだけにする。 - 一覧のパッケージを入れたWindowsマシンを調べる。
\Maidenというスケジュールタスクと、%APPDATA%\Microsoft\Windows\の下にあるnode_runtime_helper.exeというファイルを探す。Checkmarxは、ポート700のアドレス104.234.65.75もダウンロードサーバーとして挙げている。 - スティーラーに盗まれるものを更新する。 マシンが被害を受けた場合は、DiscordとTelegramからサインアウトし、ブラウザーのセッションを消去し、保存したパスワードを変更し、ブラウザーのウォレットから資金を移す。
覚えておくべき数字は、function-flagの37,419回というダウンロード数だ。平凡な名前の小さなユーティリティ1つが、キャンペーンのほぼ全体を運んでいた。
出典
関連記事

npmのtrusted publishing、OIDCでdist-tagの移動に対応
npmのtrusted publishingで、短期間だけ有効なOIDCトークンを使い、latestなどのdist-tag(ディストタグ)を追加、移動、削除できるようになりました。初期設定ではオフで、npm 11.21.0が必要です。

Node.js 22.23.3 LTS、HTTP/2のuse-after-freeバグを修正
9月23日公開のNode.js 22.23.3 LTSは、HTTP/2のuse-after-free(ユースアフターフリー)バグを修正し、Node-APIにSharedArrayBufferのサポートを追加し、OpenSSL 3.5.8に移行しました。

Rejetto HFS CVE-2026-61500、解説公開の翌日に悪用が始まる
HFS(HTTPファイルサーバー)3.0.0から3.2.0は、ログインの署名にMath.random()を使っています。AnthropicのMythosが見つけた欠陥です。攻撃は解説公開の翌日、10月3日に始まりました。3.2.1で修正されています。