TL; DR
בין ה-1 במאי ל-6 במאי 2026, מפרסם npm יחיד, alone5511, דחפה שמונה חבילות ללא תלות שנראות כמכוונות מיקרוסופט / מרחבי שמות של חבילות פנימיות בסגנון Azure.
החבילות השתמשו בשמות כגון cosmos-explorer, ms.analytics-web, icons.generated, latency-tracking-internal, carbonite-internal, ו carboniteappמספר גרסאות השתמשו בערכי semver גבוהים כגון 99.9.0 ו 99.9.13, שהיא טקטיקת בלבול תלויות נפוצה שנועדה לעקוף חבילות פנימיות פרטיות.
כל שמונה חבילות האחיות כבר לא פורסמו מ-npm על ידי המפרסם בין ה-1 במאי ל-6 במאי 2026. מטא-נתונים ישירים של הרישום אישרו שקבצי ה-tarball מחזירים כעת HTTP 404 מ-npm CDN.
עם זאת, האשכול עדיין חשוב.
המטען בדגימות הקנוניות, carbonite-internal:99.9.0 ו carboniteapp:99.9.0, פועל בזמן ההתקנה דרך preinstall וו. הוא אוסף נתוני טביעות אצבע של המארח, מאחזר את כתובת ה-IP הציבורית של המכונה מ api.ipify.org, בונה "דו"ח מודיעין ברמה מקצועית" מזויף, מסמן את המארח כ RCE VERIFIED, ושולח את הדוח לבוט של טלגרם דרך ה-API של בוט הטלגרם.
התרעה מוקדמת מפני תוכנות זדוניות (MEW) של Xygeni המערכת סיווגה את הדגימות הקנוניות כככל הנראה זדוניות עם ציון מעל 91/100.
אנו עוקבים אחר זה כקמפיין פנימי של מיקרוסופט לבלבול בתלות שם, הכולל טביעות אצבע של המארח בזמן ההתקנה וחילוץ משואות טלגרם.
האשכול: שמונה חבילות, מו"ל אחד
חשבון המוציא לאור alone5511 השתמשתי בכתובת הדוא"ל:
raistargaming703@gmail.com
לחשבון לא היה כתובת דוא"ל מאומתת, לא SCM אימות, וציון מוניטין npm של 2.
זהות GitHub עם הפניה, alonebeast002/beastcrypt, הופיע גם בהקשר של אשכול.
המוציא לאור הוציא שמונה חבילות קשורות במשך שישה ימים. לכל החבילות היו אפס תלויות והן עקבו אחר אותו דפוס כללי: חבילה קטנה, סקריפט בזמן התקנה, טביעת אצבע של המארח ו-Telegram beaconing.
| # | חֲבִילָה | גרסה זדונית | נוצר, UTC | לא פורסם, UTC | מטען אושר | התקנת וו |
|---|---|---|---|---|---|---|
| 1 | חוקר קוסמוס | 1.1.3 | 2026-05-01T18:26Z | 2026-05-01T19:01Z | משוער, אותו מו"ל / אשכול | התקנה מוקדמת, משוערת |
| 2 | signalsdk-web | 1.0.0, 10.0.0 | 2026-05-04T13:57Z | 2026-05-04T18:51Z | מוּסָק | התקנה מוקדמת, משוערת |
| 3 | ms.analytics-web | 99.0.0, 99.9.13 | 2026-05-04T18:47Z | 2026-05-05T10:07Z | מוּסָק | התקנה מוקדמת, משוערת |
| 4 | אייקונים שנוצרו | 99.9.13 | 2026-05-05T10:02Z | 2026-05-05T12:57Z | מוּסָק | התקנה מוקדמת, משוערת |
| 5 | מעקב אחר השהייה | 99.9.0 | 2026-05-05T11:57Z | 2026-05-05T12:57Z | מוּסָק | התקנה מוקדמת, משוערת |
| 6 | מעקב-השהייה-פנימי | גרסאות שהוסרו מרשומת הרישום | 2026-05-06T06:02Z | 2026-05-06T08:35Z | מוּסָק | התקנה מוקדמת, משוערת |
| 7 | קרבוניטאפ | 99.9.0 | 2026-05-06T05:49Z | 2026-05-06T08:35Z | כן, זרימת קוד מלאה של הסורק | התקנה מוקדמת: node index.js |
| 8 | קרבוניט פנימי | 99.9.0 | 2026-05-06T06:14Z | 2026-05-06T08:36Z | כן, זרימת קוד מלאה של הסורק | התקנה מוקדמת: node index.js |
סך כל צמד הגרסאות הזדוניות ברחבי האשכול: 9+.
גרסאות של חלק מרשומות חבילות האחים נמחקו לאחר ביטול הפרסום, דבר המגביל שחזור מדויק מנתוני רישום ציבורי בלבד.
למה השמות חשובים
שמות החבילות הם האות החזק ביותר.
הם נראים כמו חבילות SDK פנימיות, טלמטריה, יצירת אייקונים, סייר או מעקב אחר השהייה:
cosmos-explorer
signalsdk-web
ms.analytics-web
icons.generated
latency-tracking
latency-tracking-internal
carbonite-internal
carboniteapp
זה לא מתן שם אקראי. זה נראה מכויל עבור בלבול תלות.
מספר חבילות מאוחרות יותר השתמשו במספרי גרסה גבוהים:
99.0.0
99.9.0
99.9.13
10.0.0
זה חשוב מכיוון שהתקפות בלבול תלויות מסתמכות לעתים קרובות על חבילות ציבוריות בעלות גרסאות מתקדמות יותר מאשר חבילות רישום פרטי פנימיות. אם מערכת בנייה מוגדרת בצורה שגויה, מנהל החבילות עשוי לבחור את גרסת ה-npm הציבורית על פני הגרסה הפנימית המיועדת.
נראה שגם המו"ל מתעצם עם הזמן.
חבילות מוקדמות השתמשו בגרסאות שנראות רגילות, כגון 1.1.3 ו 1.0.0חבילות מאוחרות יותר עברו ל... 99.x.x ו 99.9.xשינוי זה עולה בקנה אחד עם גורם שמכוון את הקמפיין להתנהגות פתרון חבילות פנימית.
מה קורה בזמן ההתקנה
הדוגמאות הקנוניות, carbonite-internal:99.9.0 ו carboniteapp:99.9.0, להכריז על preinstall וו:
{
"scripts": {
"preinstall": "node index.js"
}
}
משמעות הדבר היא שהמטען פועל לפני ש-npm מסיים להתקין תלויות.
זוהי נקודת ההתחלה המוקדמת ביותר האפשרית בזמן ההתקנה. המפתח אינו צריך לייבא את החבילה. הבנייה אינה צריכה להריץ קוד אפליקציה. ההתקנה עצמה מספיקה.
המטען קטן, כ-2.4 KB, ואין לו מטרה פונקציונלית מעבר לשידור באמצעות משואות.
התנהגות מטען
השמיים index.js הקובץ מבצע ארבע פעולות עיקריות.
ראשית, זה קורא api.ipify.org כדי לאחזר את כתובת ה-IP הציבורית של המארח:
https://api.ipify.org
שנית, הוא אוסף נתוני טביעות אצבע בסיסיים של המארח באמצעות ממשקי API של מערכת ההפעלה Node.js:
os.userInfo()
os.hostname()
os.platform()
os.networkInterfaces()
os.uptime()
שלישית, הוא מעצב את הנתונים שנאספו לדוח רב-שורתי עם באנר מילולי:
PRO-LEVEL INTELLIGENCE REPORT
הדוח מסתיים ב:
Status: 🟢 RCE VERIFIED
רביעית, הוא שולח את הדוח לטלגרם דרך sendTelegram(report) פונקציה, באמצעות נקודת הקצה של ה-API של בוט הטלגרם:
https://api.telegram.org/bot/sendMessage
אסימון הבוט המדויק של טלגרם נשמר בתוך קבצי tarball שלא פורסמו וניתן לשחזר אותו מהאחסון הפנימי של npm.
למה חשוב לבאנר "RCE VERIFIED"
המילולי RCE VERIFIED הסמן אומר משהו מבחינה תפעולית.
המטען אינו פורס דלת אחורית. הוא אינו מתמיד. הוא אינו גונב ישירות אישורי ענן. במקום זאת, הוא מאשר שהתרחשה ביצוע קוד במהלך התקנת החבילה.
זה מספיק עבור קמפיין הוכחת ביצוע של בלבול תלות.
אם התוקף מקבל הודעת טלגרם מסביבת יעד, הוא יודע שחבילת ה-npm הציבורית נפתרה ובוצעה בתוך מארח אמיתי, CI runner, תחנת עבודה למפתחים או סביבת בנייה.
במילים אחרות, הנוזקה לא רק אוספת מטא-דאטה של המארח. היא מאמתת האם רזולוציית החבילה של היעד ניתנת לניצול.
סיווג Xygeni MEW
Xygeni MEW סיווג את הדגימות הקנוניות כ- כנראה זדוני, עם ציון מעל 91/100.
הגילויים כללו:
| חומרה | איתור | משמעות |
|---|---|---|
| קריטי | סינון_נתונים_רגישים | הפונקציה req.write(data) נושאת את דוח טביעת האצבע של המארח לתוך פוסט יוצא בטלגרם |
| גָבוֹהַ | סקריפטים_התקנה_מזוהים | התקנה מוקדמת: node index.js מפעיל את ה-beacon בזמן ההתקנה |
| נמוך | בקשה_חשודה | גילוי IP ציבורי דרך api.ipify.org |
| נמוך | בקשה_חשודה | נקודת קצה יוצאת של API בוט של טלגרם |
| נמוך | חבילה_טריוויאלית | לחבילה אין מטרה משמעותית מעבר ל-beaconing |
| מידע | ספירת_נתונים_רגישים | פרטי המארח כגון זמן פעולה, פרטי משתמש ושם מארח מפורטים |
שניהם carbonite-internal:99.9.0 ו carboniteapp:99.9.0 היו לו מטענים זהים, כולל אותו מזהה זרימת קוד וסקריפטי התקנה שווי ערך לבייט.
אינדקס הפרויקטים של המוציאים לאור של MEW סימן את כל שמונה החבילות כחלק מאותו אשכול מוציאים לאור/מטען.
למה דפוס ביטול הפרסום העצמי חשוב
כל שמונה חבילות האחים בוטלו על ידי ההוצאה לאור תוך דקות עד שעות ממועד הפרסום.
ההתנהגות הזו חשובה.
מתחזקים לגיטימיים לפעמים מבטלים פרסום של חבילות, אבל התזמון כאן נראה כמו ניקוי על ידי תוקף. החבילות הופיעו, ביצעו את המטען שלהן בזמן ההתקנה אם נפתרה על ידי מטרה, ואז נעלמו מגישה לציבור מהרישום.
זה יוצר שתי בעיות עבור שחקני ההגנה.
ראשית, מטא-דאטה של npm ציבורי הופכת לבלתי שלמה לאחר ביטול הפרסום. ייתכן שחלק מרשומות הגרסה יוסרו או שקשה יותר לשחזר אותן.
שנית, מגנים המסתמכים על מצב הרישום הנוכחי עלולים לפספס חבילות שהיו קיימות במהלך חלון החשיפה אך אינן ניתנות עוד להתקנה.
מסיבה זו, npm צריך לשמור את קבצי ה-tarball שלא פורסמו באופן פנימי לצורך זיהוי פלילי. הבוט של טלגרם אסימון בתוך קבצי ה-tarball עשוי לעזור למנות את ערוץ המקבל ולשחזר קורבנות אפשריים.
אינדיקטורים של פשרה וגילוי
מו"ל וחשבון
| שדה | ערך |
|---|---|
| שם משתמש של npm | alone5511 |
| דוא"ל של מפרסם npm | raistargaming703@gmail.com |
| מוניטין של npm | 2 |
| אימייל מאומת | לא |
| SCM מְאוּמָת | לא |
| זהות GitHub שהופניה | alonebeast002/beastcrypt |
שמות חבילות מושפעות
cosmos-explorer
signalsdk-web
ms.analytics-web
icons.generated
latency-tracking
latency-tracking-internal
carbonite-internal
carboniteapp
דפוסי גרסה חשודים
10.0.0
99.0.0
99.9.0
99.9.13
גרסאות גבוהות אלו רלוונטיות במיוחד בחקירת בלבול תלויות מכיוון שהן עשויות לעלות בדירוג על גרסאות חבילה פרטיות.
נקודות קצה של הרשת
| סוּג | ערך |
|---|---|
| בדיקת IP ציבורית | https://api.ipify.org |
| כיור חילוץ | https://api.telegram.org/bot<token>/sendMessage |
| שיטת סינון | פוסט API של בוט טלגרם |
סמני מטען
חפש סקריפטי התקנה עבור המחרוזות הבאות:
PRO-LEVEL INTELLIGENCE REPORT
Status: 🟢 RCE VERIFIED
sendTelegram(
סמן גם את דפוס המניפסט הזה:
{
"scripts": {
"preinstall": "node index.js"
}
}
במיוחד בשילוב עם:
- אפס תלות
- גודל חבילה זעיר
- שם חבילה שנראה פנימי
- גרסת סמסטר גבוהה
- ממשקי API של טביעות אצבע של מארח
- תעבורת ה-API של בוט הטלגרם
ממשקי API של טביעות אצבע מארחים
המטען הקנוני משתמש ב:
os.userInfo()
os.hostname()
os.platform()
os.networkInterfaces()
os.uptime()
זה פונה גם אל:
https://api.ipify.org
כדי ללכוד את כתובת ה-IP הציבורית של המארח.
הערות גילוי
מספר כללים יכולים לתפוס את הקמפיין הזה וגרסאות קרובות.
ראשית, עקוב אחר סקריפטי התקנת npm שיוצרים קשר עם טלגרם:
api.telegram.org
סקריפט התקנת חבילה כמעט אף פעם לא אמור להישלח לטלגרם. יש להתייחס לזה כאל חריג עוין אלא אם כן יש חריג ברור מאוד שנבדק.
שנית, דגל preinstall סקריפטים בחבילות זעירות ללא תלות עם שמות שנראים פנימיים.
השילוב של חבילה קטנה, גרסת semver גבוהה ושם בסגנון מרחב שמות פנימי הוא איתות חזק לבלבול בין תלות.
שלישית, התראה על שמות חבילות שנראים כמו מודולי הנדסה פרטיים שפורסמו על ידי חשבונות npm ציבוריים בעלי מוניטין נמוך.
דוגמאות מאשכול זה כוללות:
ms.analytics-web
latency-tracking-internal
carbonite-internal
icons.generated
רביעית, חפשו הפניות לקובצי נעילה (lockfile file) לשמונה שמות החבילות במערכות CI ובתחנות עבודה של מפתחים.
לחפש:
package-lock.json
yarn.lock
pnpm-lock.yaml
npm-shrinkwrap.json
כל התאמה צריכה להפעיל סקירת בלבול תלויות.
פעולות רישום מוצעות
אשכול זה כבר לא פורסם בזמן הדיווח. עם זאת, ביטול הפרסום אינו מסיר את הסיכון.
פעולות מומלצות בצד ה-npm:
- אשר האם ביטול הפרסומים היה ניקוי שיזם התוקף ולא פעולה לגיטימית של המתחזק.
- השעיה או חסימה של חשבון המוציא לאור
alone5511. - הוסף את המוציא לאור, כתובת הדוא"ל, שמות החבילות וסמני המטען לרשימות פגיעה וחסימת שרשרת האספקה.
- שמור קבצי tarball שלא פורסמו באחסון פנימי לצורך זיהוי פלילי.
- חלץ את אסימון הבוט של הטלגרם מתוך קבצי ה-tarball השמורים.
- עבדו עם טלגרם, במידת האפשר, כדי לזהות את ערוץ המקבל ולשחזר את טלמטריית הקורבן הפוטנציאלית.
רשימת תיוג לתגובה לפשרה
אם אחת מהחבילות המושפעות הופיעה בקבצי הנעילה שלך, יומני הבנייה, מטמון החבילות או היסטוריית ההתקנות של CI במהלך חלון החשיפה, התייחס אליה כאל אירוע ביצוע של בלבול תלויות.
תגובה מומלצת:
- זהה היכן הותקנה החבילה: תחנת עבודה מקומית, רץ CI, סוכן בנייה או תמונת מכולה.
- שמור קבצי נעילה, מטמון npm, יומני בנייה, היסטוריית מעטפת ופלט של מנהל חבילות.
- בדוק יומני רשת יוצאים עבור
api.telegram.orgוapi.ipify.orgבמהלך חלון ההתקנה. - בדוק האם ההתקנה רצה בסביבה עם משתנים רגישים, אישורים או גישה פנימית לרשת.
- סובב אסימונים החשופים לסביבת ההתקנה אם המארח היה רץ CI מורשה או תחנת עבודה של מפתחים.
- תצורת פתרון חבילות ביקורת לצורך פתרון בלבול בין רישום ציבורי/פרטי.
- אכיפת חבילות פרטיות בהיקף והצמדת רישום.
- חסום חבילות ציבוריות לא מאושרות שתואמות לדפוסי מתן שמות פנימיים.
- להוסיף guardrails עבור סקריפטי התקנה, במיוחד
preinstall,install, וpostinstall.
מה שמגנים צריכים לקחת איתם
הקמפיין הזה אינו מורכב מבחינה טכנית. בדיוק בגלל זה הוא חשוב.
המטען קטן, ישיר וקל להפעלה. התוקף אינו זקוק להתמדה או לתוכנות זדוניות מתקדמות. הוא זקוק רק לנתיב אחד שגוי לפתרון חבילות.
הסיכון האמיתי הוא בלבול תלות.
חבילה עם שם בעל מראה פנימי מוכר, מספר גרסה גבוה ו- preinstall וו יכול להפוך רגיל npm install לתוך משואה מתוך הסביבה שלך.
בעד DevSecOps צוותים, הלקח ברור: שמות חבילות פנימיים הם נכסים רגישים. התייחסו אליהם כאל משטח התקפה.
דווח ל-npm לצורך אכיפה ברמת החשבון, רישום חסימות ושימור tarball שלא פורסם.







