8.1 - זהות והרשאות על אובייקטים - תרגול
תרגול - בדיקת הרשאות¶
בתרגילים נשתמש בתוכנית check.cpp מההרצאה. כל ה־descriptor-ים נוצרים בזיכרון בלבד. אין צורך לשנות הרשאות של תיקיות אמיתיות.
תרגיל ראשון - תחזית לפני הרצה¶
כתבו מראש מה אמור לקרות לבקשות הקריאה, השינוי והבקשה המשולבת עבור כל מדיניות:
הריצו את ארבעת המקרים ושמרו את הפלט. הסבירו בנפרד איזה ביט עדיין מחכה לאישור, איזו רשומה מטפלת בו ומתי אפשר לסיים את הבדיקה. הניחו שהבדיקה מתבצעת עבור משתמש שה־SID של משתמשים מאומתים פעיל ב־token שלו.
תרגיל שני - רשימה ריקה לעומת רשימה חסרה¶
הוסיפו לתוכנית מצב ניסוי שני שבונה descriptor מוחלט עם InitializeSecurityDescriptor, מגדיר בעלים וקבוצה חוקיים ומגדיר DACL מסוג NULL בעזרת SetSecurityDescriptorDacl. אל תשתמשו ב־descriptor כדי ליצור קובץ או אובייקט משותף.
השוו את התוצאה לרשימה הריקה מהתרגיל הראשון. צרפו קוד שמראה היכן נשמרים ה־SID-ים וכמה זמן הם נשארים בחיים. הסבירו מדוע "אין אף כלל שמאשר" ו־"אין רשימת בדיקה" אינם אותו מצב.
תרגיל שלישי - טעות בפירוש הצלחה¶
מפתח שינה את התנאי לפני פעולת כתיבה לקוד הבא:
if (AccessCheck(sd, token, requested, &mapping,
privileges, &bytes, &granted, &allowed)) {
update_record();
}
תנו מקרה שבו הבדיקה התבצעה בהצלחה אבל הכתיבה אינה מורשית. תקנו את הקטע כך שיבדיל בין תקלה בבדיקה, דחייה ואישור. השתמשו במסכה שמבקשת שינוי והראו את שלושת הנתיבים בעזרת descriptor תקין, הרשאה חסרה ו־descriptor שלא מכיל בעלים וקבוצה.
תרגיל רביעי - שם אינו האובייקט¶
שרטטו ציר זמן עבור שירות שבודק הרשאה על שם קובץ, ממתין בתור ואז פותח שוב לפי אותו שם. הכניסו בין הבדיקה לפתיחה שינוי בקישור או החלפה של הקובץ. הציעו תכנון ששומר על זהות המשאב, וציינו מתי נבדקות הרשאות הלקוח בפועל. אין צורך לממש כאן שירות או לבצע שינוי מחוץ לתיקיית מעבדה שלכם.