NPM

rand-user-agent」という名前のnpmパッケージがサプライチェーン攻撃で侵害され、難読化されたコードが注入され、ユーザーのシステム上でリモート・アクセス・トロイの木馬(RAT)が起動する。

rand-user-agent」パッケージは、ランダム化されたユーザーエージェント文字列を生成するツールで、ウェブスクレイピング、自動テスト、セキュリティ調査などに役立つ。

このパッケージは非推奨になったが、毎週平均4万5000ダウンロードされ、かなり人気がある。

しかし、Aikidoの研究者によると、脅威行為者は、半廃止状態でありながら人気があることを利用して、相当数の下流プロジェクトによってダウンロードされたと思われる無許可の後続リリースに悪意のあるコードを注入した。

Aikidoは2025年5月5日、同社のマルウェア解析システムがrand-user-agentの新バージョン(バージョン番号1.0.110)にフラグを立てたことから、この侵害を検出しました。

さらに詳しく調査したところ、研究者は「dist/index.js」ファイルに隠された難読化されたコードを発見した。

Obfuscated code hidden out of view
難読化されたコードが見えないように隠されている
ソースはこちら:合気道

調査の結果、’rand-user-agent’の最後の正規バージョンは7ヶ月前にリリースされた2.0.82であることがわかった。

その後公開されたバージョン2.0.83、2.0.84、さらに1.0.110はすべて悪意のあるもので、プロジェクトのGitHubリポジトリに対応するリリースがなかった。

最新バージョンに埋め込まれた悪意のあるコードは、ユーザーのホームフォルダー(~/.node_modules)の下に隠しディレクトリを作成し、「module.paths」を拡張して、このカスタムパスを依存関係、すなわち「axios」と「socket.io-client」のロードに使用できるようにする。

次に、http://85.239.62[.]36:3306 にある攻撃者のコマンド&コントロール(C2)への持続的なソケット接続を開き、ホスト名、ユーザー名、OSタイプ、生成されたUUIDを含むマシンID情報を送信する。

RATがアクティブになると、以下のコマンドのいずれかをリッスンします:

  • cd <path>– 現在の作業ディレクトリを変更する。
  • ss_dir – 作業ディレクトリをスクリプトのパスにリセットする。
  • ss_fcd:<path>– 指定されたディレクトリに強制的に変更する。
  • ss_upf:f,d– ファイル f を保存先 d にアップロードする
  • ss_upd:d,dest– ディレクトリ d にあるすべてのファイルをアップロードする
  • ss_stop– 実行中のファイルのアップロードを中断する
  • (その他)– child_process.exec() を使ってシェルコマンドとして実行する。

本稿執筆時点では、悪意のあるバージョンはnpm上のパッケージのリポジトリから削除されているので、利用可能な最新バージョンは安全であり、ユーザーはそれに戻すべきである。

しかし、バージョン2.0.83、2.0.84、1.0.110にアップグレードした場合は、侵害の兆候がないかシステムの完全スキャンを実行することが重要です。正規のバージョンにダウングレードしても、システムからRATが削除されるわけではないことに注意してください。

さらに、「rand-user-agent」ツールはフォークされているが、まだサポートされており、よりよく監視されているバージョンの使用を検討すること。

パッケージがどのように侵害されたかを知るために開発者に問い合わせたところ、次のようなコメントを得た:

「2025年5月5日(16:00 UTC)に、rand-user-agentの3つの未承認バージョンがnpmレジストリに公開されているとの警告を受けました(1.0.110, 2.0.83, 2.0.84)。悪意のあるコードは私たちのGitHubリポジトリには存在せず、npmアーティファクトにのみ導入されていたため、これは典型的なサプライチェーン攻撃である。

私たちの調査(現在も進行中)によると、敵は従業員から古い自動化トークンを入手し、それを使ってnpmにリリースを公開していました。そのトークンは2要素認証のスコープが設定されていなかったため、攻撃者は以下のことが可能でした:GitHubに存在しないバージョンを公開し、バージョン番号を増やして正当なものに見せかけ、何も非推奨にせず、新しいリリースが誰にも気づかれないうちに伝播することを期待した。

ソースコード・リポジトリ、ビルド・パイプライン、企業ネットワークに侵入された形跡はありません。インシデントはnpmレジストリに限定されていました。

このインシデントによって影響を受けたすべての開発者と組織にお詫び申し上げます。オープンソースのエコシステムを保護することは、私たちが真剣に受け止めている責任であり、この攻撃を可能にしたあらゆるギャップを埋めるために、私たちは完全な透明性を約束します。”

更新 5/9 – WebScrapingAPIからのコメントを追加。

.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%; } .

攻撃の93%を支えるMITRE ATT&CK©テクニック・トップ10

1,400万件の悪意のあるアクションの分析に基づき、攻撃の93%を支えるMITRE ATT&CKテクニックのトップ10とその防御方法をご覧ください。