ב-11 במאי 2026, בין 19:20 ל-19:26 לפי שעון UTC, פורסמו לרישום החבילות npm 84 גרסאות נגועות של 42 חבילות מתוך המשפחה של TanStack. שש דקות, ואז זה נגמר. הגרסאות האלה נשאו נוזקה שגונבת פרטי אימות, והן פורסמו תחת זהות הפרסום הלגיטימית של הפרויקט עצמו, כך שמי שהתקין אותן לא ראה שום דבר חריג.

מה החולשה?

זו לא חולשה בקוד של TanStack. זו חולשה בדרך שבה הקוד מגיע מהמאגר אל מי שמשתמש בו.

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

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

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

מי מושפע?

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

מי שכן צריך לבדוק הוא כל פרויקט שמשתמש בחבילות של TanStack. ברשומה מופיעים זוגות גרסאות מדויקים, למשל 1.169.5 ו-1.169.8 של @tanstack/react-router, 1.167.68 ו-1.167.71 של @tanstack/react-start, ו-1.166.16 מול 1.166.19 של @tanstack/router-devtools. הרשומה מונה גם חבילות נוספות מחוץ למשפחה, בהן cmux-agent-mcp ו-nextmove-mcp.

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

האם מנוצלת בפועל?

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

מה עושים?

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

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

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

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