روابط عمومی شرکت ایدکو (توزیعکنندهی محصولات کسپرسکی در ایران)؛ دنیای توسعه مدرن تقریباً بهطور کامل به ماژولهای طرفسوم وابسته است. گرچه این موضوع بیشک پروسعه توسعه را تسریع میکند، اما همچنین سطح حمله عظیمی برای کاربران نهایی بوجود میآورد؛ چون هر کسی میتواند این مؤلفهها را بسازد. تعجبی ندارد که ماژولهای مخرب بیشتر شدهاند. وقتی حساب یک نگهدارندهی بستههای محبوب یا یک وابستگی محبوب به خطر بیافتد، میتواند به سرعت به یک حمله زنجیرهتأمین تبدیل شود. چنین نفوذهایی اکنون یک بُردار حملهی مکرر هستند که در میان بازیگران تهدید محبوب شدهاند. تنها در ماه گذشته، دو رخداد بزرگ تأیید کردند که علاقه به خلق ماژولها، وابستگیها و پکیجهای مخرب افزایش یافته است. ما پیشتر دو مقاله در مورد npm، روش انتشار، واکنش به رخداد و راهکارهای امنیتی در وبسایت خود کار کردیم. تاریخ ۱۶ سپتامبر ۲۰۲۵ گزارشهایی از موج جدیدی از آلودگی بستههای npm منتشر شد که توسط بدافزار خودتکثیرشوندهای به نام Shai-Hulud ایجاد شده بود که در این مقاله به طور مفصل مورد بررسیاش قرار میدهیم. با ما همراه باشید.
Shai-Hulud برای سرقت دادههای حساس، افشای مخازن خصوصی سازمانها و ربودن اعتبارنامههای قربانیان بهمنظور آلوده کردن دیگر بستهها و انتشار خود طراحی شده است. بیش از ۵۰۰ بسته در این رخداد آلوده شدند، از جمله یکی با بیش از دو میلیون دانلود هفتگی. در نتیجه، توسعهدهندگانی که این بستههای مخرب را در پروژههای خود یکپارچه کردهاند در معرض از دست رفتن دادههای حساس قرار دارند و کتابخانههای خودشان ممکن است به Shai-Hulud آلوده شوند. این بدافزار خودتکثیرشونده حسابها را تصاحب میکند و دادههای محرمانه را میدزدد تا ماژولهای آلودهی جدیدی بسازد و تهدید را در طول زنجیرهی وابستگی گسترش دهد.
جزئیات فنی
کد مخرب کرم هنگام نصب یک بستهی آلوده اجرا میشود. سپس نسخههای آلوده را برای تمام بستههایی که قربانی دسترسی به بهروزرسانی آنها را دارد منتشر میکند.پس از نصب بستهی آلوده از رجیستری npm روی سیستم قربانی، یک فرمان خاص بهطور خودکار اجرا میشود. این فرمان یک اسکریپت مخرب بیش از ۳ مگابایتی بهنام bundle.js را اجرا میکند که شامل چندین ماژول مشروع و متنباز میشود.
ماژولهای کلیدی درون bundle.js شامل موارد زیر میشوند:
کتابخانهای برای تعامل با سرویسهای ابری AWS
ماژولی برای GCP که فراداده را از محیط Google Cloud Platform بازیابی میکند
توابعی برای TruffleHog، ابزاری برای اسکن منابع مختلف بهمنظور یافتن اطلاعات حساس، بهویژه دادههای محرمانه
ابزاری برای تعامل با API گیتهاب
فایل JavaScript همچنین ابزارهای شبکهای برای انتقال داده و ماژول عملیاتی اصلی، Shai-Hulud را دربردارد.کرم فعالیت مخرب خود را با جمعآوری اطلاعات دربارهی سیستم عامل قربانی آغاز نموده و بررسی میکند که آیا یک توکن npm و یک توکن کاربر احراز هویتشدهی GitHub در محیط وجود دارد یا خیر. اگر توکن GitHub معتبر وجود نداشته باشد، bundle.js خاتمه مییابد. ویژگی متمایز Shai-Hulud این است که بیشتر عملکردهای آن برای سیستمهای Linux و macOS طراحی شدهاند: تقریباً تمام عملیات مخرب بهجز استفاده از TruffleHog برای پیدا کردن دادههای محرمانه، منحصراً روی این سیستمها انجام میشود.
استخراج دادههای محرمانه
پس از طی شدن بررسیها، بدافزار از توکن یادشده برای دریافت اطلاعات دربارهی کاربر فعلی GitHub استفاده میکند. سپس تابع استخراج را اجرا میکند واین باعث میشود یک اسکریپت اجرایی موقت bash در /tmp/processor.sh ایجاد شود. بعد آن را بهعنوان یک فرایند جداگانه اجرا میکند و توکن را بهعنوان آرگومان میپذیرد. در پایین، تابع استخراج آمده است، با این تفاوت که رشتهها و نام متغیرها برای خوانایی تغییر یافتهاند چون کد منبع اصلی ناخوانا بود. اسکریپت bash برای ارتباط با API گیتهاب و جمعآوری دادههای محرمانه از مخزنهای قربانی بهشیوهای غیرمتداول طراحی شده است. ابتدا اسکریپت بررسی میکند که آیا توکن مجوزهای لازم برای ایجاد شاخهو کار با GitHub Actions را دارد یا خیر. اگر چنین باشد، اسکریپت فهرستی از تمام مخزنهایی را که کاربر از سال ۲۰۲۵ به آنها دسترسی دارد دریافت میکند. در هر یک از این مخزنها، یک شاخهی جدید بهنام shai-hulud ایجاد میکند و فایل workflowای بهنام shai-hulud-workflow.yml را آپلود میکند؛ این فایل یک پیکربندی برای توصیف جریان کاریهای GitHub Actions است. این فایلها اسکریپتهای خودکاری هستند که هنگام اعمال تغییر در مخزن در GitHub Actions اجرا میشوند. جریان کاری شای-هالود روی هر push فعال میشود.این فایل، دادههای محرمانه را از مخزنهای قربانی جمعآوری کرده و آنها را به سرور مهاجمان ارسال میکند. قبل از ارسال، دادههای محرمانه دوبار با Base64 رمزنگاری میشوند.
این روش غیرمعمول برای جمعآوری دادهها برای یک استخراج یکباره از دادههای محرمانه مخزنهای کاربر طراحی شده است. با این حال، تهدید تنها متوجه قربانیان Shai-Hulud نیست؛ بلکه پژوهشگران عادی را نیز تهدید میکند. اگر در گیتهاب دنبال “shai- hulud” بگردید، چندین مخزن را خواهید یافت که توسط این کرم به خطر افتادهاند.اسکریپت اصلی bundle.js سپس فهرستی از تمام سازمانهایی که با قربانی مرتبط هستند درخواست و برای هر کدام تابع مهاجرترا اجرا میکند. این تابع نیز یک اسکریپت bash اجرا میکند، اما در این مورد آن را در /tmp/migrate-repos.sh ذخیره و نام سازمان، نام کاربری و توکن را بهعنوان پارامتر برای فعالیتهای مخرب بیشتر ارسال میکند.اسکریپت bash مهاجرت خودکار تمام مخزنهای خصوصی و داخلی سازمان مشخصشده را به حساب کاربر منتقل کرده و آنها را عمومی میکند. این اسکریپت همچنین از API گیتهاب برای کپی کردن محتوای مخزنهای خصوصی بهصورت آینه استفاده میکند.
ما بر این باوریم که این اقدامات برای سرقت خودکار کد منبع از مخزنهای خصوصی جوامع و سازمانهای مشهور طراحی شدهاند. بهعنوان مثال، شرکت شناختهشده CrowdStrike در این موج آلودگی گرفتار شد.
تکثیر خودکار کرم
پس از اجرای عملیات روی گیتهاب قربانی، اسکریپت اصلی bundle.js به مرحلهی حیاتی بعدی خود میپردازد: تکثیر خودکار. ابتدا اسکریپت فهرستی از بیست بستهی پرفروشتر (با بیشترین دانلود) متعلق به قربانی را دریافت میکند. برای این کار، یک پرسوجوی جستجو با نام کاربری استخراجشده از توکن npm اجرا میکند:
https://registry.npmjs.org/-/v1/search?text=maintainer:{%user_details%}&size=20
سپس برای هر یک از بستههایی که مییابد، تابع updatePackage را فراخوانی میکند. این تابع ابتدا تلاش میکند نسخهی tarball بستهفایل(.tgz) را دانلود کند. اگر موجود باشد، یک دایرکتوری موقت بهنام npm-update-{target_package_name} ایجاد میشود. نسخهی tarball بسته در آنجا بهعنوان package.tgz ذخیره شده، سپس باز میشود و بهصورت زیر تغییر مییابد:
- bundle.js مخرب به بستهی اصلی اضافه میشود.
- یک دستور postinstall به فایل package.json افزوده میشودکه در پروژههای Node.js برای مدیریت وابستگیها و متادیتای پروژه استفاده میشود. این دستور تنظیم میشود تا اسکریپت مخرب را از طریق node bundle.js اجرا کند.
- شمارهی نسخهی بسته یک واحد افزایش مییابد.
سپس بستهی تغییر یافته دوباره بستهبندی شده و بهعنوان نسخهی جدید با دستور npm publish در npm منتشر میشود. پس از این کار، دایرکتوری موقت مربوط به بسته حذف میگردد.
بارگذاری دادههای محرمانه در گیتهاب
در مرحله بعد، کرم از ابزار TruffleHog که پیشتر ذکر شد برای استخراج دادههای محرمانه از سیستم هدف استفاده میکند. این ابزار را از مخزن اصلی آن برای نوع سیستمعامل خاص دانلود میکند.کرم همچنین از ماژولهایی برای AWS و Google Cloud Platform (GCP) برای اسکن بهمنظور یافتن دادههای محرمانه استفاده میکند. سپس اسکریپت دادههای جمعآوریشده را در یک شیء واحد تجمیع نموده و یک مخزن بهنام «Shai-Hulud» در پروفایل قربانی ایجاد میکند. اطلاعات جمعآوریشده را سپس بهصورت فایل data.json در این مخزن آپلود میکند.
ویژگیهای آلودگی
یکی از ویژگیهای مشخص بستههای تغییر یافته این است که آنها حاوی آرشیوی بهنام package.tar هستند. این مهم است زیرا معمولاً بستهها آرشیویی با نامی مطابقتدهنده با خود بسته دارند.در طول تحقیقاتمان توانستیم اولین بستهای را که Shai-Hulud از آن شروع به انتشار کرده است شناسایی کنیم، و این بهخاطر یک تفاوت کلیدی ممکن شد. همانطور که قبلاً اشاره کردیم، پس از آلودگی، یک دستور postinstall برای اجرای اسکریپت مخرب node bundle.js در فایل package.json نوشته میشود. این دستور معمولاً بلافاصله پس از نصب اجرا میگردد. با این حال، ما کشف کردیم که یکی از بستههای آلوده همان دستور را بهعنوان preinstall فهرست کرده بود، بهاینمعنی که قبل از نصب اجرا میشد. این بسته ngx-bootstrap نسخهی ۱۸.۱.۴ بود. ما معتقدیم این نقطهی شروع انتشار این آلودگی بوده است. این فرضیه با این واقعیت که نام آرشیو در اولین نسخهی آلودهی این بسته با نامی که در نسخههای آلودهی بعدی مرسوم شد (package.tar) تفاوت داشت، بیشتر تقویت میشود.
هنگام بررسی بستههای مختلف، مشاهده کردیم که در برخی موارد یک بستهی واحد شامل چند نسخه با کد مخرب بوده است. این احتمالاً به این خاطر ممکن شده که آلودگی به همهی نگهدارندگان و مشارکتکنندگان بستهها سرایت کرده و کد مخرب سپس از هر یک از حسابهای آنها معرفی شده است.
کتابخانههای آلوده و CrowdStrike
کرم Shai-Hulud که بهسرعت در حال گسترش است، بسیاری از کتابخانههای محبوبی را که سازمانها و توسعهدهندگان روزانه استفاده میکنند آلوده کرده است. Shai-Hulud در روزهای اخیر بیش از ۵۰۰ بستهی محبوب را آلوده کرده است، از جمله کتابخانههایی از شرکت شناختهشدهی CrowdStrike.
از میان کتابخانههای آلوده میتوان به موارد زیر اشاره کرد:
@crowdstrike/commitlint نسخههای 8.1.1، 8.1.2
@crowdstrike/falcon-shoelace نسخههای 0.4.1، 0.4.2
@crowdstrike/foundry-js نسخههای 0.19.1، 0.19.2
@crowdstrike/glide-core نسخههای 0.34.2، 0.34.3
@crowdstrike/logscale-dashboard نسخههای 1.205.1، 1.205.2
@crowdstrike/logscale-file-editor نسخههای 1.205.1، 1.205.2
@crowdstrike/logscale-parser-edit نسخههای 1.205.1، 1.205.2
@crowdstrike/logscale-search نسخههای 1.205.1، 1.205.2
@crowdstrike/tailwind-toucan-base نسخههای 5.0.1، 5.0.2
اما رخدادی که توجه زیادی را به این تهدید در حال انتشار جلب کرد، آلودگی کتابخانهی @ctrl/tinycolor بود که بیش از دو میلیون دانلود هفتگی دارد.همانطور که بالاتر گفته شد، اسکریپت مخرب مخازن خصوصی یک سازمان را افشا میکند که برای صاحبان آنها تهدیدی جدی بهشمار میآید، زیرا این امر خطر افشای کد منبع کتابخانهها و محصولات آنها و موارد دیگر را ایجاد میکند و میتواند به از دست رفتن گستردهتری از داده منجر شود.
پیشگیری و محافظت
برای محافظت در برابر این نوع آلودگی، توصیه میکنیم از راهکارهای تخصصی برای نظارت بر مؤلفههای متنباز استفاده کنید. کسپرسکی یک جریان مداوم از بستهها و کتابخانههای بهخطرافتاده را نگهداری میکند که میتوان از آن برای ایمنسازی زنجیرهتأمین و حفاظت از فرایند توسعه در برابر تهدیدات مشابه استفاده کرد. برای دستگاههای شخصی، ما Kaspersky Premium را پیشنهاد میدهیم که محافظت چندلایهای برای پیشگیری و خنثیسازی تهدیدهای آلودگی فراهم میکند. راهحل ما همچنین میتواند در صورت آلودگی با بدافزار، عملکرد دستگاه را بازگرداند.
برای دستگاههای سازمانی، توصیه میکنیم پیادهسازی یک راهحل جامع مانند Kaspersky Next را در نظر بگیرید که به شما امکان میدهد یک سیستم امنیتی انعطافپذیر و مؤثر بسازید. این خط محصول روی تهدید اشراف کامل داشته و محافظتی در لحظه ارائه میدهد؛ همچنین قابلیتهای EDR و XDR برای تحقیقات و پاسخدهی را فراهم میآورد و برای سازمانها در هر مقیاس یا صنعتی مناسب است. محصولات کسپرسکی تهدید Shai-Hulud را با شناسه HEUR:Worm.Script.Shulud.gen شناسایی میکنند.
در صورت وقوع آلودگی Shai-Hulud، و بهعنوان اقدام پیشگیرانه در پاسخ به تهدید در حال گسترش، توصیه میکنیم اقدامات زیر را در سراسر سیستمها و زیرساختهای خود انجام دهید:
- از یک راهکار امنیتی قابلاعتماد برای انجام اسکن کامل سیستم استفاده کنید.
- مخزنهای GitHub خود را حسابرسی کنید:
- بررسی کنید آیا مخزنهایی با نامshai-hulud وجود دارند.
- بهدنبال شاخهها، pull requestها و فایلهای غیرمعمول یا ناشناس باشید.
- لاگهای GitHub Actions را برای رشتههایی حاوی shai-hulud بازبینی کنید.
- توکنهای npm و GitHub، کلیدهای ابریبهویژه برای AWS و Google Cloud Platform را بازنشر کنید و سایر دادههای محرمانه را گردش دهید.
- کش را پاک و ماژولهای npm خود را فهرست و بررسی کنید: بهدنبال ماژولهای مخرب باشید و نسخهها را به نسخههای پاک بازگردانید.
- بهدنبال شاخصهای نفوذ باشید، مانند فایلها در سیستم یا نشانههای شبکهای.
شاخصهای نفوذ
فایلها:
- bundle.js
- shai-hulud-workflow.yml
رشتهها:
shai-hulud
هشها:
C96FBBE010DD4C5BFB801780856EC228
78E701F42B76CCDE3F2678E548886860
نشانههای شبکهای
https://webhook.site/bb8ca5f6-4175-45d2-b042-fc9ebb8170b7
بستههای دستکاریشده
@ahmedhfarag/ngx-perfect-scrollbar
@ahmedhfarag/ngx-virtual-scroller
@art-ws/common
@art-ws/config-eslint
@art-ws/config-ts
@art-ws/db-context
@art-ws/di
@art-ws/di-node
@art-ws/eslint
@art-ws/fastify-http-server
@art-ws/http-server
@art-ws/openapi
@art-ws/package-base
@art-ws/prettier
@art-ws/slf
@art-ws/ssl-info
@art-ws/web-app
@basic-ui-components-stc/basic-ui-components
@crowdstrike/commitlint
@crowdstrike/falcon-shoelace
@crowdstrike/foundry-js
@crowdstrike/glide-core
@crowdstrike/logscale-dashboard
@crowdstrike/logscale-file-editor
@crowdstrike/logscale-parser-edit
@crowdstrike/logscale-search
@crowdstrike/tailwind-toucan-base
@ctrl/deluge
@ctrl/golang-template
@ctrl/magnet-link
@ctrl/ngx-codemirror
@ctrl/ngx-csv
@ctrl/ngx-emoji-mart
@ctrl/ngx-rightclick
@ctrl/qbittorrent
@ctrl/react-adsense
@ctrl/shared-torrent
@ctrl/tinycolor
@ctrl/torrent-file
@ctrl/transmission
@ctrl/ts-base32
@nativescript-community/arraybuffers
@nativescript-community/gesturehandler
@nativescript-community/perms
@nativescript-community/sentry
@nativescript-community/sqlite
@nativescript-community/text
@nativescript-community/typeorm
@nativescript-community/ui-collectionview
@nativescript-community/ui-document-picker
@nativescript-community/ui-drawer
@nativescript-community/ui-image
@nativescript-community/ui-label
@nativescript-community/ui-material-bottom-navigation
@nativescript-community/ui-material-bottomsheet
@nativescript-community/ui-material-core
@nativescript-community/ui-material-core-tabs
@nativescript-community/ui-material-ripple
@nativescript-community/ui-material-tabs
@nativescript-community/ui-pager
@nativescript-community/ui-pulltorefresh
@nstudio/angular
@nstudio/focus
@nstudio/nativescript-checkbox
@nstudio/nativescript-loading-indicator
@nstudio/ui-collectionview
@nstudio/web
@nstudio/web-angular
@nstudio/xplat
@nstudio/xplat-utils
@operato/board
@operato/data-grist
@operato/graphql
@operato/headroom
@operato/help
@operato/i18n
@operato/input
@operato/layout
@operato/popup
@operato/pull-to-refresh
@operato/shell
@operato/styles
@operato/utils
@teselagen/bio-parsers
@teselagen/bounce-loader
@teselagen/file-utils
@teselagen/liquibase-tools
@teselagen/ove
@teselagen/range-utils
@teselagen/react-list
@teselagen/react-table
@teselagen/sequence-utils
@teselagen/ui
@thangved/callback-window
@things-factory/attachment-base
@things-factory/auth-base
@things-factory/email-base
@things-factory/env
@things-factory/integration-base
@things-factory/integration-marketplace
@things-factory/shell
@tnf-dev/api
@tnf-dev/core
@tnf-dev/js
@tnf-dev/mui
@tnf-dev/react
@ui-ux-gang/devextreme-angular-rpk
@ui-ux-gang/devextreme-rpk
@yoobic/design-system
@yoobic/jpeg-camera-es6
@yoobic/yobi
ace-colorpicker-rpk
airchief
airpilot
angulartics2
another-shai
browser-webdriver-downloader
capacitor-notificationhandler
capacitor-plugin-healthapp
capacitor-plugin-ihealth
capacitor-plugin-vonage
capacitorandroidpermissions
config-cordova
cordova-plugin-voxeet2
cordova-voxeet
create-hest-app
db-evo
devextreme-angular-rpk
devextreme-rpk
ember-browser-services
ember-headless-form
ember-headless-form-yup
ember-headless-table
ember-url-hash-polyfill
ember-velcro
encounter-playground
eslint-config-crowdstrike
eslint-config-crowdstrike-node
eslint-config-teselagen
globalize-rpk
graphql-sequelize-teselagen
json-rules-engine-simplified
jumpgate
koa2-swagger-ui
mcfly-semantic-release
mcp-knowledge-base
mcp-knowledge-graph
mobioffice-cli
monorepo-next
mstate-angular
mstate-cli
mstate-dev-react
mstate-react
ng-imports-checker
ng2-file-upload
ngx-bootstrap
ngx-color
ngx-toastr
ngx-trend
ngx-ws
oradm-to-gql
oradm-to-sqlz
ove-auto-annotate
pm2-gelf-json
printjs-rpk
react-complaint-image
react-jsonschema-form-conditionals
react-jsonschema-form-extras
react-jsonschema-rxnt-extras
remark-preset-lint-crowdstrike
rxnt-authentication
rxnt-healthchecks-nestjs
rxnt-kue
swc-plugin-component-annotate
tbssnch
teselagen-interval-tree
tg-client-query-builder
tg-redbird
tg-seq-gen
thangved-react-grid
ts-gaussian
ts-imports
tvi-cli
ve-bamreader
ve-editor
verror-extra
voip-callkit
wdio-web-reporter
yargs-help-output
yoo-styles
کسپرسکی آنلاین (ایدکو)
کسپرسکی اسم یکی از بزرگترین شرکتهای امنیتی و سازنده آنتی ویروس است که برخی از کاربران اشتباهاً این شرکت و محصولات آنتی ویروس آن را با عناوینی نظیر کسپرسکای،کاسپرسکی، کسپراسکای، کسپراسکای، و یا کاسپراسکای نیز میشناسد. همچنین لازم به ذکر است مدیرعامل این شرکت نیز یوجین کسپرسکی نام دارد.