שם זמני

כל מי שמתכנת, מגיע באיזשהו שלב למצב בו הוא צריך לשמור בצורה זמנית מידע לקובץ. בשביל זה המציאו את הספריות שנועדו לזה בשמות שונים ומשונים.  עד כאן הכל נחמד. הבעיה היא שיש הרבה מאוד בעיות עם שמות הקבצים הזמניים. למשל אם אני אקרא לקובץ temp1.tmp אז אולי יהיה סיכוי שהוא יהיה קיים כבר. אז מה עושים ? ובכן יש כאלו שמספקים את שם ה pid ביוניקס/לינוקס כשם הקובץ. יש כאלו שמספקים את שם אפליקציה עם ה pid, וכאלו שמספקים מספר של השם האחרון הלא קיים מתבנית מסויימת.

העניין הוא שיש בעיה עם הגישות האלו, וזה שאפשר לגרום למצב בו יהיה DoS או גרוע מזה במכונה. בד"כ ניתן לעשות את זה על ידי התקפה שנקראת Symlink Attach, כלומר יוצרים קובץ שהוא symlink לקובץ אמיתי שקיים, ובעצם התוכנה שחושבת שהיא יצרה את הקובץ, כי הרגע היא ראתה שאין קובץ כזה, משכתבת קובץ אמיתי, נגיד init או bash או אם אין לתוכנה הרשאות, בד"כ (אלא אם ציפו למצבים כאלו של חוסר הרשאות בזמן כתיבה) היא תקרוס, ועוד הרבה בעיות, כולל איבוד מידע שמנסים לכתוב אותו.

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

אבל יחסית מאוד קל לפתור את הבעיה, וזה על ידי 4 או 5 מהלכים פשוטים:

  1. קביעת שם רנדומאלי לחלוטין ולהבטיח שהוא לא קיים
  2. לפתוח את הקובץ שאחרים לא יכולים לגעת בו כל עוד הוא פתוח אצלנו (לא תמיד אפשרי)
  3. בפתיחת הקובץ להגיד לAPI שאסור ללכת לsymlink, כך שתהיה כתיבה ישירה לקובץ ולא למסלול שהוא מצביע אליו.
  4. בדיקה האם הקובץ הוא symlink ואם כן, אז לשנות שוב פעם את השם.
  5. לעגן בצורה מיוחדת את ספריות ה tmp (בהתאם לצורך, יכול להיות ספרייה שונה לגמרי), כך שמראש בהגדרת ה mount אי אפשר לעקוב אחרי symlink.

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

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

מחשבה אחת על “שם זמני

  1. Tzafrir Cohen

    שכחת להזכיר איך לבצע את (1) –

    בתוכניות, ע"י קריאה לפונקציה ממשפחת mktemp (אבל אם כותבים ב־C: לא ל־mktemp עצמה. ר' דף ה־man לרשימת חלופות).

    בסקריפטי shell:‏

    tmpfile=`mktemp` || exit 1

    עם משתמשים בהם, לא צריכים את שאר הסעיפים.

    דרך אגב: "בדיקה האם הקובץ הוא XX ואם כן YYY זה מתכון למרוצים (races). שים לב שאם פתחת לכתיבה (ולא append) קובץ שהוא קישור לקובץ אחר, כבר דרסת את תוכנו.

כתיבת תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s