ניתוח חולשת PwnKit (תגובות)
-
כאן ניתן להגיב על מאמר זה
-
yossiz
-
@yossiz פשוט מדהים!
אומרים שמי שלא מצליח בעבודה שלו, מתחיל למסור קורסים של המקצוע...
אז אני לא רוצה להציע לך לעשות הסבת מקצוע... -
לא הבנתי מה נמצא ב
argv[0]
כשאני מריץpkexec
בשורת הפקודה בלי פרמטר -
@nigun אמר בניתוח חולשת PwnKit (תגובות):
לא הבנתי מה נמצא בargv[0] כשאני מריץ pkexec בשורת הפקודה בלי פרמטר
שם הקובץ.
-
@www
איזה? pkexec? -
@nigun אמר בניתוח חולשת PwnKit (תגובות):
pkexec
כן.
ככה זה בכל קובץ שאתה מריץ.
אתה כותב בשורת הפקודה:filname arg1 arg2
מתקבל מערך:
{ 0: filname, 1: arg1, 2: arg2 }
-
@nigun
יש מוסכמה, שמי שמריץ את התוכנה שם ב-argv[0]
את השם של הקובץ של התוכנה, כלומר אם אתה מריץpkexec
מתוךbash
אזbash
(בתור תוכנה שמכבדת את המוסכמה הזו) תכניס את המילהpkexec
ב-argv[0]
.אבל חשוב להבין שזו רק מוסכמה. אין משהו שמחייב את זה. אפשר להכניס שם מחרוזת אקראית, או אפשר להכניס שם null pointer שמסמן את סוף מערך ה-argv.
ניצול החולשה מסתמכת על זה שהכנסת שם הקובץ הוא אופציונאלי.
אגב, משהו מעניין,
יש הרבה פקודות שמנצלים מוסכמה זו כדי שתוכל לקבל התנהגויות שונות מאותה פקודה, ההתקנה של הפקודה מתקינה כמה קישורים לאותו קובץ (hardlinks) ולכל אחד שם שונה, והפקודה מחליטה לפי השם ב-
argv[0]
איך להתנהג.
דוגמה לזה הוא busybox -
מה הכוונה "משאבים משותפים"?
-
@musicode אתה מתייחס למילים אלו שלי:
אחד מהתפקידים המרכזיים של מערכת הפעלה, זה לנהל את הגישה למשאבים משותפים.
אסביר את כוונתי:
כל משאב שהוא לא ייחודי לתהליך זה, אלא משותף בין כל התהליכים.
למשל דיסק הקשיח (או קבצים ששוכנים עליו), המסך, כרטיס הרשת, ובעצם רוב החומרה של המחשב.
דוגמה יחידה של משאב לא משותף שאני מצליח לחשוב עליה, זה זכרון הראם, כי לכל תהליך יש מרחב זיכרון משלה. לכן גישה לזכרון הראם לא חייבת את גישור מערכת ההפעלה. (הנושא לא כל כך שחור/לבן כי יש איזשהו התערבות של מערכת ההפעלה, אבל זה כבר גולש לנושאים אחרים...)מקווה שזה יותר ברור עכשיו. תודה על ההערה.
-
@yossiz אמר בניתוח חולשת PwnKit:
תשתמשו בשפות בטוחות. בשפה אחרת באג זה היה נשאר באג, ולא היה מגיע לכדי חולשה.
לא הבנתי, זה שזה הגיע לחולשה זה מעלה או חיסרון? ובאיזה שפה מדובר פה? סליחה על הבורות.
-
@צדיק-תמים החולשה קיימת בתוכנה שנכתבה בשפת C. שפת C היא שפה "לא בטוחה". מה שזה אומר לענינינו הוא שאין בדיקות בסביבת הריצה אם גלשת מעבר לסוף מערך. לכן מה שהתחיל כבאג (גלישה מעבר לסוף המערך) הפך לחולשה (אפשרות להזריק משתנה סביבה מסוכנת) ואקספלויט (שמאפשר קבלת הראשות רוט).
בשפה אחרת (למשל JS, אומנם JS לא מתאים לתוכנות מסוג זה, אבל יש שפות בטוחות אחרות שמתאימים, בראשם RUST), הבאג היה נשאר באג, ומה שהיה קורה היה או (במקרה הכי טוב) שגיאה בזמן הידור או שגיאה בזמן ריצה.
-
pkexec תיקח תוצאה זו ותכניס אותה חזרה ל... משתנה הסביבה הראשונה. יוצא שהצלחנו להזריק משתנה הסביבה לא בטוחה לתוך התהליך. משתנה הסביבה נראית כך עכשיו: GCONV_PATH=./xxx:.
לא הבנתי למה?
-
@www על איזה חלק בדיוק אתה שואל?
-
@yossiz אמר בניתוח חולשת PwnKit (תגובות):
@www על איזה חלק בדיוק אתה שואל?
איפה ראינו שהוא מחזיר את התוצאה למשתנה הסביבה הראשון?
-
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]