-
-
@nigun
יש מוסכמה, שמי שמריץ את התוכנה שם ב-argv[0]
את השם של הקובץ של התוכנה, כלומר אם אתה מריץpkexec
מתוךbash
אזbash
(בתור תוכנה שמכבדת את המוסכמה הזו) תכניס את המילהpkexec
ב-argv[0]
.אבל חשוב להבין שזו רק מוסכמה. אין משהו שמחייב את זה. אפשר להכניס שם מחרוזת אקראית, או אפשר להכניס שם null pointer שמסמן את סוף מערך ה-argv.
ניצול החולשה מסתמכת על זה שהכנסת שם הקובץ הוא אופציונאלי.
אגב, משהו מעניין,
יש הרבה פקודות שמנצלים מוסכמה זו כדי שתוכל לקבל התנהגויות שונות מאותה פקודה, ההתקנה של הפקודה מתקינה כמה קישורים לאותו קובץ (hardlinks) ולכל אחד שם שונה, והפקודה מחליטה לפי השם ב-
argv[0]
איך להתנהג.
דוגמה לזה הוא busybox -
@musicode אתה מתייחס למילים אלו שלי:
אחד מהתפקידים המרכזיים של מערכת הפעלה, זה לנהל את הגישה למשאבים משותפים.
אסביר את כוונתי:
כל משאב שהוא לא ייחודי לתהליך זה, אלא משותף בין כל התהליכים.
למשל דיסק הקשיח (או קבצים ששוכנים עליו), המסך, כרטיס הרשת, ובעצם רוב החומרה של המחשב.
דוגמה יחידה של משאב לא משותף שאני מצליח לחשוב עליה, זה זכרון הראם, כי לכל תהליך יש מרחב זיכרון משלה. לכן גישה לזכרון הראם לא חייבת את גישור מערכת ההפעלה. (הנושא לא כל כך שחור/לבן כי יש איזשהו התערבות של מערכת ההפעלה, אבל זה כבר גולש לנושאים אחרים...)מקווה שזה יותר ברור עכשיו. תודה על ההערה.
-
@צדיק-תמים החולשה קיימת בתוכנה שנכתבה בשפת C. שפת C היא שפה "לא בטוחה". מה שזה אומר לענינינו הוא שאין בדיקות בסביבת הריצה אם גלשת מעבר לסוף מערך. לכן מה שהתחיל כבאג (גלישה מעבר לסוף המערך) הפך לחולשה (אפשרות להזריק משתנה סביבה מסוכנת) ואקספלויט (שמאפשר קבלת הראשות רוט).
בשפה אחרת (למשל JS, אומנם JS לא מתאים לתוכנות מסוג זה, אבל יש שפות בטוחות אחרות שמתאימים, בראשם RUST), הבאג היה נשאר באג, ומה שהיה קורה היה או (במקרה הכי טוב) שגיאה בזמן הידור או שגיאה בזמן ריצה.
-
610 path = g_strdup (argv[n]); ... 629 if (path[0] != '/') 630 { ... 632 s = g_find_program_in_path (path); ... 639 argv[n] = path = s;
שורה 639 מכניס את המצביע למחרוזת החדשה שהוחזרה על ידי
g_find_program_in_path
לתוךargv[n]
שכנתבאר נמצא ב-envp[0]
-