מה זה ASLR ולמה זה חשוב כל כך בעולם ניצול החולשות¶
אם למדתם קצת על גלישת חוצץ, כבר הבנתם שהרעיון הבסיסי הוא לגרום לתוכנית "לקפוץ" לכתובת שהתוקף בחר. אבל מה קורה אם התוקף בכלל לא יודע איזו כתובת לבחור? זו בדיוק המטרה של הגנה שנקראת ASLR, ואם יש לכם חולשה אבל אין לכם ASLR, יש לכם בעיה גדולה.
מה זה בעצם ASLR¶
ASLR, ראשי תיבות של Address Space Layout Randomization, היא טכניקה שמערכת ההפעלה משתמשת בה כדי לפזר באופן אקראי את המיקומים בזיכרון של חלקים שונים בתוכנית - הסטאק, ה-Heap, וספריות משותפות שהתוכנית טוענת. המשמעות היא שבכל פעם שהתוכנית רצה מחדש, אותם רכיבים בדיוק נמצאים בכתובות זיכרון שונות.
לפני ש-ASLR הפך לסטנדרט, תוכנית הייתה נטענת לאותן כתובות זיכרון בכל פעם, בדיוק. זה הפך את חייו של תוקף לקלים במיוחד - אם גיליתם פעם אחת שכתובת מסוימת מכילה shellcode או gadget שימושי, אותה כתובת בדיוק תעבוד בכל הרצה עתידית, ואפילו על מחשבים אחרים עם אותה תוכנה.
איך ASLR משנה את המשחק¶
עם ASLR מופעל, אותו ניצול שעבד אתמול לא בהכרח יעבוד היום, כי הכתובות פשוט שונות בכל הרצה. תוקף שרוצה לגרום לתוכנית "לקפוץ" לכתובת ספציפית, למשל כתובת של shellcode שהוזרק לסטאק, פשוט לא יודע איזו כתובת לכתוב, כי היא משתנה בכל פעם.
זה לא הופך ניצול לבלתי אפשרי - זה הופך אותו למאתגר יותר. תוקפים פיתחו כמה גישות להתמודד עם ASLR:
- דליפת מידע - Information Leak. אם אפשר לגרום לתוכנית "להדליף" כתובת אמיתית בזיכרון (למשל דרך חולשת מחרוזת פורמט), אפשר לחשב מהכתובת הזאת את כל שאר הכתובות הרלוונטיות, כי המרחקים היחסיים בין רכיבי הזיכרון בדרך כלל קבועים גם כש-ASLR פעיל.
- ניחוש ב-brute force (רק במקרים ספציפיים). במערכות מסוימות, בעיקר 32 ביט שבהן טווח הכתובות האפשריות קטן יחסית, אפשר "לנחש" כתובות על ידי ניסיון חוזר ונשנה. ב-64 ביט, שבו טווח הכתובות עצום, זו גישה כמעט בלתי מעשית.
- ניצול שלא תלוי בכתובת ספציפית. לפעמים אפשר לבנות ניצול חכם שכלל לא צריך לדעת כתובת מדויקת, אלא מנצל התנהגות יחסית בתוכנית.
חשוב להבין - ASLR הוא לא תרופת פלא¶
ASLR מקשה על ניצול, אבל הוא לא סוגר את החולשה עצמה. החולשה עדיין קיימת בקוד - ASLR רק מקשה על הדרך לנצל אותה. זו הסיבה שהוא תמיד מוזכר יחד עם הגנות אחרות כמו NX ו-Stack Canary - כל הגנה סוגרת פינה אחרת, וביחד הן הופכות ניצול חולשה למשימה שדורשת הרבה יותר תחכום ממה שנדרש לפני עשור וחצי.
חשוב גם לציין - ASLR פועל ברמת התהליך ומתאפס בכל הרצה מחדש. יש גם מושג שנקרא PIE (Position Independent Executable), שקשור קרוב ל-ASLR - זו תכונת קומפילציה שמאפשרת גם לקוד התוכנית עצמה (לא רק לספריות שהיא טוענת) להיטען בכתובת אקראית. תוכנית שמקומפלת בלי PIE תמיד תיטען לאותה כתובת קבועה, גם עם ASLR מופעל במערכת - מה שהופך אותה לפגיעה יותר.
למה זה קריטי להבין בשביל מחקר חולשות¶
אתם לא יכולים להיות חוקר חולשות רציני בלי להבין ASLR, כי כמעט כל ניצול מודרני צריך להתמודד איתו בצורה כלשהי. השאלה הראשונה שכל חוקר שואל את עצמו כשהוא ניגש לניצול חולשה היא "איך אני מתמודד עם ASLR כאן?" - וזו בדיוק השאלה שמכוונת את כל אסטרטגיית הניצול, כולל האם צריך למצוא דליפת מידע נוספת רק כדי לעקוף אותו.
בקורס מחקר חולשות אנחנו לא לומדים על ASLR רק כתיאוריה - אנחנו מראים איך ניצול שעובד בלי הגנות מפסיק לעבוד כש-ASLR מופעל, ואיך בונים ניצול שמתמודד איתו נכון, כולל שימוש בדליפות מידע.
יש לכם שאלה למה הניצול שלכם עובד רק לפעמים? כנראה ASLR קשור לזה. תשאלו בדיסקורד שלנו.
לסיכום¶
ASLR הוא אחת ההגנות היעילות והנפוצות ביותר במערכות הפעלה מודרניות, והוא הפך ניצול חולשות ממשימה של "כתוב כתובת קבועה" למשימה של "מצא דרך לדעת או לעקוף כתובת אקראית". הבנה שלו היא לא אופציונלית למי שרוצה לעסוק בניצול בינארי ברצינות - היא חלק בלתי נפרד מכל ניצול מודרני.