8.7 קוד בטוח פתרון
בתוכנית זו, הפונקציה read_file קוראת את התוכן של קובץ שצוין על ידי המשתמש. עם זאת, שם הקובץ מועבר ישירות למחרוזת ללא שום בדיקה, מה שהופך את התוכנה לפגיעה להזרקת פקודות שרירותית והרצת קוד.
השמשת החולשה¶
- בקוד יש את החלק הבא:
- כאשר אנחנו יכולים לשלוט על file_name, משמע אפשר להסתכל על הקוד גם כך:
- אם אנחנו יכולים לשלוט על חלק במחרוזת שיעובר לos.system, זה אומר שקלט שאנחנו כותבים מעובר לos.system.
אני מזכיר: os.system מאפשר לנו להריץ איזה פקודת טרמינל שנרצה.
נניח ונרצה להריץ את הפקודת טרמינל: dir, שמראה לנו קבצים בתקייה, לא נוכל פשוט לכתוב את הפקודה בגלל שכבר כתוב type, בתחילת המחרוזת וזה יצור שגיאה. אז מה נוכל לעשות? - נשאל שאלה, כיצד אנחנו יכולים לכתוב פקודת טרמינל שמריצה שני פקודות? (למשל type ואחרכך dir?) - לאחר חיפוש באינטרנט מצאנו שיש סימן מיוחד בטרמינל שנראה כך
;, הוא מאפשר לנו ממש להריץ שני פקודות:
- הריצו את זה בטרמינל שלכם, נראה שזה עובד. אם נוכל לגרום לתוכנה להריץ שורה דומה לכך, נוכל להחדיר הרצה של פקודת dir לתוכנה.
- לפי הקוד, כדי לגרום לסיטואציה כזו לקרות, נוכל להחדיר את השורה הבאה לקלט שלנו:
כך שזה יראה ממש כך:
- עבד, הרצנו פקודת טרמינל לבחירתנו באמצעות התוכנת פייתון.
נקודה חשובה¶
- גרמנו לקוד פייתון שעל המחשב שלנו להריץ כל פקודת טרמינל שנרצה, אבל במקרה הזה זה לא חולשה שימושית בגלל שבכל מקרה יכלנו פשוט לפתוח את הטרמינל על המחשב שלנו ולהריץ את הפקודות האלו.
- אבל דמיינו שהקוד הזה היה נמצא באתר מרוחק, כמו גוגל לדוגמה. והיינו יכולים להשתמש בחולשה הזו כדי להריץ פקודות מרוחקות על גוגל, או במילים אחרות - יכלנו לשלוט בשרת שעליו רץ גוגל. החולשה הזו נקראת RCE - קיצור של remote code execution, או בעברית: הרצת קוד מרוחקת, כי החולשה הזו מאפשרת לנו להריץ קוד בצורה מרוחקת על השרת של גוגל.
- הרצת קוד מרוחקת על האתר של גוגל יכולה להוביל להשבתה יזומה של האתר, הדלפה של המון סיסמאות ופרטיים אישיים של אנשים מהDB, ועוד המון כאב ראש. ובגלל זה גוגל ועוד המון חברות עובדות מאוד קשה לאבטח את המוצרים שלהם, לכתוב קוד מאובטח, ולשכור מתכנתים שיודעים את העבודה.
!כתבו קוד מאובטח
מניעת החולשה¶
כדי להמנע מהחולשה עלייך להמנע מהפונקציה system בשביל להדפיס קבצים. במקרה הזה אפשר להשתמש בpathlib כדי לקרוא את הקובץ.
תיקון: