מתקפות ערוץ צדדי מוסברות - Spectre ו-Meltdown¶
רוב הפעמים שאנחנו חושבים על חולשת אבטחה, אנחנו מדמיינים באג לוגי - שורת קוד שבודקת משהו לא נכון, או פונקציה ששוכחת לבדוק גבול. אבל יש קטגוריה שלמה של חולשות שלא עובדת ככה בכלל, ושהזעזעה את עולם המחשוב לפני כמה שנים כשהתגלו Spectre ו-Meltdown. מדובר במתקפות ערוץ צדדי, ובמאמר הזה אני רוצה להסביר מה זה בכלל אומר, ברמה מושגית לגמרי בלי להיכנס לפרטים טכניים עמוקים.
מה זה בכלל מתקפת ערוץ צדדי¶
מתקפת ערוץ צדדי, side-channel attack, היא דרך להסיק מידע סודי לא דרך ניצול ישיר של באג בלוגיקה של התוכנית, אלא דרך תופעות לוואי פיזיות של המערכת שמריצה אותה. במקום לשאול את המערכת "תן לי את הסוד", התוקף צופה בהתנהגות שלה מהצד - כמה זמן לקחה פעולה מסוימת, כמה חשמל נצרך, כמה רעש נוצר - ומנסה להסיק מהתבניות האלה מידע שאמור היה להישאר חסוי.
הדוגמה הפשוטה ביותר להבנה היא עיתוי. תארו לעצמכם מערכת שבודקת סיסמה תו אחר תו, ועוצרת ברגע שהיא מוצאת תו שגוי. אם הבדיקה של כל תו לוקחת זמן קטן אך מדיד, אז ניסיון עם התו הראשון הנכון ייקח קצת יותר זמן מניסיון שבו כבר התו הראשון שגוי. תוקף שמודד את הזמן בדייקנות יכול לנחש את הסיסמה תו אחרי תו, בלי לנצל שום באג לוגי - רק על ידי תצפית על משך הזמן. זה בדיוק הרעיון המרכזי מאחורי כל משפחת המתקפות הזו, רק שברמת המעבד עצמו הדברים הרבה יותר עדינים.
הרעיון של speculative execution¶
כדי להבין למה Spectre ו-Meltdown היו כל כך משמעותיים, צריך להבין מנגנון בסיסי שקיים בכל מעבד מודרני, שנקרא speculative execution, או ביצוע ספקולטיבי. מעבדים היום מהירים בצורה מדהימה, אבל כדי להיות מהירים כל כך, הם לא פשוט מבצעים פקודה אחת אחרי השנייה בסדר. הם מנסים "לנחש קדימה" מה סביר שיקרה בהמשך, ומתחילים לבצע את הפקודות הבאות עוד לפני שהם בטוחים שבאמת יגיעו אליהן.
למשל, אם יש בקוד תנאי מסוג "אם X אז בצע פעולה A, אחרת בצע פעולה B", המעבד לא תמיד מחכה לדעת בוודאות אם X נכון או לא. הוא מנחש, בהתבסס על היסטוריית ריצה קודמת, ומתחיל לבצע כבר את הפעולה הסבירה יותר. אם הניחוש היה נכון, חסכו זמן יקר. אם הניחוש היה שגוי, המעבד פשוט זורק את התוצאות של הניחוש השגוי ומתקן את המצב, כאילו כלום לא קרה - מבחינת התוצאה הסופית של התוכנית, זה נראה תקין לגמרי.
איפה הדליפה קורית בפועל¶
הבעיה היא שגם כשהניחוש מבוטל, הוא כן משאיר עקבות - לא בתוצאה עצמה, אלא בתופעות לוואי פיזיות של המערכת, ובעיקר במטמון, ה-cache. במהלך הביצוע הספקולטיבי, המעבד עשוי לגשת לזיכרון בהתאם לניחוש שלו, ובכך "לחמם" את המטמון עם נתונים מסוימים. גם אחרי שהניחוש בוטל וכל התוצאות הלוגיות שלו נמחקו, העובדה שנתון מסוים כבר נמצא במטמון נשארת.
וזה בדיוק המנגנון שמתקפות כמו Spectre ו-Meltdown ניצלו - תוקף יכול למדוד כמה זמן לוקח לגשת לכתובות זיכרון שונות. גישה לנתון שכבר נמצא במטמון מהירה משמעותית מגישה לנתון שצריך להביא מהזיכרון הראשי. על ידי מדידה עדינה של זמני גישה כאלה, אחרי שגרמו למעבד לבצע ניחוש ספקולטיבי שנוגע בעקיפין למידע סודי, אפשר להסיק סיביות של מידע שהמעבד מעולם לא היה אמור לחשוף, גם אם ברמת התוצאה הלוגית שום דבר "אסור" לא קרה.
למה זה היה כל כך משמעותי¶
הסיבה ש-Spectre ו-Meltdown זעזעו את התעשייה כולה, ולא רק חברה אחת, היא שהבעיה לא הייתה באג בתוכנה ספציפית או במוצר של יצרן אחד. הבעיה נבעה ממנגנון בסיסי - הביצוע הספקולטיבי - שקיים כמעט בכל מעבד מודרני מאז שנות האלפיים, בדיוק כי הוא הכרחי לביצועים הגבוהים שכולנו מצפים להם. זה הפך את הבעיה למשהו שנוגע כמעט לכל מחשב, שרת וטלפון בעולם בו זמנית, ודרש תיקונים בו זמנית ברמת מערכת ההפעלה, הדפדפנים, ואפילו התכנון של מעבדים עתידיים.
זו גם הסיבה שמתקפות ערוץ צדדי נחשבות כל כך מרתקות לחקור - הן מזכירות לנו שאבטחה היא לא רק עניין של קוד נכון או שגוי, אלא גם של איך החומרה עצמה מתנהגת בפועל, ברמה שקוד רגיל אפילו לא "רואה".
לסיכום¶
מתקפות ערוץ צדדי מלמדות אותנו שלפעמים הדליפה הכי מסוכנת היא לא במה שהמערכת עונה, אלא בכמה זמן היא לוקחת כדי לענות. מי שרוצה להעמיק בסוג הזה של חשיבה אנליטית שמאפיינת חוקרי חולשות, בקורס מחקר חולשות שלי אפשר לבנות את הבסיס הדרוש להבין גם את השכבות העמוקות והפחות אינטואיטיביות האלה של המערכת.
אם הנושא הזה סקרן אתכם, יש לנו קהילה שלמה שאוהבת לצלול בדיוק לתחומים כאלה.