קוד זדוני הוזרק ל-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. זו נקודת הכשל העיקרית. אותו מפתח לא השתמש בהגנה דו שלבית להגנה על החשבון שלו. מנקודת הכשל הזו הכל החל להתדרדר.

התוקפים לקחו את שם המשתמש והסיסמה, שכאמור לא הוגן באימות דו שלבי והתחברו לחשבון הגיטהאב של המתכנת, דרכו הם הזריקו קוד לגרסאות eslint-escope@3.7.2 ו- eslint-config-eslint@5.0.2. מה הקוד הזה עשה? זה מה שיפה בסיפור הזה. הוא הריץ קוד שנמצא ב-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 על מנת לאחסן את הססמאות שלהם ואיך פרצה אחת, כביכול איזוטרית ומוגבלת יכולה לגרום לנזק אדיר וכמה חשוב לקבוע ססמה שונה לאתרים שונים ובמיוחד ססמאות שונות לאתרים חשובים במיוחד עבורכם.

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

אהבתם? לא אהבתם? דרגו!

לא אהבתי בכלללא אהבתיבסדראהבתיאהבתי מאוד (15 הצבעות, ממוצע: 4.60 מתוך 5)

תגיות: , פורסם בקטגוריה: חדשות אינטרנט

יאללה, שתפו :)

אל תשארו מאחור! יש עוד מה ללמוד!

3 comments on “קוד זדוני הוזרק ל-eslint עקב רשלנות של מתכנת
  1. Dviros הגיב:

    יצא כלי שמאפשר למצוא חבילות “נגועות”:
    https://snyk.io/vuln/npm:eslint-scope

  2. אלי הגיב:

    היי רן,
    אני מפתח עם create react app וראיתי שיש ב-node modules שיש תיקיה של eslint scope וב-package json שלו זה מופיע

    “_from”: “eslint-scope@^3.7.1”,
    “_id”: “eslint-scope@3.7.1”,

    אני מניח שזה אומר שהכל בגדול בסדר לא?

  3. משתמש אנונימי (לא מזוהה) הגיב:

    זה לא מתכנת זה טמבל נקודה פסיק חחח;

כתיבת תגובה

האימייל לא יוצג באתר.

רישום