8.2 - הקשר אבטחה והגבהה - תרגול
תרגול - מחזור החיים של זהות¶
תרגיל ראשון - שלושה מסלולי יציאה¶
שנו את identity.cpp כך שאותה פעולה תוכל להסתיים בהצלחה, לחזור מוקדם או לזרוק חריגה. אחרי כל קריאה הדפיסו שוב את ההקשר. שמרו את שלושת הפלטים והסבירו מי אחראי להפעיל את החזרה לזהות התהליך בכל מסלול.
תרגיל שני - קינון שאינו נתמך¶
נסו ליצור שתי עטיפות self_impersonation באותו scope, אחת אחרי השנייה. צפו מראש איזו בנייה תיכשל, איזה destructor ירוץ ואיזה לא. בדקו שהניסיון הכושל אינו משאיר את ההקשר החיצוני במצב שונה מזה שהיה לפניו.
תרגיל שלישי - מידע על הגבהה¶
כתבו תוכנית נפרדת שפותחת את ה־primary token ומדפיסה את TokenElevationType ואת הערך של TokenIsElevated מתוך TokenElevation. הריצו אותה במסוף הרגיל שלכם. אם יש לכם סביבת מעבדה שבה אפשר לפתוח מסוף מוגבה, השוו גם אליו.
הסבירו מה מותר להסיק מכל שדה ומה אסור להסיק על הרשאה לפעולה מסוימת. אין צורך להוסיף הרשאות או לשנות מדיניות מערכת כדי להשלים את התרגיל.
תרגיל רביעי - עבודה שנודדת בין תהליכונים¶
שירות מתחיל impersonation, מכניס lambda לתור עבודה וחוזר מיד ללקוח. ה־lambda פותחת קובץ כאשר תהליכון אחר ניגש אליה בהמשך. הסבירו מדוע המשתנה המקומי שמחזיק את ה־token אינו מבטיח שהפתיחה תבוצע בשם הלקוח.
הציעו שני תכנונים אפשריים: אחד שפותח את המשאב לפני ההכנסה לתור, ואחד שמעביר לתור הקשר אבטחה עם חוזה בעלות מפורש. בכל תכנון ציינו את הפעולה שדורשת בדיקת הרשאה, את סוף חיי המשאב ואת נקודת הניקוי.