איך תוכלו להגן על עצמכם בפעם הבאה שמפתח יחבל בקוד הפתוח שלו

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

מאראק סקוויירס, המפתח שהחל את כל הבלאגן. תמונה: טוויטר

מאת: שחר מנשה

לפני כשבוע, מפתח אמריקאי בשם מאראק סקוויירס (Marak Squires) (מעכשיו ייקרא “המפתח“) שאחראי על החבילות colors ו-faker, פרסם גרסאות חדשות זדוניות לחבילות הנ”ל, ספציפית גרסה 1.4.1 של colors שעלתה לאוויר ביום שבת (ה-8 לינואר) וגרסה 6.6.6 של faker שעלתה לאוויר ביום רביעי לפני כן (ה-5 לינואר). 

כמה שבועות בלבד אחרי שהתגלתה חולשת Log4Shell, מגיע מקרה דומה שמראה עד כמה גדל הפער בין הפופולריות של קוד פתוח לבין הקרדיט, שמקבלים אלו שמפתחים אותו, והיכולת של המשתמשים בו לדעת בדיוק במה הם משתמשים. במילים אחרות – עד כמה מדוייק ה-xkcd הזה. חשוב לציין שבמקרה זה הפגיעות הייתה מכוונת ע”י מפתח החבילה, ולא תיקון באג כמו במקרה של Log4Shell או השתלטות חיצונית על חשבון ה-npm כמו במקרה של ua-parser-js.

מה בדיוק קרה כאן?

החבילות שהזכרנו נמצאות ברשימת החבילות הכי פופולריות של npm (מאגר הספריות הפופולארי ביותר של שפת Node.js) עם כ-28 מיליון הורדות שבועיות, וכ-21 אלף פרויקטי npm אחרים שמסתמכים על החבילות.

עדכונים אלו היו למעשה עדכונים זדוניים, שמטרתם היתה לשבור את תאימות החבילות (במקרה של faker) וכן לגרום לנזק ממשי לכל מי שמשתמש בחבילת colors – ע”י הרצה של לולאת הדפסה אינסופית ברגע שהחבילה מיובאת.

מאות אלפי משתמשים נפגעו מהשינוי הזדוני

ניתן לאמוד את מספר המשתמשים שנפגעו מהשחתת החבילות, על-ידי בחינה של מספר ההורדות של הגרסאות הזדוניות שלהן

ארכיון של npm

הגרסאות הזדונית של colors הורדו מ-npm יותר מ-670,000 פעמים.

ארכיון של npm

שימו לב: הגרסה הריקה של faker הורדה מ-npm יותר מ-20 אלף פעמים, ועדיין זמינה להורדה מ-npm כגרסה הכי חדשה.

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

מניעים כלכליים ואידיאולוגיים בתרבות הקוד הפתוח

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

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

נראה שהמניעים של המפתח אינם רק כלכליים אלא גם אידיאולוגיים, למשל בגרסה הריקה של חבילת faker, קובץ ה-README מכיל רק משפט בודד – “מה באמת קרה עם ארון שוורץ”?

ארון שוורץ, נזכיר, היה אחד ממתכנתי הקוד הפתוח המוכרים ביותר בעולם, ועבד על טכנולוגיות פורצות דרך כמו RSS, פיתוח רישיון Creative Commons ועל חופש המידע, כאחד ממייסדי האתר reddit. בשנת 2011 נעצר שוורץ על ידי סוכנים פדרליים בחשד להפצה מאסיבית של מאמרים אקדמיים מאתר JSTOR. שוורץ נאבק עם האשמות פדרליות קשות עד ינואר 2013 בו נמצא תלוי בדירתו. יש הגורסים כי ארון לא התאבד ולכן צצו תיאוריות לגבי התערבות של הממשל הפדרלי במותו.

השינויים הזדוניים

חזרה לחבילות.

ניתן לראות את כלל השינויים מגרסה 1.4.0 ל-1.4.1 של colors כאן, אך השינוי המעניין ביותר הוא הוספה של לולאת הדפסה אינסופית, שמתרחשת ברגע שהחבילה colors מיובאת:

כהלצה נוספת, המפתח הוסיף קוד שמדפיס “ASCII Art” של דגל ארה”ב בצמוד לדמות פטריוטית כלשהי והמילים LIBERTY, כנראה כמחאה על התרבות הקפיטליסטית של ארה”ב וחברות הענק שמשתמשות בקוד שלו בחינם.

בשאר הגרסאות הזדוניות של colors (גרסאות 1.4.2 ו-1.4.44) הקוד הזדוני עדיין קיים באותו מקום, אך נעשו שינויים מינוריים שמטרתם לוודא שהקוד הזדוני הוסר.

למשל בשינוי הנ”ל ניתן לראות שהקוד הזדוני הוסר, אך מקובץ safe.js שלא משפיע על ריצת החבילה כלל. באופן משעשע, המפתח עצמו פתח Issue על ה-“באג” שנוצר בגרסאות החדשות של colors, בו הוא “מנסה למצוא את מקור הבעיה” – הקריאה מומלצת לחובבי הז’אנר. בנוסף לשינויים בקוד, המפתח הסיר גישה מכל שאר מפתחי הפרויקט, ובכך למעשה “נעל” את הקוד של colors במצב הזדוני הנוכחי.

השינוי בחבילת faker הוא הרבה יותר פשוט. במעבר מגרסה 5.5.3 לגרסה 6.6.6, כלל הקוד של החבילה פשוט נמחק לחלוטין (למשל, אין קובץ index.js שאחראי לאתחול החבילה) –


הימנעות ממתקפות code hijacking דומות

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

1. ודאו שאתם מסתמכים על גרסאות ספציפיות של כל פרויקט צד שלישי שאתם משתמשים בו. ניתן לעשות זאת ע”י זה שתוודאו שכל מספרי הגרסאות בקובץ package.json של החבילה שלכם מכיל גרסה בודדת, ולא מכיל תווים שמאפשרים טווח של גרסאות (כמו ~, ^, >, <, -, x, *). ספציפית עבור החבילה הפגיעה colors, ניתן לראות את התיקון שבוצע בחבילה prompt:


לחילופין, אם קובץ ה-package.json שלכם חייב לאפשר טווחי גרסאות לתלויות, אבל אין לכם צורך לעדכן אף אחת מהתלויות כרגע, התקינו את התלויות של הפרויקט עם הפקודה npm ci (במקום npm install). פקודה זו תשתמש אך ורק בגרסאות הספציפיות שמצוינות בקובץ הנעילות package-lock.json (שנוצר אוטומטית בעת ההתקנה הראשונה) ולא תעדכן אף אחת מהתלויות. אם קובץ הנעילות אינו קיים – הפקודה תיכשל.

שימו לב שהתקנה גלובלית, כלומר npm install -g, תתעלם מקובץ הנעילות package-lock.json. במקרה שהחבילה שלכם דורשת התקנה גלובלית (למשל, החבילה שלכם היא כלי command line ולא ספרייה) יש להשתמש בקובץ נעילות בשם npm-shrinkwrap.json. פורמט הקובץ זהה לקובץ package-lock.json

2. כשמשתחררת גרסה חדשה יותר של אחד מהפרויקטים שאתם מסתמכים עליהם –

חכו מספר ימים לפני השדרוג, כדי לראות אם צצים באגים או בעיות אבטחה בגרסה החדשה. עצה זו נכונה שבעתיים במקרה שאתם מנהלים npm repository משלכם (למשל סביבת enterprise) שמפתחים אחרים תלויים בה. למשל – בסמוך ליציאת הגרסה הזדונית של colors, נפתחו כ-23 issues חדשים עם יותר מ-350 הערות!

בדקו אם הגרסה החדשה מפורסמת בכל ה-Repositories הרלוונטיים לפרויקט. למשל במקרה של colors ו-faker, הגרסאות הזדוניות שוחררו רק ב-npm: הגרסה האחרונה ב-GitHub הייתה 1.4.0 לעומת גרסה 1.4.1 (ומעלה) ב-npm.

3. הריצו את הבדיקות של החבילה כחלק מתהליך ה-CI שלכם כשאתם משדרגים גרסה לחבילת צד שלישי, בעזרת הפקודה npm test. למשל במקרה של colors ו-faker הבדיקות הללו נכשלות עבור הגרסאות הזדוניות, כמו שאתם יכולים לראות.

הכותב הוא דירקטור מחקר ב-JFrog

כתב אורח

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

הגב

5 תגובות על "איך תוכלו להגן על עצמכם בפעם הבאה שמפתח יחבל בקוד הפתוח שלו"

avatar
Photo and Image Files
 
 
 
Audio and Video Files
 
 
 
Other File Types
 
 
 

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

סידור לפי:   חדש | ישן | הכי מדורגים
צ\'אפק
Guest

עושה הגיון, השיטה הראשונה הכי קלה

אני
Guest

נראה שגיקטיים התחילו להעתיק גם את התגובות

אני
Guest

צריך אוטומציה לזה

עגור
Guest

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

צריך לכתוב איזה סקריפט קטן שעושה את זה, או לחכות שמישהו אחר יכתוב אותו, יקבל 500 טריליון דולר השקעה + דיק פיק אישי מרפפורט, ויהפוך ליוניקורן עם סקריפט של 10 שורות קוד.

לא ידוע
Guest

כתבה מצוינת!

wpDiscuz

תגיות לכתבה: