עסק מסוכן: הסבר על חבילות npm למחיקה עצמית

עסק מסוכן: חבילות אנטי-פרוקטורינג שמוחקות את עצמן

TL; DR

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

כל מה שחושף הרישום מסתובב; המטען לא. כל התשעה נשלחו בפורמט זהה לבייטים bin/ ספרייה, אותם עיכולים של SHA-256 על פני שלושה שמות חבילות ושני חשבונות, בהפרש של חמישה עשר ימים. זהות תוכן היא אות המעקב היחיד שהמפעיל הזה לא פרץ, והחבילה היחידה שמעולם לא משכו אותה היא הסיבה שניתן היה לבדוק אותה בכלל.

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

מערכת אקולוגית: npm, אותו דפוס שנצפה ב-PyPI. תקופה: יוני-אוגוסט 2026.

המדידה

זמן השהייה הוא המרווח בין הופעתה להיעלמותה של חבילה, המחושב מהמטא-דאטה של ​​הרישום עצמו. אלו הן מדידות, לא הערכות.

חֲבִילָהפורסם (UTC)נותר עומד
moidev2026-08-16 16:315h 58m
moidevx2026-08-17 03:2413h 23m
moidevz2026-08-26 03:3812h 56m
moideva2026-08-26 18:581h 33m
amicat2026-08-28 20:4817m
bmcat2026-08-28 21:1747m
eyevox2026-08-28 21:4421m
moidevh2026-08-31 03:2247m

לפי סדר הפרסום, החלון מתכווץ ביותר מפי ארבעים - מ-13 שעות ו-23 דקות בטווח הרחב ביותר ל-17 דקות בטווח הצר ביותר. ארבע החבילות הראשונות אורכות בממוצע שמונה וחצי שעות; ארבע האחרונות אורכות בממוצע שלושים ושלוש דקות. ב-28 באוגוסט, שלוש חבילות פורסמו והוצאו מהן בתוך פרק זמן של 77 דקות.

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

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

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

מה שורד את המחיקה

תשע מהחבילות הללו הן מפעיל אחד: מוידב, מוידבקס, מוידבז, מוידבה, מוידב, חבר, bmcat, איי-ווקס ו עינייםלשמות אין שום מוסכמה - אף אחד לא עוקב אחר מוידב stem היה מפספס יותר ממחציתם - והם פורסמו משבעה חשבונות נפרדים, כמעט כולם רשומים בדומיינים של דוא"ל חד פעמי.

מה שהם חולקים הוא ערך גלוי שאין לו סיבה להתקיים:

"bin": { "": "bin/kalamasha-tool.js" } }

שמרנו עותקים של חמישה מהם לפני הסרתם. בכל החמישה, כולו פַּח/ הספרייה זהה לבייטים:

שלחSHA-256
bin/kalamasha-tool.js0c293be90c10c8a7618d25f4c4811fa63612b7bc5199b86e10bb31eb36c716dd
bin/uia_extract.exee2fda5aa8397799669f29258f69e803cf05d322c1d93269eef6754ca024c3865
bin/chrome_cookies.ps121b61ec810331850d72423c40c5448e6cd310c4cfad6aed54f92cd7e7cac5f3a
bin/stealth_capture.ps1c9baf5897c03b941c54f736df5af9243ad28794a9e69746d41d4f4a34065589c
bin/uia_extract.pyc20b38c63efd9221930095c54b42cdd5adffa1972c44c4578226cbe1e4dbac3e
bin/uia_get_text.ps14a3f3ada0bdf13aa8e89edb8af817c7816296147dae5be25f169ff960d28a87c

שני אותות נוספים תואמים. שלוש מהחבילות פורסמו בשעה 03:24, 03:38 ו-03:22 UTC ב-17 באוגוסט, 26 באוגוסט ו-31 באוגוסט - רצועה של שש עשרה דקות על פני חמישה עשר ימים ושלושה חשבונות נפרדים. ושניים מהחשבונות הללו נרשמו באותו דומיין דוא"ל חד פעמי, מה שקשר אותם יחד באופן בלתי תלוי בקוד.

החשבונות

אלו הם חשבונות המוציאים לאור של npm ששלחו את המטען, כולל כל חבילה שהועלתה וכמה זמן היא נותרה עומדת:

חשבון המוציא לאורחֲבִילָהדומיין אימיילנותר עומד
letol39119moidev:1.0.0hutdot.com (חד פעמי)5h 58m
so1d1a7i27moidevx:1.0.0ogzmail.com (חד פעמי)13h 23m
lololololol435678eyiouss:3.0.21, 3.0.22, 4.0.1ogzmail.com (חד פעמי)עדיין פורסם
tagadob568moidevz:1.0.0ebflyai.com (חד פעמי)12h 56m
tayihim489moideva:1.0.0prodbits.com (חד פעמי)1h 33m
sahihai123amicat:1.0.0, bmcat:2.0.9, eyevox:1.0.0דואר אלקטרוני לצרכן17m / 47m / 21m
heytoshanmoidevh:1.0.0דואר אלקטרוני לצרכן47m

so1d1a7i27 ו חחחחחחחחחחחחח435678 לחלוק את ה ogzmail.com דומיין רישום - הקישור שמקשר את החשבון שעדיין מארח עותק פעיל לחשבון שפורסם תחת מוידב גזע שבועיים קודם לכן. sahihai123 פרסם ומשך שלושה שמות חבילות נפרדים בתוך חלון זמן יחיד של 77 דקות ב-28 באוגוסט. הייטושאן רשום, פורסם מוידב, ומשכה אותו 47 דקות לאחר מכן; זהו נותר הפרסום היחיד של חשבון זה.

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

חבילה אחת מעולם לא נמשכה. eyiouss:4.0.1 פורסם מאז ה-16 באוגוסט ועדיין היה ניתן לפתרון בזמן כתיבת שורות אלה. שמונה חפצים לא ניתנים לשחזור; הקמפיין שוחזר כולו מהאחד שנשאר. אופרטור שמוחק באופן רפלקסיבי עדיין ישאיר, בסופו של דבר, אחד עומד.

מה עושה הכלי

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

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

// 🛡️ שם בינארי STEALTH: אסור להתנגש עם Testpad האמיתי! const STEALTH_NAME = 'SearchApp.exe';

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

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

החבילה גם נשלחת chrome_cookies.ps1, בראשותו מחלץ עוגיות כרום, אשר מפענח קובצי Cookie של Chrome ו-Edge דרך DPAPI וקורא את מסד הנתונים של קובצי Cookie מעד ארבעה פרופילי דפדפן. נאמר מראשcisאלי: לא מצאנו את הסקריפט הזה שנקרא בשמו מאף קובץ JavaScript שנשלח. מה שקיים ונגיש הוא החצי הצורך, אשר מזריק עוגיות סשן מאוחסנות לדפדפן המוטמע.

מעמדם של האנשים שמתקינים אותו

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

הצדדים שנפגעו הם צדדים שלישיים שמעולם לא נגעו ב-npm: המוסד שמנהל את הבחינה, המועמדים האחרים וכל מי שמסתמך על משמעות האישור.

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

הם מפעילים קובץ בינארי לא חתום מאף אחד. uia_extract.exe ספינות הורכבו, ללא מקור וללא מקור בנייה, מחשבון שכבר אינו קיים. אותו קובץ, באמצעות גיבוב, פורסם מחדש על ידי לטול39119, so1d1a7i27, חחחחחחחחחחחחח435678, טאגאדוב568, tayhim489, sahihai123 ו הייטושאן במשך חמישה עשר ימים. אין מתחזק לשאול, אין מאגר לקרוא ואין היסטוריה לבדוק - כל זהות ששלחה אותו מחקה את עצמה.

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

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

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

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

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

אותה תבנית, אופרטור שונה

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

בין ה-24 ל-27 באוגוסט, ארבע חבילות npm הופיעו תחת שמות שאולים מכלי אימות דו-שלבי - אימות-OTP, secretkey-2fa, secretkey2fa ו 2fa-secretkey — נושאים שש עשרה גרסאות ביניהן. כל אחת מהן פורסמה מחשבון חדש משלה (ביילילול, ז'אןפול686 גרם, זזאליפיי, דלווווו), כולם ללא אימות דוא"ל, אף אחד עם קישור מאומת לבקרת מקור, אף אחד לא מפרסם שום דבר אחר. כל אחד מהם הוסר על ידי המוציא לאור שלו.

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

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

חֲבִילָהמַפעִילנותר עומד
octopus-actionמשואת סיור2.5 דקות
mt-ts-serverless-starterמשואת סיור9.6 דקות
2fa-secretkeyשמות כיסוי של 2FA35.7 דקות
secretkey2faשמות כיסוי של 2FA37.6 דקות
secretkey-2faשמות כיסוי של 2FA37.8 דקות
auth-otpשמות כיסוי של 2FA274.9 דקות
hex-encode-utilsאַחֵר724.2 דקות

שבע חבילות, חציון 37.8 דקות, אף אחת מהן לא קשורה לתוכנת בחינות.

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

למה החלון נסגר

משהו השתנה בסביבת הרישום במהלך 2026, והמועמד המתבקש הוא שהסריקה הפכה מהירה יותר.

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

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

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

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

מה לעשות בנידון

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

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

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

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

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

אינדיקטורים

סוּגערך
שלחbin/kalamasha-tool.js — לא-standard נקודת כניסה לפח
SHA-2560c293be90c10c8a7618d25f4c4811fa63612b7bc5199b86e10bb31eb36c716dd
SHA-256e2fda5aa8397799669f29258f69e803cf05d322c1d93269eef6754ca024c3865
התַהֲלִיךSearchApp.exe נכתב לצד זמן ריצה לגיטימי של אלקטרון
התנהגותpowershell -ExecutionPolicy Bypass -File עם windowsHide: true
התנהגותtaskkill /F /T מיקוד בתהליך Safe Exam Browser
מידע נוסףרשימת מתחזקים ריקה ליד time.unpublished שיא
חשבונותletol39119, so1d1a7i27, lololololol435678, tagadob568, tayihim489, sahihai123, heytoshan
הַרשָׁמָהogzmail.com, hutdot.com, ebflyai.com, prodbits.com — דומיינים חד פעמיים לדוא"ל

הפניות

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

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

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