קוד זדוני הוזרק ל-eslint עקב רשלנות של מתכנת

כך אי הקפדה על כללי אבטחת מידע בסיסיים גרמה לפריצה משמעותית ב-eslint וב-npm
המחשה לתקיפה על eslint

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

רקע

בגדול, node היא שפת תכנות מבוססת ג'אווהסקריפט שמשתמשים בה בצד שרת אבל גם כתשתית להמון המון אפליקציות ואתרים. למשל דחיסה של קבצי ג'אווהסקריפט, בדיקות שונות – מבדיקות תקינות ועד בדיקות אבטחה נעשות על ידי תוכנות מבוססות node שרצות על הקבצים השונים של האפליקציה. אחת החבילות היא eslint. זה נשמע שם משעמם ולא מעניין אבל בערך בכל האתרים והאפליקציות מבוססות הווב שאתם רואים משתמשים בה על מנת לעשות ניתוח סטטי של קוד. החבילה הזו היא מבוססת קוד פתוח. כלומר יש צוות של מתכנתים מתנדבים שכותבים אותה. כמו רוב תוכנות הקוד הפתוח, התוכנה הזו מנוהלת בגיטהאב. התוכנה עצמה מופצת באמצעות מאגר תוכנה שנקרא npm שהוא ראשי תבות של node package manager. הוא המפיץ והמתקין העיקרי של תוכנות node.

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

הסבר טכני

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

התוקפים לקחו את שם המשתמש והסיסמה, שכאמור לא הוגן באימות דו שלבי והתחברו לחשבון הגיטהאב של המתכנת, דרכו הם הזריקו קוד לגרסאות [email protected] ו- [email protected]. מה הקוד הזה עשה? זה מה שיפה בסיפור הזה. הוא הריץ קוד שנמצא ב-pastebin. הקוד הזה הלך אל קובץ .npmrc שמכיל את ההגדרות של המפתחים שמשתמשים בחבילות האלו, כולל ה-tokenים שלהם ושלח את כל המידע הזה אל התוקף. כלומר כל מי שעדכן את הגרסאות האלו, ויש לא מעט כאלו – השיגו גישה אל החשבונות npm שלו ויכולת להזריק קוד זדוני אל החבילות שהם מנהלים. כמו טיפת רעל שמתפשטת במאגר מים.
החבילה eslint-scope היא חבילה פופולרית שמשתמשים בה גם ב-webpack וגם ב-babel שהם התשתית של כל אתר/אפליקצית ווב מודרנית.

המחשה לתקיפה על eslint
המחשה לתקיפה על eslint

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

הקבוצה של eslint שיחררה דו"ח מסודר המפרט את כל מה שכתבתי לעיל וגם npm שחררה דו"ח כזה. בשני הדו"חות יש מידע מפורט וקישורים למידע נוסף.

מה עושים

איך מגינים על עצמכם? ראשית, אם אין לכם גרסאות מקובעות של חבילות תוכנה – אולי כדאי לשקול לעבור לכאלו ואם לא, כדאי לוודא שגרסאות eslint-scopeשיש אצלכם היא לא בגרסה 3.7.2 (חבילת הקוד eslint-config-eslint היא חבילת קוד שנמצאת בשימוש פנימי של מתכנתי eslint).

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

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

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

בינה מלאכותית

להריץ ממשק של open-webui על הרספברי פיי

להפעיל ממשק של צ׳אט ג׳יפיטי שאפשר לגשת אליו מכל מחשב ברשת הביתית על רספברי פיי עם מודל בשם tinydolphin שרץ על רספברי פיי.

צילום מסך של סוואגר
יסודות בתכנות

openAPI

שימוש בתשתית הפופולרית למיפוי ותיעוד של API וגם הסבר בסיסי על מה זה API

תמונת תצוגה של מנעול על מחשב
פתרונות ומאמרים על פיתוח אינטרנט

הגנה מפני XSS עם Trusted Types

תכונה ב-CSP שמאפשרת מניעה כמעט הרמטית להתקפות XSS שכל מפתח ווב צריך להכיר וכדאי שיכיר.

גלילה לראש העמוד