悪意の npm パッケージ 175 個:公開レジストリと CDN の悪用によりリダイレクト・スクリプトをホスト

175 Malicious npm Packages With 26,000 Downloads Attacking Technology, and Energy Companies Worldwide

2025/10/10 CyberSecurityNews — 悪意の npm パッケージ 175 個を介して展開される高度なフィッシング・キャンペーンを、Socket の脅威調査チームが発見した。これらのパッケージは、合計で 26,000 回以上もダウンロードされている。すべての悪意のパッケージに共通するアーティファクトに基づき、このキャンペーンは Beamglea と名付けられた。その手法は、npm の公開レジストリと unpkg.com CDN を悪用して、リダイレクト・スクリプトをホストするという、新しいものである。世界中の 135 社以上の製造業/テクノロジー/エネルギー企業などを標的としているという。

これらのパッケージ自体は、インストール時に悪意のコードを実行しないが、npm エコシステムを認証情報収集のための無料ホスティング・インフラとして悪用するという、きわめて巧妙な手法を用いている。

Credential phishing pages (Source – Socket.dev)

これらのパッケージは “redirect-[a-z0-9]{6}” というパターンに従ってランダムに命名されているため、開発者が誤ってインストールする可能性は低い。ただし、ダウンロード数が多いことから、セキュリティ研究者/自動スキャナー/CDN インフラにより、公開後のパッケージが分析されるというケースが想定される。

この脅威アクターは、キャンペーン全体を自動化するための包括的な Python ツールを開発し、注文書やプロジェクト文書を装いながら、被害者に適合させた HTML フィッシング・ルアーの作成を可能にしている。

Beamglea の由来と意味は不明であるが、攻撃者が使用したコードネームまたは内部情報という可能性がある。

2025年9月24日にフィッシング・インフラを発見した Safety の Paul McCarty の初期調査結果に基づき、Socket.dev のアナリストが特定したのは、このキャンペーンを通常のスキャン操作の一環だというものだった。

研究者たちが指摘するのは、このキャンペーンに関連するパッケージの大半が、この記事の執筆時点でまだ稼働中だという点だ。彼らは、脅威アクターのアカウント停止と併せて、npm レジストリからの削除を求める嘆願書を提出した。

しかし、このキャンペーンにおける技術的実装は、驚くほど高度な技術を示しており、サプライチェーン悪用手法の懸念すべき進化を示している。

今回の情報が開示される以前に、Beamglea という用語はオンラインで未知の存在だったが、複数の重要インフラ・セクターの組織を標的とする、このキャンペーンを追跡するための有効な識別子となってきた。

自動パッケージ生成インフラストラクチャ

この脅威アクターは、 “redirect_generator.py” スクリプトと PyInstaller でコンパイルされた実行ファイルを利用して、高度な Python 自動化技術を開発し、運用を効率化している。それにより、悪意の展開が容易になっている。

この自動化プロセスは、プロフェッショナル・レベルの運用セキュリティ計画と、体系的な被害者ターゲティング能力を実証している。

中核となる自動化が受け取るものは、”beamglea_template.js” という名前の JavaScript テンプレートファイル/被害者のメールアドレス/フィッシング URL という3つの入力である。

システムが処理する、これらのコンポーネントにより、npm 認証検証/テンプレート処理/パッケージ作成/公開/HTML ルアー生成へと進む、5段階のワークフローが成立する。

パッケージ名生成に関するランダム化の機能は、小文字と数字で構成される6文字のサフィックスを用いて一意の識別子を作成し、認識可能なリダイレクト・プレフィックス・パターンに従いながら、各キャンペーンの識別性を維持する。

それぞれのパッケージに埋め込まれた JavaScript ペイロードは、驚くほどシンプルでありながら効果的である。各 “beamglea.js” ファイルには、被害者のメールアドレスを URL フラグメントとして追加する processAndRedirect() 関数が含まれている。この手法により、フラグメントが “#” 記号の後に表示されるため、通常のサーバ・アクセスログには表示されないという性質を利用している。

この手法では、ログイン・フォームに被害者のメールアドレスが事前に入力されるため、フィッシング・ページが正当性を演じることになる。

def generate_random_package_name(prefix="redirect-"):
    # ランダムな6文字のサフィックスを生成
    suffix = ''.join(random.choices(string.ascii_lowercase + string.Digits, k=6))
    return prefix + suffix

# テンプレート処理により、プレースホルダーが被害者固有のデータに置き換えられます
template_js = load_template('beamglea_template.js')
final_js = template_js.replace("{{EMAIL}}", email).replace("{{URL}}", redirect_url)
with open("beamglea.js", "w", encoding="utf-8") as f:
    f.write(final_js)

この自動化の機能は、正規の注文書/技術仕様書/プロジェクト文書を模倣するファイル名を用いて、特定のビジネス文書のテーマに基づいた HTML ルアーを生成する。この仕組みは、疑いを回避するために設計されている。

すべての HTML ファイルのメタタグには、キャンペーン識別子 nb830r6x が含まれているため、175 個のパッケージに分散された 630 個以上のルアーに対して、一貫した追跡が可能である。