
北朝鮮の脅威勢力は、Node Package Manager(npm)オンラインリポジトリに67の悪意のあるパッケージを仕込み、XORIndexと呼ばれる新しいマルウェアローダーを開発者システムに配信した。
これらのパッケージは合計で17,000以上のダウンロードを数え、パッケージセキュリティプラットフォームSocketの研究者によって発見されました。
Socketの研究者は、このキャンペーンは4月以降に検出された脅威活動に続くものであると述べている。先月、同じ行為者が35のパッケージでnpmに侵入し、開発者のデバイスに情報窃盗とバックドアを投下した。

ソースはこちら:ソケット
攻撃の概要
Contagious Interviewは北朝鮮国家が支援するキャンペーンで、主に開発者をターゲットに偽の求人を出し、システム上で悪意のあるコードを実行させるように仕向けています。
その目的は、企業への侵入を可能にする機密情報の収集から、暗号通貨資産の窃盗まで様々です。
Node Package Manager(npm)は、開発者がJavaScriptのライブラリやツールを公開・インストールするプラットフォームであるNode.jsのデフォルトのパッケージ・マネージャーである。ウェブ開発で広く使用されているが、マルウェア配布のために脅威行為者に悪用されることも多い。
今回、脅威行為者がnpmにアップロードした67のパッケージのうち、合法的なソフトウェアプロジェクトやライブラリの名前を模倣したり、混ぜたりしているように見えるものがいくつかある:
- vite-meta-plugin
- vite-postcss-tools
- vite-logging-tool
- vite-proc-log
- プリティチョーク
- postcss-preloader
- js-プリティア
- フローフレーム
- figwrap
- midd-js、middy-js
被害者がこれらのパッケージのいずれかをインストールすると、「postinstall」スクリプトが実行され、XORIndex Loaderが起動する。この新しいツールは、過去の攻撃で確認されたマルウェアドロッパーであるHexEval Loaderと並行して使用されているようだ。
XORIndex Loaderは、各被害者をプロファイリングするためにホストデータを収集し、Vercelクラウドアプリケーション会社のインフラ上でホストされているハードコードされたコマンド・アンド・コントロール(C2)アドレスに送信する。
C2サーバーは1つ以上のJavaScriptペイロードで応答し、eval()を使って被害者のシステム上で実行される。これらのペイロードは通常、BeaverTailバックドアとInvisibleFerretバックドアであり、どちらも北朝鮮のContagious Interview作戦に起因するものです。
この2つのマルウェアは、侵害されたマシンへのアクセスを提供し、データの流出を可能にし、さらに多くのペイロードをダウンロードすることができる。
研究者によると、北朝鮮のハッカーは、検知を回避するために微妙な修正を加えて新旧のツールをブレンドし、npmが感染を浄化するたびに、異なるnpmアカウントとパッケージ名で戻ってくるという。
「伝染性インタビューの脅威行為者は、新しいnpmのメンテナエイリアスをローテーションし、HexEval LoaderのようなローダーやBeaverTailやInvisibleFerretのようなマルウェアファミリーを再利用し、XORIndex Loaderを含む新たに観測された亜種を積極的に展開し、マルウェアポートフォリオを多様化し続けるだろう。
「防衛者は、新たに公開されたパッケージ間でこれらのローダーが継続的に反復され、多くの場合、検出を回避するために若干のバリエーションがあることを期待する必要があります」と研究者は警告している。
Socketの研究者は、最新のキャンペーンからすべての悪意のあるパッケージをnpmに報告したが、それらのいくつかはまだリポジトリで利用可能であるかもしれないと述べている。
ソースが提供されているパッケージがtyposquattingのおとりでないかダブルチェックすること、実績のある有名なプロジェクトやパブリッシャーのみを信用すること、自動化の兆候がないか最近のリポジトリの動きを精査することが重要だ。
可能であれば、難読化されていないか常にソースコードを調べ、安全性を評価するために分離された環境で新しいライブラリを実行すること。
.ia_ad { background-color:#width: 95%; max-width: 800px; margin: 15px auto; border-radius: 8px; border:1px solid #d6ddee; display: flex; align-items: stretch; padding: 0; overflow: hidden; }:0; overflow: hidden; } .ia_lef { flex: 1; max-width: 200px; height: auto; display: flex; align-items: stretch; } .ia_lef a { display: flex; width: 100%; height: 100%; } .ia_lef a img { width: 100%; height: 100%; object-fit: cover; border-radius: 8px 0 0 8px; margin: 0; display: block; } .ia_rig { flex: 2; padding:display: flex; flex-direction: column; justify-content: center; } .ia_rig h2 { font-size: 17px !important; font-weight: 700; color:#line-height: 1.4; font-family:margin: 0 0 14px 0; } .ia_rig p { font-weight: bold; font-size: 14px; margin: 0 0 clamp(6px, 2vw, 14px) 0; } .ia_button { background-color:#border:1px solid #3b59aa; color: black; text-align: center; text-decoration: none; border-radius: 8px; display: inline-block; font-size: 16px; font-weight: bold; cursor: pointer; padding:10px 20px; width: fit-content; } .ia_button a { text-decoration: none; color: inherit; display: block; } @media (max-width: 600px) { .ia_ad { flex-direction: column; align-items: center; text-align: center; } .ia_lef { max-width: 100%; } .ia_lef a img { border-radius: 8px 8px 0 0; } .ia_rig { padding:15px;
width: 100%;
}
.ia_button {
width: 100%;
margin: 0px auto;
}
}




Comments