מבוא לניצול קרנל לינוקס - כשההגנה האחרונה היא הקרנל עצמו¶
אם ניצול תוכנה רגילה הוא כמו לפרוץ לבית, ניצול קרנל הוא כמו לפרוץ למשרד ניהול הבניין שמחזיק את המפתחות לכל הדירות. זו הסיבה שניצול קרנל לינוקס נחשב לאחד התחומים היוקרתיים והמאתגרים ביותר בעולם מחקר החולשות. בואו נבין למה הוא כל כך שונה, ולמה בכלל שווה להכיר אותו כבר בשלב מוקדם, גם אם עוד לא תתמחו בו.
למה קרנל זה סיפור אחר לגמרי¶
כשמנצלים תוכנה רגילה - נניח שרת רשת פגיע - התוצאה הסופית היא בדרך כלל שליטה על אותו תהליך ספציפי, עם ההרשאות שהיו לו. אם התהליך רץ עם הרשאות משתמש מוגבלות, גם התוקף מוגבל אליהן.
הקרנל שונה מהותית. הוא לא רק עוד תוכנית - הוא השכבה שמנהלת את כל שאר המערכת. הוא זה שמחליט אילו הרשאות יש לכל תהליך, הוא זה שמנהל את הזיכרון של כולם, והוא זה שמתווך את הגישה לחומרה. חולשה בקרנל, בניגוד לחולשה בתוכנה רגילה, לרוב מאפשרת לתוקף לקפוץ ישר להרשאות הגבוהות ביותר במערכת - root, השליטה המלאה.
זו הסיבה שרוב שרשראות הניצול המתוחכמות בעולם האמיתי בנויות בשני שלבים - קודם משיגים דריסת רגל ראשונית בתהליך רגיל עם הרשאות מוגבלות (למשל דרך חולשה בדפדפן), ואז משתמשים בחולשת קרנל כדי "לקפוץ" מהרשאות מוגבלות להרשאות מלאות. השלב השני הזה נקרא privilege escalation.
מה בעצם שונה טכנית¶
הרעיונות הבסיסיים דומים למה שכבר מכירים - גלישת חוצץ, use-after-free, חולשות heap - אבל ההקשר שונה לגמרי:
- אין הפרדה בין "התוקף" ל"קורבן" באותו אופן. בניצול קרנל, אתם בדרך כלל כבר משתמש רגיל במערכת שמנסה להגיע להרשאות גבוהות יותר, לא תוקף חיצוני שמנסה לחדור מבחוץ.
- הזיכרון של הקרנל מנוהל אחרת. יש מנהלי זיכרון ייעודיים לקרנל (כמו slab allocator בלינוקס), שמתנהגים אחרת ממנהל הזיכרון הרגיל של תוכניות ברמת המשתמש, ודורשים הבנה נפרדת.
- ההגנות שונות ומתקדמות יותר. מנגנונים כמו SMEP ו-SMAP מונעים מהקרנל להריץ קוד או לגשת לזיכרון שנמצא בשטח המשתמש, בדיוק כדי לסכל טכניקות ניצול פשוטות שדומות למה שראינו ברמת המשתמש.
- טעות אחת יכולה להפיל את כל המערכת. בניגוד לתוכנית רגילה שקורסת בבידוד, קריסת קרנל (kernel panic) עוצרת את כל המחשב. זה הופך כל שלב בפיתוח ניצול קרנל לזהיר ואיטי הרבה יותר, כי כל ניסיון כושל דורש אתחול מחדש של הסביבה.
איך בכלל מתרגלים דבר כזה בבטחה¶
בגלל שקריסת קרנל משמעה קריסת המחשב כולו, אף אחד לא מתרגל ניצול קרנל ישירות על המחשב הפיזי שלו. הכלי הסטנדרטי הוא הרצת לינוקס בתוך מכונה וירטואלית (בדרך כלל עם QEMU), עם קרנל מותאם אישית שמכיל את החולשה שרוצים לתרגל עליה. אם הניצול נכשל והמערכת קורסת, פשוט מאתחלים את המכונה הוירטואלית מחדש תוך שניות, בלי שום נזק אמיתי.
זו גם דרך העבודה הנפוצה באתגרי CTF בקטגוריית kernel pwn - מקבלים תמונת קרנל, קובץ המכיל את החולשה, וסקריפט שמריץ הכל בתוך QEMU, ומנצלים אותו כדי לקבל הרשאות root בתוך הסביבה המבודדת הזאת.
למה שווה להכיר את זה מוקדם, גם בלי להתמחות בו¶
ניצול קרנל הוא לא נקודת התחלה - הוא אחד הצעדים המתקדמים ביותר במסלול הלמידה, ודורש בסיס איתן בכל מה שלמדתם קודם - זיכרון, C, אסמבלי, ניצול Heap. אבל כבר עכשיו, כדאי להבין שהוא קיים ואיך הוא נראה, כי זה נותן פרספקטיבה על לאן בכלל אפשר להתקדם בתחום. הרבה מהחוקרים הכי מוערכים בעולם מתמחים בדיוק בפינה הזאת - קרנל לינוקס, קרנל וויינדוס, והיפרוויזורים.
איך מתקדמים לשם בפועל¶
הדרך לניצול קרנל עוברת בהכרח דרך שליטה מוצקה בניצול ברמת המשתמש קודם. בקורס מחקר חולשות אנחנו בונים את המסלול בדיוק ככה - מיסודות הזיכרון והחולשות הבסיסיות, דרך ניצול heap מתקדם, ועד להצצה ראשונה לעולם ניצול הקרנל, כדי שתדעו בדיוק לאן להמשיך כשתהיו מוכנים.
תחום הקרנל יכול להרגיש מרוחק ומאיים בהתחלה, וזה בסדר גמור. בדיסקורד שלנו יש חוקרים בשלבים שונים בדרך הזאת, ותמיד שווה לשאול ולראות איך אחרים ניגשים לזה.
לסיכום¶
ניצול קרנל לינוקס הוא הפסגה של עולם ניצול החולשות הבינארי - אותם רעיונות בסיסיים שכבר הכרתם, אבל בהקשר שבו טעות אחת יכולה להפיל מערכת שלמה, וההצלחה משמעה שליטה מלאה עליה. זה לא המקום להתחיל בו, אבל זה בהחלט המקום ששווה לשאוף אליו ככל שהידע שלכם מעמיק.