אימייל 🖼️ ribkhan

אמ;לק: נחשפה פירצת אבטחה חמורה, CVE-2020-36326, בספריית PHPMailer של וורדפרס. מפעילי וורדפררס נדרשים לעדכן לגירסת 5.7.2, שמטליאה את הפירצה // רן לוקאר ונעם רותם

פירצה חמורה שמשפיעה על אתרי וורדפרס נחשפה בימים האחרונים, וסומנה CVE-2020-36326. הפירצה מאפשרת הרצת קוד זדוני, תוך ניצול באג בגרסאות מסויימות של ספריית שליחת האימיילים PHPMailer, וסווגה בציון 9.8/10) מה שמצביע מחד על קלות ניצול ומאידך על רמת סיכון מאוד גבוהה.

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

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

גירסת וורדפרס בממשק הראשי
גירסת וורדפרס בממשק הראשי

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

רעל במעטפה

כדי להבין קצת יותר לעומק את הבעיה, יש להכיר את הדרך שבה PHP ניגש למשאבים חיצוניים. כמו אצלנו בכלי הסייבר-האקינג המשוכלל דפדפן, גם PHP משתמש ב"מעטפות" על מנת להבין את סוג המשאב אליו הוא אמור לגשת. למשל, כאשר אני מקליד בשורת הכתובת בדפדפן את התחילית http:// – הדפדפן יודע שאני מתכוון לטעון משאב בפרוטוקול HTTP. לעומת זאת, אם אתחיל את הקלדת הכתובת אליה אני מבקש לגשת עם ftp://, הדפדפן ידע להפעיל את מעטפת ה-FTP ולהשתמש בפרוטוקול המתאים לצורך התקשורת עם השרת.

PHP עובד בצורה דומה מאוד. על מנת לדעת איזה "מעטפה" עליו להפעיל (Streamwrapper, בפהפית) הוא מפרש את התחילית של הכתובת שאליה הוא אמור לפנות, ולפיה מחליט איזה קוד להריץ. למשל: התחילית file:// תטען קובץ מקומי (וכן, מערכות רבות שמבקשות מכם להכניס כתובת אינטרנט לא בודקות את התחילית הזו, ולכן אפשר לעשות דברים מעניינים עם משחקים סביב הדברים האלה); התחילית zlib:// תפעיל זרם נתונים דחוס, וכן הלאה. רשימה של התחיליות האלה תוכלו למצוא כאן.

אחד מהפרוטוקולים בהם אפשר להשתמש נקרא phar, קיצור של PHP archive, (מאוד דומה ל-JAR של ג'אווה) שזו דרך לקבץ מספר קבצי PHP לחבילה אחת. בקצרה, אם הדרך לכלול קובץ יחיד בקוד PHP מתבצע כך:

include ‘file.php’

אם ברצונכם לכלול מספר קבצים יחד, אפשר לעשות זאת כך:

include ‘phar://my_cool_files.phar’

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

הבעיה מתחילה בדרך שבה PHP עושה את זה. לא ניכנס כאן לאנטומיה של הקומפיילר, כי בשביל זה צריך זקן באורך של לא פחות מ-30 ס"מ, אבל בגדול – אפשר להזריק איזה אובייקט שרוצים למטא-דאטה של החבילה (ה-stub), האובייקט ייטען לקונטקסט של הקוד שהכליל אותו, והופ – השרת שמריץ את הקוד נמצא בידיו האמונות של התוקף.

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

למפתחות שביניכן, הדרך הטובה ביותר להימנע מחשיפה לחולשה כזו היא, כמו תמיד, בדיקה (וסניטציה) של הקלט, ואכן זו גם מהות התיקון שהוכנס ל-PHPMailer. אם אתן מצפות לקבל כתובת או שם של קובץ, בדקו היטב את הפרוטוקול שלה. אם מצפים לקבל כתובת רשת – בידקו את הקלט באמצעות parse_url, למשל, והביטו בסכמה. אם היא שונה מ-http(s) – שלחו את התוקף לצפות בסרטון חינוכי על הטרלות. גם הפעם – הכרה של התקפות היא הדרך הטובה ביותר להתגונן מפניהן.

כמו נוצלה ברוח

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

חיפוש נוצלה כזאת בגיטהאב אתמול, יומיים אחרי חשיפת הפירצה, הביא את הקוד הזה, שמבטיח לנצל את הפירצה. קריאה זהירה של הקוד כאן מראה שמדובר בעצם במלכודת דבש (honeypot) שקוראת קובץ שמתיימר להיות תמונה מאתר, אבל למעשה מכיל javascript, ודורש הרשאות root. אין כאן נזק ממשי, אבל יש כאן לקח חשוב – לא להריץ קוד שהורדתם מהאינטרנט בלי לקרא ולהבין אותו. באותה מידה הקוד שאתם מריצים (עם הרשאות root!) היה יכול להשמיד את המכונה שלכם, כפי שכתוב בהערות.

הערת הרגעה בקוד של CVE-2020-36326 שיצר JamesGeee
הערת הרגעה בקוד של CVE-2020-36326 שיצר JamesGeee

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

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