לדלג לתוכן

מה זה syscall מותאם, ואיך ret2usr עוקף הגנות קרנל

ניצול חולשות ברמת הקרנל (kernel) הוא מהתחומים המתקדמים ביותר במחקר חולשות, בדיוק כי הקרנל הוא הלב הפועם של מערכת ההפעלה - הוא זה שמנהל זיכרון, תהליכים, והרשאות עבור כל תוכנה שרצה על המחשב. כדי להבין מושג מרכזי בעולם הזה, ret2usr, קודם צריך להבין מה זה syscall.

מה זה syscall בקצרה

תוכנית רגילה רצה במצב שנקרא "מצב משתמש" (user mode) - מצב מוגבל, שבו לתוכנית אין גישה ישירה לחומרה או למשאבים רגישים. כשתוכנית צריכה לבצע פעולה שדורשת הרשאות גבוהות יותר - לפתוח קובץ, להקצות זיכרון, לתקשר ברשת - היא קוראת ל"קריאת מערכת" (system call, או syscall בקיצור). זו קריאה מבוקרת שמעבירה את השליטה זמנית ל"מצב קרנל" (kernel mode), שבו הקוד של מערכת ההפעלה מבצע את הפעולה המבוקשת בהרשאות מלאות, ואז מחזיר את השליטה בחזרה למצב המשתמש.

המעבר הזה בין המצבים מוגן היטב, כי אם תוכנית זדונית תצליח לגרום לקוד קרנל להתבצע בלי הפרדה ובקרה נכונה, היא בעצם משיגה שליטה מלאה על המערכת כולה, לא רק על התהליך שלה.

למה חולשות קרנל שונות מחולשות תוכנה רגילה

חולשה בתוכנית רגילה שרצה במצב משתמש, גם אם מנוצלת בהצלחה, בדרך כלל נותנת לתוקף שליטה בהרשאות אותה תוכנית בלבד. חולשה בקוד הקרנל עצמו, לעומת זאת, יכולה לתת שליטה מלאה על כל המערכת - זו הסיבה שמערכות הפעלה משקיעות משאבים עצומים בהגנה על הקוד הזה במיוחד.

מה זה ret2usr

אחת ההגנות המרכזיות במעבדים מודרניים נקראת SMEP (Supervisor Mode Execution Prevention) - מנגנון חומרה שמונע מהמעבד להריץ קוד שנמצא בזיכרון של מצב משתמש, כשהוא נמצא במצב קרנל. ההגנה הזאת נועדה בדיוק כדי למנוע תרחיש נפוץ - תוקף שהצליח להשיג חולשת כתיבה או שליטה על זרימה בתוך הקרנל, ורוצה "לקפוץ" משם לקוד שהוא בעצמו הכין מראש בזיכרון של מצב המשתמש, שבו הרבה יותר קל לשלוט.

ret2usr הוא בדיוק התיאור של המתקפה הזאת - "return to user", לגרום לזרימת ההרצה בקרנל לחזור (לקפוץ) לקוד שנמצא בזיכרון מצב המשתמש. בלי SMEP, זו הייתה דרך נוחה מאוד להשלים ניצול חולשת קרנל - להכין shellcode במצב משתמש, שבו קל לשלוט על תוכן הזיכרון, ולגרום לקרנל הפגיע לקפוץ ישירות אליו עם הרשאות מלאות.

איך SMEP ו-SMAP משנים את התמונה

SMEP חוסם הרצת קוד ממצב משתמש בזמן שהמעבד במצב קרנל. הגנה משלימה בשם SMAP (Supervisor Mode Access Prevention) חוסמת אפילו קריאה וכתיבה רגילה לזיכרון מצב משתמש מתוך מצב קרנל, לא רק הרצה. יחד, ההגנות האלה הופכות ret2usr ישיר לבלתי אפשרי במערכות מודרניות מעודכנות.

התגובה של תוקפים, כצפוי, הייתה להתאים את הטכניקות - במקום לקפוץ לקוד ממצב משתמש, נבנות שרשראות ROP שרצות כולן בתוך קוד הקרנל עצמו (בדיוק כמו ROP רגיל, רק בתוך תמונת הקרנל), שמטרתן הסופית היא לבטל זמנית את ה-SMEP או להעלות הרשאות של התהליך התוקף במקום לקפוץ לקוד חיצוני.

למה syscall מותאם רלוונטי כאן

באתגרי CTF שמתמקדים בניצול קרנל, לעיתים קרובות בונים מודול קרנל מיוחד לצורך האתגר, עם syscall מותאם - קריאת מערכת חדשה שהמתכננים הוסיפו במכוון, ושמכילה בתוכה את החולשה שצריך לנצל. זה מאפשר למתכנני האתגר לבודד חולשה ספציפית ללא הצורך לנצל חולשה אמיתית בקרנל לינוקס עצמו, ונותן לפותרים סביבה בטוחה ומבוקרת ללמוד עקרונות ניצול קרנל.

למה זה שלב מתקדם מאוד

ניצול קרנל דורש בסיס מוצק בכל מה שנלמד קודם - ROP, ניצול heap, והבנה טובה של איך מערכת ההפעלה עצמה בנויה. זה לא תחום להתחיל בו, אלא יעד לשאוף אליו אחרי שהיסודות מוצקים.

בקורס מחקר חולשות אנחנו נותנים מבוא לעקרונות ניצול קרנל רק אחרי שביססנו טוב את כל היסודות של ניצול משתמש רגיל, כי בלי הבסיס הזה קשה מאוד להבין למה טכניקות כמו ret2usr בכלל עובדות.

מתעניינים בעולם ניצול הקרנל ולא בטוחים מאיפה להתחיל? בדיסקורד שלנו יש אנשים שכבר מתקדמים בתחום הזה ויכולים לכוון אתכם.

הצטרפו לקהילה בדיסקורד

לסיכום

ret2usr ממחיש את המשחק המתמשך בין תוקפים למגינים ברמה הכי בסיסית של מערכת ההפעלה - טכניקה שהייתה פשוטה יחסית הפכה למאתגרת בהרבה בזכות הגנות חומרה כמו SMEP ו-SMAP, מה שדוחף תוקפים לפתח גישות מתוחכמות יותר. זהו מבוא קצר לעולם עשיר ומורכב של ניצול חולשות קרנל, שכדאי להכיר גם אם לא צוללים אליו לעומק מיד.