ניצול חולשות בדפדפן ברמה מושגית - איך נראית שרשרת תקיפה טיפוסית¶
כמעט כל דבר שאתם עושים היום במחשב או בטלפון עובר איכשהו דרך דפדפן. קוראים מייל, עובדים מול מערכת בענן, צופים בסרטון, אפילו עורכים מסמכים - הכל רץ בתוך אותו חלון שנפתח בלחיצה אחת. בדיוק בגלל זה הדפדפן הוא אחד היעדים הכי מבוקשים בעולם חקר החולשות, ואני רוצה להסביר במאמר הזה איך בכלל נראית תקיפה נגד דפדפן ברמת מושגים, בלי לרדת לטכניקות ניצול ספציפיות.
למה דפדפנים הם יעד כל כך אטרקטיבי¶
תחשבו על זה מנקודת המבט של תוקף. אתם מחפשים תוכנה שרצה על כמעט כל מכשיר בעולם, שמחוברת לאינטרנט כמעט כל הזמן, ושתפקידה המרכזי הוא לקחת תוכן שמגיע ממקור לא מהימן - כל אתר שאתם נכנסים אליו - ולהריץ אותו על המחשב שלכם. זו בדיוק ההגדרה של דפדפן. הוא לא בוחר איזה קוד JavaScript להריץ, איזו תמונה לפענח או איזה קובץ פונט לטעון. הוא פשוט מעבד את מה שהאתר שולח לו, שוב ושוב, אלפי פעמים ביום.
השילוב הזה של תפוצה עצומה ועיבוד קבוע של תוכן לא מהימן הופך כל חולשה בדפדפן לפוטנציאל בעל ערך גבוה מאוד. חולשה טובה בדפדפן יכולה לפגוע במיליוני משתמשים בלי שהם יעשו שום דבר חריג מלבד לפתוח דף אינטרנט רגיל.
השכבות שיכולות להישבר בתוך הדפדפן¶
דפדפן מודרני הוא לא תוכנה אחת גדולה, אלא ערימה של רכיבים מורכבים שכל אחד מהם מטפל בחלק אחר של הדף. כדי להבין איפה עלולות להיות בעיות, כדאי להכיר בגדול את השכבות המרכזיות.
- מנוע ה-JavaScript. הרכיב שמריץ את הקוד שהאתר שולח. כדי שהוא יהיה מהיר, יש בתוכו מנגנון שנקרא JIT, שמקמפל קוד JavaScript לקוד מכונה תוך כדי ריצה כדי לחסוך זמן. המורכבות הזו, של קומפילציה בזמן אמת, היא בדיוק מה שהופכת את המנוע הזה לאזור עדין מבחינת אבטחה.
- מנוע הרינדור. הרכיב שאחראי לקחת HTML ו-CSS ולהפוך אותם לדף שאתם רואים על המסך, כולל ניהול מבנה ה-DOM, פריסת האלמנטים, וציור הפיקסלים בפועל. גם כאן, המורכבות של לנהל מבנה עץ דינמי שמשתנה כל הזמן פותחת פינות שבהן דברים יכולים להישבר.
- שכבת ה-sandbox. התהליך שמריץ בפועל את התוכן של הדף, ושאמור להיות מוגבל מאוד ביכולות שלו - בלי גישה חופשית לקבצים, לרשת הפנימית, או למשאבי מערכת ההפעלה.
הרעיון של בריחה מהתהליך המוגבל¶
נניח שחוקר או תוקף מצאו חולשה באחת השכבות שתיארתי, למשל במנוע ה-JavaScript. הצלחה כזו, ברוב המקרים, נותנת יכולת להריץ קוד בתוך תהליך התוכן של הדף - מה שנקרא renderer. חשוב להבין שזה עדיין לא "השתלטות על המחשב". תהליך הרינדור בדפדפנים מודרניים רץ בתוך sandbox מוגבל מאוד, בדיוק כדי שגם אם משהו בתוכו נשבר, הנזק יישאר מכולא.
כאן נכנס הרעיון של renderer to sandbox escape - כלומר, הצעד השני בשרשרת התקיפה, שבו התוקף מנסה למצוא דרך לצאת מהתהליך המוגבל אל הרשאות רחבות יותר במערכת ההפעלה עצמה. זה בדרך כלל דורש חולשה נוספת, נפרדת לגמרי מזו הראשונה, במנגנון שאמור לשמור על הגבול בין התהליך המוגבל לשאר המערכת. במילים אחרות, כדי לבצע תקיפה מלאה נגד דפדפן מודרני, לרוב צריך לא חולשה אחת אלא שרשרת שלמה של כמה חולשות שמתחברות זו לזו.
למה דפדפנים בונים ארכיטקטורת ריבוי תהליכים¶
ההבנה של הפרק הקודם היא בדיוק הסיבה שדפדפנים מודרניים עברו לארכיטקטורה של ריבוי תהליכים. במקום תהליך אחד גדול שעושה הכל, יש תהליך ראשי שמנהל את הדפדפן, ותהליכי תוכן נפרדים לכל טאב או אפילו לכל אתר. מנגנון שנקרא site isolation דואג שדפים מאתרים שונים ירוצו בתהליכים נפרדים לגמרי, כך שגם אם אתר זדוני מצליח לנצל חולשה בתהליך שלו, הוא לא יכול פשוט לקרוא זיכרון של אתר אחר שפתוח בטאב סמוך.
זו הגנת עומק קלאסית - לא הנחה שאף חולשה לא תימצא, אלא בנייה של מערכת שבה גם אם חולשה אחת נמצאת, יש עוד שכבות שצריך לשבור לפני שיש נזק אמיתי. זו בדיוק הסיבה שהשתלטות מלאה על מכשיר דרך הדפדפן הפכה עם השנים ליקרה ומורכבת הרבה יותר, ודורשת שילוב של כמה חולשות בו זמנית.
לסיכום¶
הבנת שרשרת התקיפה נגד דפדפן היא בדיוק סוג החשיבה שמייחד חוקר חולשות טוב - לא רק לדעת שקיימת "חולשה בדפדפן", אלא להבין דרך אילו שכבות היא צריכה לעבור כדי להפוך לבעיה אמיתית. מי שרוצה להעמיק בדרך שבה חולשות בודדות הופכות לשרשראת ניצול שלמות, בקורס מחקר חולשות שלי יש בניית יסודות מסודרת בדיוק לכיוון הזה, מהבנת זיכרון ועד לחשיבה על שרשראות תקיפה.
הנושא הזה עמוק ומרתק, ואם אתם רוצים להמשיך לדבר עליו, לשאול שאלות או פשוט להיות בסביבה של אנשים שמתעניינים באותם דברים, זה בדיוק מה שהדיסקורד שלנו נותן.