TL; DR
מפרסם npm יחיד, deadcode09284814ניהל קמפיין טיפוסקווט נגד הלגיטימי axios ו chalk-template חבילות מאז אמצע מאי 2026.
הקמפיין החל כגנב אישורים וארנקים קונבנציונלי, שחילץ נתונים ל... מנהרת HTTPS של Serveo.
On 2026-05-17עם axois-utils:1.0.9, המפעיל החליף את המטען לחלוטין: אותו scaffold עם משולש התקנה-וו, אותו מפרסם, אותו שם חבילה.
אבל סקריפט ההתקנה הוא כעת גיוס בוטנט DDoS חוצה פלטפורמות.
המטען מדבר אל א localhost.run מנהרה ומקבלת פקודות הצפה, מה שהופך סביבות נגועות לחלק מרשת בוטים התומכת ב-DDoS.
המפעיל אפילו שלח את בינארי של שרת C2 בתוך ה-tarball, מראה הסלמה ברורה מגניבת אישורים לתשתית בוטנט פעילה.
שתי חבילות, ארבע גרסאות שעדיין פעילות ברישום, ואופרטור אחד מריץ כעת את שני המודולים במקביל.
חומרה: גבוהה.
הפיגום המשותף
כל גרסה שפורסמה של שתי החבילות מצהירה על אותם שלושה מחזורי חיים hooks in package.json:
רישום המטען תחת שלושתם hooks זה מוגזם - לאחר ההתקנה לבד יפעל כברירת מחדל התקנת npmהבחירה חשובה: התקנת npm –ignore-scripts מדלג על סקריפטים, אך מספר זרימות עבודה נפוצות (שחזורי מטמון CI) שמפעילים מחדש את מחזור החיים hooks באופן סלקטיבי, או מפתחים שרק מבצעים ביקורת לאחר ההתקנה) לבצע הצהרה של יתירות משולשת - ההימור הבטוח ביותר עבור התוקף.
גיר-תבנית מוסיף מנגנון שני: הוא מצהיר axois-utils:^1.0.7 כזמן ריצה התלותהתקנת ה-typosquatted תבנית גיר לכן מושך גם את ה-typosquat האח, ושני המטענים פועלים. שתי החבילות הן זוג מתואם, לא רשימות עצמאיות.
שלב א' - גונב אישורים / ארנקים (15-05-2026 → הווה)
שלב א' הוא המטען המקורי. המטען קצר postinstall.js שמצביע על מנהרה הפוכה של Serveo HTTPS:
תת-הדומיין של Serveo מקודד את כתובת ה-IP של היעד (80.200.28.28) ישירות בשם המארח - מוסכמה מוכרת עבור שירות זה. האופרטור מחליף את קידומת תת-הדומיין האקראית בין גרסאות כדי להתחמק מרשימות חסימה של דומיינים תמימים, אך ה-IP הבסיסי לעולם לא זז. (גיר-תבנית: 1.0.14 מְשׁוּמָשׁ 8a3e818ea8f11186-80-200-28-28…1.0.16 / 1.0.19 / 1.0.20 שימוש f04a273bd84c0622-….)
postinstall.js הוריד את הידיים אל phantom.js, מודול "אספן" ארוז בן 7,667 שורות. phantom.js הולך עם המארח עבור:
מפתחות פרטיים של SSH (~/.ssh/*) |
.npmrc תוכן וכל דבר npm_* אסימוני סביבה |
| קבצי אישורים של AWS, GCP ו-Azure |
ביטוי רגולרי של אסימון גישה אישי של GitHub (ghp_*, gho_*, ghu_*, ghs_*) |
| ארטיפקטים של ארנקי קריפטו עבור ביטקוין, אקסודוס, אלקטרום, מונרו, לייטקוין, דוג'קוין, זקאש ודאש |
רקורסיבי .env* לעבור דרך ~/projects, ~/dev, ~/code, ~/workspace, ואת קובץ ההתקנה cwd |
היסטוריות של Shell והכל process.env |
החבילה נשלחת למנהרת Serveo ב- / לאסוףאין ערפול, אין היגיון נגד מכונות וירטואליות, אין תהליך של בימוי - ההימור של המפעיל הוא על נפח ומהירות.
שלב ב' - גיוס PhantomBot DDoS (17-05-2026, axois-utils:1.0.9 בלבד)
שלב ב' מחליף את phantom.js + postinstall.js בקובץ יחיד בשם distrube.js (שגיאת ההקלדה היא של האופרטור). קובץ ה-triple-hook ב-package.json נותר ללא שינוי; החבילה שומרת על אותו שם, היקף ותבנית גרסת-הבאה. מבחוץ, axois-utils:1.0.9 נראה כהמשך מינורי ל-1.0.6. בפנים, מדובר במשפחת תוכנות זדוניות שונה.
distrube.js נפתח עם בלוק תצורה שמציין את המיתוג של המפעיל עצמו:
// axois-utils-1.0.9/distrube.js:11-15 |
// Use your localhost.run HTTPS URL (the tunnel handles HTTP internally) |
const C2_HOST = 'b94b6bcfa27554.lhr.life'; // Your localhost.run tunnel |
const C2_PORT = 443; // HTTPS port - tunnel handles SSL |
const BOT_ID = `${os.hostname()}_${Date.now()}_${crypto.randomBytes(4).toString('hex')}`; |
ההערות מופנות לאופרטור עתידי שיפעיל את הערכה ("השתמש בכתובת ה-HTTPS של localhost.run"). זה, בנוסף למה שמגיע ליד לקוח הבוט, הוא הסימן לכך שזה לא רק מטען של קורבן - זה הערכה.
הזרימה:
- התמדה רץ ראשון. הסקריפט מתקין את עצמו בשלוש דרכים שונות לכל מערכת הפעלה (רישום הפעלה + תיקיית הפעלה + משימות ב-Windows; crontab + שירות פנטום-בוט יחידת systemd + .bashrc/.zshrc הוסף + /etc/rc.local על לינוקס; LaunchAgent com.phantom.bot.plist ב-macOS). שם שירות ההתמדה ותווית LaunchAgent שניהם פנטום-בוט / com.phantom.bot, ומכאן גם מגיע שם הקמפיין.
- מידע מערכת exfil פועל פעם אחת - פוסט חד פעמי של טביעת אצבע אל b94b6bcfa27554.lhr.life:443/collect הכולל שם מארח, פלטפורמה, קשת, שם משתמש, מעבד/זיכרון RAM, ממשקי רשת, process.env, cwd, מדריך בית, גרסת צומת ו-IP ציבורי. זה הרבה פחות אגרסיבי משלב A: אין SSH, אין ארנקים, אין רקורסיה של .env. תפקיד הבוט הוא להירשם, לא לגנוב.
- לולאת פעימות לב פותח פוסט HTTPS כל 30 שניות אל b94b6bcfa27554.lhr.life:443/. סוכן המשתמש הוא PhantomBot/1.0. אימות TLS מושבת במפורש (rejectUnauthorized: false). תגובת C2 מנותחת כ-JSON בצורה {type, target, port, duration, threads, method} ונשלחת.
- ארסנל הצפה מחובר לשש פקודות:
| סוג פקודה | מודול | הערות |
|---|---|---|
| פינג | תשובת חיות | בוט מזהה את עצמו |
| http | הצפה ב-HTTP | הצפה של בקשות שכבה 7 |
| https | הצפת HTTPS | זהה ל-http, עטוף ב-TLS |
| TCP | הצפה של TCP | ספאם של מטען אקראי בגודל 65 KB |
| UDP | הצפה של UDP | חבילות UDP בגודל 65,507 בתים |
| מהיר | איפוס מהיר של DoS של HTTP/2 | טכניקת CVE-2023-44487 משנת 2023 |
כל חמשת מודולי ההצפה לוקחים יעד, נמל, משך, ו אשכולות טיעון - הבוט הוא בוט גנרי להצפת קבצים, שאינו מכוון לקורבן מסוים. רשימת הקורבנות של המפעיל נמצאת ב-C2, לא בחבילה.
מה חדש כאן - הקובץ הבינארי C2 שנשלח
שלב א' הוא צורה מוכרת: גניבת אישורים, וו התקנה, מנהרה של ספק C2. שלב ב' הוא גם צורה מוכרת - בוטנטים של DDoS היו תופעה קבועה של חבילות npm זדוניות במשך שנים. מה שיוצא דופן הוא שהמפעיל שלח את צד השרת של הערכה בתוך ה-tarball של npm:
- c2 — קובץ בינארי Go ELF בגודל 4 מגה-בייט מהודר
- c2.go — מקור Go בן 426 השורות עבור קובץ בינארי זה
אף קובץ לא מופעל על ידי אף וו התקנה. הם אינם חלק ממטען הקורבן. הם נמצאים בספריית החבילות באותו אופן שבו קובץ תיעוד היה נמצא. הקריאה הסבירה ביותר היא שהאופרטור דחף את עץ העבודה של הפיתוח שלו ל-npm מבלי לאצור את רשימת הקבצים - טעות של ממש ב-OpSec - ומה שסופק הוא הערכה הדו-צדדית המלאה: הלקוח שהקורבן מריץ, והשרת שהאופרטור מריץ.
זה החלק בסיפור שמצדיק את ההגדרה של "ערכת בוטנט מוכן". כל מי שהוריד axois-utils:1.0.9 ל-before הסרת הקוביד יש לא רק דגימת קורבן - יש להם שרת C2 שעובד.
הציר, במשפט אחד
אותו מו"ל, אותם שמות חבילות, אותו פיגום משולש, אותו מיתוג "פנטום" - אבל המטען שינה את מודל המונטיזציה בן לילהמ"סודות קציר שאני יכול למכור מחדש" ועד "להשכרה של קיבולת הצפה שאני יכול לחכור". ה-TTP בזמן ההתקנה שמגינים צריכים לעקוב אחריהם כמעט זהים בשני השלבים; הגנות מבוססות חתימה המותאמות למחרוזות נתיב הארנק של שלב A או ל phantom.jsאספן 7,667 השורות של היה מפספס את שלב ב' לחלוטין.
| תאריך (UTC) | אירוע |
|---|---|
| 2026-05-15 | פרסום ראשון: axois-utils:1.0.4 (בניית בדיקות LAN, מערכת פיתוח ב 192.168.129.19) |
| 2026-05-15 | axois-utils:1.0.6 פורסם - שלב א' ג'2 הוחלף ל 80.200.28.28 דרך מנהרת Serveo; הערה מהמקור // Change to '80.200.28.28' for public מאשר את החלפת ה-dev→prod |
| 2026-05-16 | chalk-tempalte:1.0.14 ו 1.0.16 פורסם - מעמיס משורשר מכריז axois-utils:^1.0.7 כתלות בזמן ריצה; תת-הדומיין של Serveo נסובב |
| 2026-05-16 | קמפיין שלב A התגלה במהלך סריקת npm שגרתית; אושר כי הוא זדוני. |
| 2026-05-17 | axois-utils:1.0.9 פורסם - ציר מטען: גיוס DDoS של PhantomBot דרך מנהרת localhost.run; צד המפעיל c2 בינארי ו c2.go המקור נשלח בקובץ tarball |
| 2026-05-17 | chalk-tempalte:1.0.19 ו 1.0.20 פורסם - עדיין שלב א' (גנב); המפעיל מפעיל כעת את שני המודולים במקביל |
| 2026-05-17 | גילוי שלב ב' במהלך סריקה שגרתית; פסקי דין יושמו על פני כל 2026-05-17 גירסאות |
| (מתמשך) | דוחות הסרה ממתינים; כל ארבע החבילות שפורסמו נותרו זמינות ברישום נכון למועד כתיבת שורות אלה |
אינדיקטורים לפשרה
מארזים
| מערכת אקולוגית | חֲבִילָה | גרסאות |
|---|---|---|
| Npm | axois-utils (טיפוסקווט של אקסיוס) | 1.0.4, 1.0.6, 1.0.9 |
| Npm | chalk-tempalte (טיפוסקווט של תבנית גיר) | 1.0.14, 1.0.16, 1.0.19, 1.0.20 |
זהות המחבר
| שדה | ערך |
|---|---|
| מו"ל npm | deadcode09284814 |
| כתובת הדוא"ל של המוציא לאור | phantomdeadcode@tutamail.com |
| SCM אימות | אף לא אחד |
פיקוד ושליטה
| שלב | נקודת קצה | תחבורה |
|---|---|---|
| A | f04a273bd84c0622-80-200-28-28.serveousercontent.com:443/collect | מנהרת HTTPS של Serveo |
| A | 8a3e818ea8f11186-80-200-28-28.serveousercontent.com:443/collect | מנהרת HTTPS של Serveo (גרסה מוקדמת יותר) |
| A | 80.200.28.28:443/collect | נקודת קצה VPS בסיסית |
| B | b94b6bcfa27554.lhr.life:443/ | localhost.run HTTPS מנהרה הפוכה |
סיכומי קבצים (SHA-256)
| שלח | SHA-256 | הערות |
|---|---|---|
c2 (Go ELF, 4 מגה-בייט) | 165fa92d237fd017c227d00da06ab788212a62be94bf61e95df2d22d00377ef2 | שרת C2 בצד המפעיל, נשלח בתוך axois-utils:1.0.9 |
c2.go (426 שורות) | 7d0ae79fdb1e9968f3323a3712b624643a782ba3efb2cf3a2cb9c4c5513cea30 | עבור למקור עבור הקובץ הבינארי C2 |
distrube.js | 308b15c023088a7188dea4ef609010ac2493eb4c365b103053d7621a9ca5b935 | לקוח בוט שלב ב' |
phantom.js (chalk-tempalte:1.0.19) | 9e380ec88d3ccf3929e1a104e3b868d4d7b59ca189a8a431a54e9f3357dfdd81 | אספן אישורים / ארנקים שלב א' |
phantom.js (chalk-tempalte:1.0.20) | d1c9e3f296ee9f7d5032f73f9c504cede50334bc14c394055fd5cb9c3a6e08b3 | קולט שלב A (גרסה 1.0.20) |
postinstall.js (chalk-tempalte:1.0.19 = 1.0.20) | ffba9bdd6793edd5b38e12900252c1813a693f59c25af51c3b658cf3f27b6162 | טוען שלב A, זהה לבייטים בשתי הגרסאות |
ייחוס ומוטיבציה
אנו עוקבים אחר הקמפיין הזה כ PhantomBot, תוך לקיחת המיתוג של המפעיל עצמו מה- סוכן משתמש: PhantomBot/1.0 כותרת פעימת הלב, ה שירות פנטום-בוט יחידת systemd, ה com.phantom.bot תווית LaunchAgent, ו- קודמתמתים@ כתובת דוא"ל. האופרטור עקבי לגבי שם זה על פני לפחות ארבעה ארטיפקטים.
קטלוג אותות
- מוֹצִיא לָאוֹר - קוד מת 09284814 ב-npm. חשבון בעל גישה יחידה, דוא"ל חד פעמי של Tutamail, לא SCM אימות. אין היסטוריית פרסומים קודמת מעבר לקמפיין זה.
- שימוש חוזר במיתוג — "phantom" מופיע בדוא"ל של המוציא לאור, בשם הקובץ של אספן שלב A (phantom.js), בשם שירות ההתמדה של שלב B (שירות פנטום-בוט), בתווית LaunchAgent (com.phantom.bot), ובסוכן המשתמש של הבוט (פנטוםבוט/1.0).
- תשתית — VPS יחיד ב 80.200.28.28 מתמודד עם שלב א' באמצעות רוטציית תת-דומיין של Serveo; שלב ב' עובר ל-a localhost.run מנהרה הפוכה (b94b6bcfa27554.lhr.lifeשני שירותי הספקים הם בחינם ודורשים רק SSH יוצא מצד המפעיל, בהתאם להגדרות בעלות תקציב נמוך ו-OpSec נמוך.
- סגנון קוד — JavaScript רגיל לכל אורכו; ללא ערפול, ללא קידוד מחרוזות, ללא בדיקות אנטי-VM. שמות המשתנים הם תיאוריים (גניבהמידעמערכת, ביצועפקודה, httpFlood). תגובות ב distrube.js לפנות ישירות לאופרטור עתידי ("השתמש בכתובת האתר שלך מסוג HTTPS מסוג localhost.run"), מה שמרמז שהקובץ נועד להיות מופץ מחדש כערכה, ולא לשימוש על ידי תוקף יחיד.
- ביטול OpSec — קובץ ה-tarball של שלב B שולח גם את לקוח הבוט וגם את שרת ה-C2 בצד המפעיל (c2 ELF + c2.go מקור). זה עולה בקנה אחד עם אופרטור שדחף את עץ העבודה שלו ל-npm מבלי לבצע ביקורת על רשימת הקבצים. או שהאופרטור חסר ניסיון, או שהערכה אינה התכוון להפצה ציבורית והקובץ הבינארי C2 הוא חלק מהמוצר.
- אישור עצמי - axois-utils:1.0.4 מכיל את הערת המקור // שינוי ל-'80.200.28.28' עבור הציבור בשורה 12, המאשר את התקדמות הפיתוח / השלבים / הייצור שמפעילים בדרך כלל מכחישים.
מוטיבציה
המטען של שלב א' הוא גניבה פיננסית פשוטה: אישורים, מפתחות ענן, אסימוני GitHub וארנקי קריפטו - לכולם יש שווקי מכירה חוזרת נזילים. שלב ב' הוא גם פיננסי, אך עקיף: שירותי DDoS להשכרה ("booter") שוכרים קיבולת הצפה לפי דקה, ובוטים כמו זה שמגיע כאן הם המלאי שעליו פועלים השירותים הללו. פעימת הלב של 30 שניות, הגנרי... יעד/נמל/משך סכמת הפקודה, וארסנל ההצפה של חמשת הפרוטוקולים הם ה- standard תוצר של מפעיל אתחול.
הפעלת שני המודולים במקביל — גיר-תבנית: 1.0.19 ו 1.0.20 להמשיך לשלוח את הגנבת בזמן axois-utils:1.0.9 שולח את הבוט - מרמז שהמפעיל מגדר את זרמי ההכנסות במקום לנטוש את שלב א'. הציר הוא תוספת, לא תחליף.
מה שאנחנו לא טוענים
לא הצלחנו לאשר זהות אמיתית מאחורי ה... קוד מת 09284814 handle, ואנחנו לא מייחסים את הקמפיין הזה לאף גורם איום, קבוצה או מדינה. המיתוג "הפנטום" עקבי מספיק בין הארטיפקטים כדי לרמוז על אופרטור יחיד, אבל המשלוח בסגנון ערכת של הקובץ הבינארי C2 משאיר את האפשרות שחבילות עתידיות מ-handles לא קשורים ישתמשו באותו קוד.
השפעה, מגמות ומה על מגינים לעשות
פְּגִיעָה
מטרות סקוואט לגיטימיות אקסיוס ו תבנית גיר תלויים בהם באופן נרחב במערכת האקולוגית של JavaScript; אקסיוס לבדה נמצאת בין שלושים חבילות ה-npm שהורדו הכי הרבה. שמות ה-typosquat נמצאים במרחק לחיצת מקלדת אחת מהשמות האמיתיים (אקסויס ↔ אקסיוס, טמפלטה ↔ תבנית), ושתיהן שגיאות כתיב סבירות מבחינה לשונית.
לא הצלחנו להשיג סטטיסטיקות הורדה אמינות עבור הגרסאות הזדוניות לפני ההסרה - npm לא שומר ספירות הורדות לפי גרסה לאחר ביטול פרסום של חבילה, ו npms.ioפרוקסי בסגנון - רועשים בקנה מידה כזה. כל ארגון שקובץ הנעילה שלו מפותר לחבילה בשם אקסואה-אוטילס or גיר-תבנית מהמוציא לאור קוד מת 09284814 יש להתייחס אליו כאל פגיעה: סובבו כל אישור קיים ב process.env במארח המושפע, יש לבצע ביקורת על וקטורי ההתמדה לכל מערכת הפעלה (ראה "מה על מגיני מערכת לעשות" להלן), ולהסיר את התלות.
דפוסים מתעוררים
קמפיין זה מדגים שינוי שראינו במספר אירועי NPM אחרונים: פיגום וו ההתקנה הוא הנכס העמידהמטען ניתן להחלפהאותו מוציא לאור, אותה חבילה, אותו הדבר התקנה מוקדמת / להתקין / לאחר ההתקנה משולש, ואפילו אותו קצב דחיפה של גרסה - הדבר היחיד שהשתנה בין axois-utils:1.0.6 ו axois-utils:1.0.9 האם הקובץ היה hooks הפעלה. זיהוי מבוסס חתימה המותאם למטען של שלב A (מחרוזות נתיב הארנק, phantom.jsאספן 7,667 השורות של, מארח Serveo C2) היה מסמן את שלוש הגרסאות הראשונות ומפספס לחלוטין את שלב B.
אותה תבנית נראית בקמפיינים אחרים בשנת 2026 שעקבנו אחריהם: מפעיל יחיד עם מבנה יציב, מעבר בין גניבת אישורים, לקוחות רמאות מבחנים, אקספיל של בוט טלגרם, וכעת גיוס DDoS. מגיני הגנה שמסתמכים על חתימות מטען ימשיכו להפסיד בסיבוב השני של כל קמפיין.
המסקנה היא ש TTP בזמן ההתקנה הם הסיגנל הטוב יותרהצהרות install-hook משולשות, סקריפטי התקנה שמייבאים https or תהליך_ילד, להתקין סקריפטים שכותבים לתיקיות אתחול של המשתמש, ולהתקין סקריפטים שפותרים שמות מארחים בשירותי מנהרה הפוכה בחינם (Serveo, localhost.run, ngrok, cloudflared) כולם נדירים בחבילות לגיטימיות ונפוצים בחבילות זדוניות.
מה שגופי ההגנה צריכים לעשות
- ביקורת נעילת קבצים. חפש בכל package-lock.json / חוט.נעילה / pnpm-lock.yaml בארגון שלך עבור המחרוזות המדויקות אקסואה-אוטילס ו גיר-תבניתהתייחסו לכל התאמה כאל פשרה.
- סובב סודות על מארחים מושפעים. שלב א' איסוף בכמות גדולה של אישורי SSH, ענן, GitHub, npm וארנק. הנחה שכל אישור קיים אי פעם ב process.env, ~ / .ssh, ~/.aws, ~/.npmrc, ~ / .config, או כל .env* הקובץ במארח המושפע נחשף.
- הסר את ההתמדה (שלב ב'). ב-Windows, מחק HKCU\תוכנה\מיקרוסופט\Windows\גרסה נוכחית\הפעלה\עדכון מערכת, הסר %APPDATA%\Microsoft\Windows\תפריט התחלה\תוכניות\הפעלה\system-update.bat, ו schtasks /delete /tn SystemUpdate /fבלינוקס, -e crontab ולהסיר @צומת אתחול מחדש …, systemctl –השבתת משתמש –עכשיו phantom-bot.service ואז מחק ~/.config/systemd/user/phantom-bot.service, לשפשף .bashrc / .zshrc / /etc/rc.localב-macOS, פריקת launchctl ~/Library/LaunchAgents/com.phantom.bot.plist לאחר מכן מחק את ה-plist.
- חסום את המארחים של C2. הוסף את ארבע נקודות הקצה של C2 בטבלת IOC לרשימת החסימות של היציאה שלך. *.serveousercontent.com ו *.lhr.life ניתן לחסום אותו באופן מוחלט אם לסביבה שלך אין שימוש לגיטימי לשירותי מנהרה הפוכה.
- חיפוש לפי TTP בזמן התקנה, לא מטען. רשומות נעילת מלאי אשר package.json מצהיר התקנה מוקדמת, להתקין, ו לאחר ההתקנה כולם מצביעים על אותו סקריפט. בדיקה צולבת מול גיל החבילה וסטטוס אימות המפרסם. דפוס זה נדיר בחבילות לגיטימיות והוא הסימן האמין ביותר ש-PhantomBot משתמש בו שוב.
- ביקורת עבור הקובץ הבינארי C2. כל מי שהוריד axois-utils:1.0.9 יש את שרת ה-C2 של המפעיל (c2 ELF, sha256 165fa92d…) בדיסק. סרוק מטמונים ומאגרי חפצי CI. הקובץ הבינארי רדום בפני עצמו, אך נוכחותו בתחנת עבודה מהווה ראיה חד משמעית שהחבילה הותקנה.
קו הסגירה
אותו מפעיל, אותה חבילה ואותו וו התקנה יכולים לספק איומים שונים לחלוטין בתוך 48 שעות. שימו לב ל"פיגום", לא למטען.




