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

הרשאות קבצים מציעות חלופה בטוחה לקובצי הפעלה של SUID, אך עשויות להיראות מעט מבלבלות בהתחלה.
כולנו יודעים שזה בינארי הם . למרבה המזל, אם היישום שלך דורש כמה הרשאות מוגבלות, יש דרך יעילה יותר שנקראת .
אני אחסוך לך זמן אם תרצה להימנע מקריאת המאמר לעיל בפירוט: בעיקרו של דבר, הרשאות קבצים מאפשרות תהליכים הפועלים כשורש ולכן מורשים לעשות משהו כדי לשמור על יכולות מסוימות, מוגבלות כאשר הם מורידים הרשאות ומופעלים על ידי משתמש ללא הרשאות. המשמעות היא שאם תוקף יצליח לסכן תהליך באמצעות הצפת חוצץ או ניצול אחר, הוא לא יוכל לנצל שום דבר מלבד הרשאות מינימליות מסוימות שהתהליך צריך בפועל.
הרשאות הן נהדרות עבור שירותים, שבדרך כלל תמיד פועלים כ-root, אבל מה לגבי כלי עזר בשורת הפקודה? למרבה המזל, גם זה נתמך, בתנאי שהתקנתם את כלי העזר הנכונים. אם אתם משתמשים Ubuntuלדוגמה, תצטרכו חבילה libcap2-bin. תצטרך גם להפעיל ליבה לא ארכאית (מהגרסה 2.6.24).
פונקציות אלו מאפשרות לשייך הרשאות לקבצי הפעלה, בדומה להגדרת סיבית SUID, אך רק עבור קבוצה מסוימת של הרשאות. תוֹעֶלֶת setcap משמש להוספה והסרה של הרשאות מקובץ.
השלב הראשון הוא לבחור את ההרשאות הדרושות לך. לצורך מאמר זה, אני מניח שיש כלי אבחון רשת בשם tracewalk, שאמור להיות מסוגל להשתמש . זה בדרך כלל מחייב את האפליקציה להיות מופעלת כשורש, אבל בזמן הצפייה מסתבר שנדרש רק אישור CAP_NET_RAW.
בהנחה שאתה נמצא בספרייה שבה נמצא הבינארי tracewalk, אתה יכול להוסיף הרשאה זו כך:
sudo setcap cap_net_raw=eip tracewalk התעלם מהסיומת לעת עתה =eip לפתרון, אני אדבר על זה בעוד כמה שניות. שימו לב ששם ההרשאה באותיות קטנות. כעת תוכל לבדוק אם הגדרת את ההרשאות בצורה נכונה באמצעות:
setcap -v cap_new_raw=eip tracewalkאו שאתה יכול לרשום את כל ההרשאות שהוגדרו עבור קובץ הפעלה נתון:
getcap tracewalk
לעיון, אתה יכול גם להסיר את כל ההרשאות מקובץ ההפעלה באמצעות:
setcap -r tracewalkבשלב זה, אתה אמור להיות מסוגל להפעיל את קובץ ההפעלה כמשתמש חסר הרשאות, והוא אמור להיות מסוגל לעבוד עם sockets גולמיים, אך לא להיות בעל אף אחת מההרשאות האחרות שיש למשתמש השורש.
אז מה המשמעות של הסיומת המוזרה הזו? =eip? זה דורש הבנה מסוימת של אופי ההרשאות. לכל תהליך יש שלוש קבוצות של הרשאות - יעיל, תורשה ומותר:
- יָעִיל הרשאות הן אלו שמגדירות מה תהליך יכול לעשות בפועל. לדוגמה, זה לא יכול להתמודד עם שקעים גולמיים אם
CAP_NET_RAWאינו בסט האפקטיבי. - זמין ההרשאות הן אלה שמותר לתהליך לקבל אם הוא מבקש אותן באמצעות הקריאה המתאימה. הם מונעים מתהליך לעשות משהו, אלא אם כן הוא נכתב במפורש כדי לבקש רשות כאמור. זה מאפשר לכתוב תהליכים כדי להוסיף הרשאות קריטיות לסט האפקטיבי רק לתקופה שבה הן נדרשות בפועל.
- עוֹבֵר בִּירוּשָׁה ההרשאות הן אלה שניתן להוריש בקבוצה הנגישה של תהליך הילד שהולידה. במהלך הניתוח
fork()אוclone()תהליך הצאצא מקבל תמיד עותק של הרשאות תהליך האב מכיוון שהוא עדיין מפעיל את אותו קובץ הפעלה בשלב זה. סט בירושה משמש כאשרexec()(או שווה ערך) נקרא להחליף את קובץ ההפעלה בקובץ אחר. בשלב זה, הסט הזמין של התהליך מוסווה על ידי הסט הניתן בירושה כדי להשיג את הסט הנגיש שישמש לתהליך החדש.
אז השירות setcap מאפשר לנו להוסיף את ההרשאות של שלוש הקבוצות הללו באופן עצמאי עבור קובץ הפעלה נתון. שים לב שהמשמעות של קבוצות מתפרשת מעט שונה עבור הרשאות קובץ:
- זמין הרשאות קובץ הן אלה שתמיד זמינות לקובץ הפעלה, גם אם לתהליך האב שקרא לו לא היו אותן. פעם קראו להם היתרים "כפויים".
- ירש הרשאות קובץ מגדירות מסיכה נוספת שניתן להשתמש בה גם כדי להסיר הרשאות מהסט של תהליך ההתקשרות. הם חלים בנוסף לסט שעבר בירושה של תהליך ההתקשרות, כך שההרשאה עוברת בירושה רק אם היא קיימת בשני הסטים.
- יָעִיל הרשאות קבצים הן למעשה רק סיביות בודדת, לא קבוצה, ואם מוגדרות, זה אומר שכל הסט הזמין מועתק גם לסט האפקטיבי של התהליך החדש. זה יכול לשמש כדי להוסיף הרשאות לתהליכים שלא נכתבו במיוחד כדי לבקש אותם. מכיוון שזה ביט אחד, אם אתה מגדיר אותו עבור הרשאה כלשהי, הוא חייב להיות מוגדר עבור כל ההרשאות. אתה יכול לחשוב על זה כחלק מדור קודם מכיוון שהוא משמש כדי לאפשר שימוש בהרשאות על ידי אפליקציות שאינן תומכות בהן.
בעת ציון הרשאות באמצעות setcap שלוש אותיות e, i и p להתייחס יעיל, תורשתי ונגיש סטים בהתאמה. אז המפרט הקודם:
sudo setcap cap_net_raw=eip tracewalk ...מציין שהרזולוציה CAP_NET_RAW יש להוסיף לסטים הזמינים והניתנים להורשה ושיש להגדיר גם את הביט האפקטיבי. פעולה זו תעקוף את כל ההרשאות שהוגדרו בעבר בקובץ. כדי להגדיר הרשאות מרובות בו-זמנית, השתמש ברשימה מופרדת בפסיקים:
sudo setcap cap_net_admin,cap_net_raw=eip tracewalkדן בכל זה בפירוט רב יותר, אבל אני מקווה שהפוסט הזה הביא קצת להעלמת מה שקורה. נותרו רק כמה אזהרות וטריקים להזכיר.
ראשית, יכולות הקבצים אינן עובדות עם סימלינקים - עליך להחיל אותן על הקובץ הבינארי עצמו (כלומר היעד של הקישור הסמלי).
שנית, הם לא עובדים עם תסריטים מפורשים. לדוגמה, אם יש לך סקריפט של Python שברצונך להקצות לו הרשאה, עליך להקצות אותו למפרש Python עצמו. ברור שזו בעיית אבטחה פוטנציאלית מכיוון שאז כל הסקריפטים שיבוצעו עם אותו מתורגמן יהיו בעלי ההרשאה שצוינה, אם כי זה עדיין טוב משמעותית מהפיכתו ל-SUID. נראה שהפתרון הנפוץ ביותר הוא לכתוב קובץ הפעלה נפרד ב-C או שווה ערך שיכול לבצע את הפעולות הדרושות ולקרוא לו מתוך סקריפט. זה דומה לגישה שבה משתמש Wireshark המשתמשת בבינארי /usr/bin/dumpcap כדי לבצע פעולות מורשות:
$ getcap /usr/bin/dumpcap
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip שלישית, הרשאות קובץ מושבתות אם אתה משתמש במשתנה סביבה LD_LIBRARY_PATH מסיבות ביטחוניות ברורות(1). הַהוּא הַדִין LD_PRELOAD, עד כמה שאני יודע.
1. מכיוון שתוקף יכול כמובן להחליף את אחת מהספריות הסטנדרטיות ולהשתמש LD_LIBRARY_PATHלאלץ לקרוא את הספרייה שלו בהעדפה למערכת אחת, ולכן יש להפעיל קוד שרירותי משלה עם אותן הרשאות כמו היישום המתקשר.
זה הכל. פרטים נוספים על תכנית הקורס ניתן למצוא בכתובת
מקור: www.habr.com
