רן בר-זיק     לפני 6 שנים     כ- 5 דקות קריאה  

מודול מרכזי ב-npm הושחת ומיליוני שרתים ואפליקציות נמצאים בסיכון | אינטרנט ישראל

תוכנה

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

המודול event stream היה עד כה מודול אולטרא פופולרי של node. הוא איפשר למתכנתים לעבוד יותר בקלות עם streams. באופן אישי, לא הבנתי למה צריך אותו אבל היו אחרים שכן הצטרכו אותו. מיליונים מהם ליתר דיוק. למודול יש כשתי מיליון הורדות בשבוע. זה לא אומר ששני מיליון איש מורידים אותו בשבוע כמובן, אבל זה אומר שהוא נמצא בלא מעט בילדים ותוכנות שמורידות אותו בכל התקנה והתקנה.

weekly downloads
1,942,351

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

קוד מעורבל למי שלא יודע הוא קוד שכתוב (לשם הדוגמה) ב base64 או משהו בסגנון ואנו עושים לו eval. אם אנו רואים כזה דבר, זה סימן שמי שעשה את זה לא רוצה שנבחין בקוד בקלות.

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

אחרי שההאקר הזדוני right9ctrl השתיל את הקוד, הוא הקפיץ את גרסת ה-minor של החבילה לגרסה 3.3.6. ונתן להורדות לזרום. כל מי שכיוון את ה-package.json שלו, כלומר הקובץ שמוריד מודולים לגרסה *.3  קיבל את החבילה המורעלת בכל התקנה או בילד.

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

מה אתם צריכים לעשות?

הדבר הראשון שצריך לעשות הוא לבדוק אם יש שימוש בחבילה הזו אצלכם. וזה לא משנה אם אתם משתמשים ב-node או מתכנתים בשפה אחרת. כיוון ש-node עוזרת בלא מעט פלטפורמות אחרות. איך בדיוק? באמצעות ה-package.json. פתחו את ה-package-lock.json שלכם וחפשו את ״event-stream״. אם אתם רואים משהו שמתאים לגרסה 3.3.6 – זה הזמן למחוק את node_modules ולהתקין מחדש.

    "event-stream": "^3.3.4",
    "gulp": "^3.9.1",
    "gulp-clean-css": "^2.3.2",
דוגמה של התקנה בעייתית

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

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

וזהו, תזהרו שם בחוץ 🙂

Picture of רן בר-זיק

רן בר-זיק

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

9 תגובות

  1. תודה, מאוד חשוב.
    חשוב להוסיף גם שלא מספיק לבדוק רק ב-package.json כי יכול להיות שאחת הספריות המותקנות משתמשת ב-event-stream.
    עבור מי שמשתמש ב-yarn אפשר לבדוק את זה בעזרת:
    yarn why event-stream

    • שגיאת הקלדה – היה צריך להיות package-lock.json. אבל טעיתי.
      בכל מקרה התוספת של ה-yarn חשובה. תודה שהוספת!

  2. 2 נקודות מעניינות נוספות –

    1. ה"האקר" לא רק פירסם את החבילה ושידרג גירסה (למרות שזה היה מספיק) – הוא גם שתל את הקוד רק בקובץ ה-minified שפורסם בשביל להקשות על הזיהוי.

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

    מסקנות ולקחים שצריך להטמיע –

    לצמצם למינימום את הdependencies, אין שום צורך להתקין חבילה רק בשביל כמה שורות קוד.

    כשמתקינים חבילה, לבדוק כמה ואיזה dependencies יש לה, כולל dependencies של dependencies של dependencies..

    אם יש לכם פרוייקט קוד פתוח – לא לתת שליטה למישהו שאתם לא מכירים. אם החבילה לא מתוחזקת, לעשות לה archive בgithub ולסמן אותה deprecated בnpm.

    אין צורך לתת שליטה למישהו אחר (שאתם לא מכירים), שיעשה fork ויעבוד על גירסה חדשה

  3. "מי שדיווח על העניין הזה הוא דני גרדנר מ-snyk והדיווח שלו באנגלית זמין כאן."
    ממש לא נכון, מי שדיווח היה משתמש בגיטהאב שנתקל בזה בעקבות הודעת deprecation שקפצה עקב השימוש ב createDecipher בנוד 10, שם הפונקציה דפריקייטד.

    זה קרדיט לא נכון, ספק פרסומת סמויה (כפי שניתן לראות גם בסוף הפוסט) ספק טעות בתום לב 😉

    • צודק, הייתי צריך לכתוב שלמדתי על העניין הזה מהפוסט (המצוין) שלו ותיקנתי. בלי שום קשר לכך שהוא משלם לי 5,000 דולר לחודש… (לא באמת) 🙂

  4. יוותר פשוט לחפש ככה:
    grep -irn event-stream

    תודה

השארת תגובה

פוסטים מומלצים

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

למפתחי ובוני אתרי אינטרנט

אפריל 14, 2024 אין תגובות

למפתחי ובוני אתרי אינטרנט

אוגוסט 4, 2024 6 תגובות

מיקרו בקרים

ספטמבר 24, 2023 4 תגובות

בניית אתרי אינטרנט

מרץ 11, 2024 תגובה אחת

DALL·E 2024-01-20 11.16.08 - A detailed illustration of a modern web architecture. The architecture includes a user interface layer with web browsers and mobile devices, a middle

למפתחי ובוני אתרי אינטרנט

ינואר 21, 2024 14 תגובות

יסודות בתכנות

יוני 9, 2024 4 תגובות