הינך נמצא כאן

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

תאריך:17.10.18
npm
אם חיפשתם פירות חגיגיים לט"ו בשבט הקרוב, מצאנו לכם את השיחוק הבא: תותים בטעם ענבים. וזה לא החידוש החקלאי היחיד.

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

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

weekly downloads<br />
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",<br />
    "gulp": "^3.9.1",<br />
    "gulp-clean-css": "^2.3.2",
דוגמה של התקנה בעייתית

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

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