הקרסת אפליקציה WhatsApp - ITSAFE הכשרות סייבר ואבטחת מידע
במאמר הקודם כתבתי על כלי שפיתחנו בצ'ק פוינט המאפשר לנו לפענח את התעבורה בין WhatsApp Web לטלפון, באמצעות כלי זה ניתן לראות את כל הפרמטרים הנשלחים בתעבורה ולשנות אותם ממש כמו שאנו רגילים בעת מחקר אתר רגיל או אפליקציה.
בבלוג הקודם לינק לבלוג של צ'ק פוינט הצגנו כיצד ניתן לבצע מניפולציה ל-WhatsApp ולהשפיע על הצ'אט בדרכים שונות, בבלוג הזה אנו נציג לכם מחקר חדש הממשיך את המחקר הקודם ומציג כיצד ניתן להקריס למישהו את ה-WhatsApp ולהכניס אותו ל-Crash Loop (כל פתיחה של האפליקציה תוביל לקריסה נוספת).
ליקוי האבטחה דווח ל-WhatsApp באוגוסט 2019 והתיקון הגיע מיד בגרסה 2.19.246 והילך.
לסרטון הדגמה:
מידע טכני אודות ליקוי האבטחה
באוגוסט 2019 העברנו הרצאה בכנס Black Hat Vegas על הפרוטוקול של WhatsApp ואיך ניתן לפענח אותו.
לאחר המחקר החלטנו להמשיך ולפענח חלקים נוספים בקוד וכך הגענו לחלק בקוד שאחראי על מספרי הטלפון בקבוצות ומצאנו ליקוי אבטחה שאיפשר לנו להקריס את כל חברי הקבוצה.
בחלק הזה של הבלוג נסביר לכם כיצד מצאנו את ליקוי האבטחה ומה הייתה החשיבה מאחורי באג זה.
תחילה עלינו לפתוח את ה-WhatsApp Web ולקחת את מפתחות ההצפנה באמצעות ה-Chrome DevTools, את המפתחות אפשר לקבל אם נבצע break point בחלק בו הם נוצרים ופשוט נעתיק אותם לכלי שפיתחנו ל- WhatsApp Protocol Decryption.
לאחר מכן נסרוק את ה-QR Code עם הטלפון וניקח את ה-secret מתוך תעבורת ה-Web Socket שנשלחה לאחר הסריקה של ה-QR Code.
כפי שהסברנו בהרצאה שלנו ב-Black Hat (בקרוב נקליט סרטון בנושא), המידע שנמצא בפרמטר secret משמש אותנו לפענוח ההודעות המוצפנות שנשלחות ב-WhatsApp ובסופו של דבר הוא מכיל את מפתח ה-AES.
לאחר שיש לנו את כל המידע אנו מסוגלים לפענח את התעבורה ולראות את הכל הפרמטרים שעוברים. ניקח הודעה כלשהי שנשלחה בקבוצה ונצפה בפרמטרים בפורמט JSON, מה שיראה כך:
ניתן לראות שיש פה פרמטרים רבים, אחד הפרמטרים המעניינים שאנו רואים הינו participant והוא מכיל את הטלפון של האדם ששלח את ההודעה בקבוצה. אם נשנה את מספר הטלפון לתו a ונשלח את ההודעה נקבל את השגיאה "Null Pointer Exception".
מכיוון שזו שגיאה של Java ולא שגיאת ספריה לא ניתן להשמיש את ליקוי האבטחה להרצת הקוד.
הסתכלנו על הסיבה שבגללה האפליקציה קרסה וראינו שמדובר בשגיאה בפרוטוקול ה-XMPP (Extensible Messaging and Presence Protocol).
השגיאה נראית כך:
ממעבר על ה-Stack Trace ניתן לראות שהשגיאה הינה בפונקציה d.g.ba.ba.run אשר אחראית על ניתוח כל הפרמטרים בהודעה כגון: message id, data, participants וכו'...
עברנו על הקוד האחראי על ניתוח ה-participant, קוד זה מבצע בדיקה על מספרי טלפון המכילים בין 5 ל-20 תווים. אבל מה יקרה אם יהיו לי פחות מ-5 תווים?
הקוד יכניס את הערך null למספר הטלפון ובהמשך ינסה לקרוא את המספר ויקרוס.
במצב סטנדרטי על המשתמש לאמת את מספר הטלפון שלו טרם השימוש ב-WhatsApp.
כך שלכאורה מצב שבו יוזן מספר טלפון לא תקין לא אמור להיות אפשרי, אך יחד עם זאת המתכנתים לא העלו את הסיטואציה בה מישהו יפענח את התעבורה ויתחיל לשחק עם הפרמטרים שנשלחים בעת שליחת הודעה.
הכלי שלנו איפשר לצפות בפרמטרים ולשנות אותם וכך בעצם ניתן היה לשנות את מספר הטלפון לאות c לדוגמה:
ולאחר שליחת ההודעה היא תגיעה בצורה הבאה:
הטלפון לא ידע להתמודד עם מספר טלפון שכזה ופשוט יקרוס אוטומטית עבור כל חברי הקבוצה:
ברגע שתפתחו את ה-WhatsApp בשנית הוא יקרוס שוב ושוב עד אשר תסירו את האפליקציה ותתקינו אותה בשנית, לאחר ההתקנה עליכם להסיר את הקבוצה שבה נמצאת ההודעה שגורמת לקריסה.
משתמשים אשר אינם מגבים את הנתונים עלולים למצוא את עצמם ללא היסטוריית הודעות ותוכן שהיה להם ב-WhatsApp, ובכך לאבד מידע יקר.
נקודה נוספת שיש לציין היא למרות שניתן להקריס רק קבוצות, אין זה מפריע להקריס כל אחד ב-WhatsApp, זאת מכיוון שהתוקף יכול פשוט ליצור קבוצה, להוסיף אתכם ולהקריס לכם את ה-WhatsApp או לחלופין ליצור קבוצה עם כל המטרות שלו ולהקריס את כולם מבלי שילחצו על לינק או יבצעו פעולה כלשהי.
מתעניינים באבטחת מידע? אנחנו מזמינים אתכם לקרוא את הספרים שלנו או להירשם לאחד הקורסים שלנו