כל הסקריפטים בפוסט הזה הם באדיבותו הרבה של נדב קבלרצ'יק, האיש ועדכוני הפייסבוק, ולמעשה הפוסט לא יכול היה להיכתב בלעדיו. תודה נדב! עליי להדגיש כי כל האמור בפוסט הזה הוא מתוך הבנה שלי את הסבריו של נדב, ויתכן שנפלו שגיאות בהבנותיי אלה. אם אתם מוצאים שגיאות כאלה אשמח מאוד על כל הערה ותיקון. תודה!
אם אתם אדמינים במערכות מוודל שרשמתם באתר Moodle העולמי ולא שיניתם את ברירת המחדל לגבי הודעות דוא"ל ("כן, אנא הודע על נושאים חשובים") גם אתם מקבלים לפעמים דוא"לי עדכון גרסאות המכילים בין השאר עדכוני אבטחה :
ההודעות האלה מודיעות על גרסאות מוודל חדשות, ומפרטות את עדכוני האבטחה שהתבצעו בגרסאות אלה. חשוב לקרוא את הודעות האבטחה מפני שלפעמים ישנן פרצות המוגדרות חמורות. הדואל ממליץ לשדרג לגרסה החדשה המכילה את התיקון, אבל מה נעשה אם אנחנו לא רוצים לשדרג את המערכת? הרי שדרוג מערכת עלול ליצור בעיות לא מעטות ויש לבצע זאת בצורה זהירה ואילו פרצות אבטחה נרצה לתקן מהר. מה עושים?
אם יש לך GIT
במקרה שהקוד של המוודל שלנו מנוהל ב-git ואחד ה-remote-ים שלנו הוא moodle ב-github, נבצע את הצעדים להלן:
- מהסקריפט להלן ניצור אצלנו סקריפט עם סיומת
.shונשמור אותו בתיקיה שמעל לכל התיקיות של התקנות המוודל שלנו (למשל אם כל התקנות המוודל שלנו נמצאות בתיקייתhtml, נשים את הסקריפט בתיקייתhtml). - ניכנס לתיקיית המוודל הרלוונטית.
- נריץ
git fetch. זה יעדכן אצלנו את כל הענפים של המוודל לפי העדכונים שקרו ב-githubשל המוודל, ובתוכם גם ה-commitשל תיקון האבטחה. - נריץ את הסקריפט עם שני פרמטרים:
- הענף בגיטהאב של moodle שממנו יש לקבל את ה-
commit(הענף כמובן יותאם לגרסת המוודל של המערכת שלנו), - ה-MDL הרלוונטי לתיקון האבטחה.
- כך למשל עשויה להיראות קריאה:
sh ../mop_moodle_security_patch_git.sh MOODLE_31_STABLE MDL-57596
- הענף בגיטהאב של moodle שממנו יש לקבל את ה-
זה הסקריפט שיבצע את ההטלאה:
#!/bin/bash # Patch moodle with a security commit. # Parameters: # 1. branch on moodle-org to get the commit from # 2. the MDL issue concerning the issue # Example: # ../mop_moodle_security_patch_git.sh MOODLE_31_STABLE MDL-57596 # Before running this script, 2 prerequisites have to be met: # 0. Go into the relevant moodle folder # 1. Run git fetch # Then run this script (example arguments): # ../mop_moodle_security_patch_git.sh MOODLE_31_STABLE MDL-57596 # Look for a commit message that mentions the MDL issue of the security fix SECURITY_FIX=$(git log moodle-org/$1 --grep=$2) # Get the commit hash so we can cherry pick that commit. # Do so by greping for the string 'commit 0a76cd2ca1c5216d67c9bf7c844020c3b59b1fd7' and then piping the result to cut off the 'commit ' string and stay only with the hash SF_COMMIT=$(echo $SECURITY_FIX | grep -oP 'commit\s([a-z,0-9]*)' | cut -d\ -f2) #echo $SF_COMMIT git cherry-pick $SF_COMMIT
מה הסקריפט עושה
SECURITY_FIX=$(git log <span style="color: #ff0000;">moodle-or</span>g/$1 --grep=$2)– מחפש בָּלוגים של ה-commit-ים של ה-branchשאמרנו לו,commitשבהערה שלו מופיע ה-MDLהנתון ושומר בתור משתנה בשםSECURITY_FIX.
*אם שם ה-alias של ה-remote הוא אחר (לדוגמא: origin), יש להחליף ב-alias המתאים.<strong>SF_COMMIT=$(echo $SECURITY_FIX | grep -oP 'commit\s([a-z,0-9]*)' | cut -d\ -f2)</strong>– כותב את ה-commitהזה ומעביר אותו ל-grepששולף את ה-hashשל ה-commitהזה. שומר את ה-hashבמשתנהSF_COMMIT.<strong>git cherry-pick $SF_COMMIT</strong>– מריץcherry-pick(שזה בחירה שלcommitמ-branchאחד והחלתו עלbranchאחר) עם מספר ה-hashשל ה-commitשמצאנו ומחיל אותו על ה-branchשלנו.
אם אין לך GIT
במקרה שהקוד של המוודל שלנו אינו מנוהל ב-git, אפשר להשתמש בסקריפט הבא כדי להוריד ולהדביק את הטלאי של commit האבטחה המתאים לגרסת מוודל הנוכחית היציבה ל-MDL הספציפי הזה. נעשה זאת ע"י ביצוע הצעדים להלן:
- מהסקריפט להלן ניצור אצלנו סקריפט עם סיומת
.shונשמור אותו בתיקיה שמעל לכל התיקיות של התקנות המוודל שלנו (למשל אם כל התקנות המוודל שלנו נמצאות בתיקייתhtml, נשים את הסקריפט בתיקייתhtml). - ניכנס לתיקיית המוודל הרלוונטית
- נריץ את הסקריפט עם שני פרמטרים (ואפשר גם עם פרמטר שלישי, כמו שאפרט בסעיף 5 של "מה הסקריפט עושה")
- הענף בגיטהאב של moodle שממנו יש לקבל את ה-commit (הענף כמובן יותאם לגרסת המוודל של המערכת שלנו)
- ה-MDL הרלוונטי לתיקון האבטחה.
- כך למשל עשויה להיראות קריאה עם שני פרמטרים:
../get-security-patch-for-moodle.sh MOODLE_31_STABLE MDL-57596 - וכך עשויה להיראות קריאה עם 3 פרמטרים:
<span class="pl-c">../get-security-patch-for-moodle.sh MOODLE_31_STABLE MDL-57596 --dry-run</span>
מה הסקריפט עושה
SECURITY_FIX=$(curl -k1 "https://git.moodle.org/gw?p=moodle.git&a=search&h=$1&st=commit&s=$2")– גולש למאגר הגיט הרשמי של הפרויקטים של מוודל, ומחפש את ה-MDL הנתון ב-branch הנתון. כך למשל נראה המסך כשמחפשים אתMDL-57596בענףMOODLE_31_STABLE:
כמו שניתן לראות, התוצאה היא דף HTML (זה מה שחוזר כתוצאה מפקודת ה-curl), וה-htmlהזה יישמר במשתנהSECURITY_FIX.<strong>SF_COMMIT=$(echo $SECURITY_FIX | grep -oP '<td class="link"><a href="(.*)">commit<\/a>' | grep -oP 'f=\"(.*)\"' | cut -d\" -f2)</strong>
– מחפשים בכל ה-htmlהזה את ה-commitשלנו, והוא נמצא בתוךhrefשל קישור בתא בטבלה:<td class="link"> <a href="/gw?p=moodle.git;a=commit;h=0a76cd2ca1c5216d67c9bf7c844020c3b59b1fd7">commit</a> | <a href="/gw?p=moodle.git;a=commitdiff;h=0a76cd2ca1c5216d67c9bf7c844020c3b59b1fd7">commitdiff</a> | <a href="/gw?p=moodle.git;a=tree;h=682e4f4fd10bc9c5af1326b26b20f7535908ea90;hb=0a76cd2ca1c5216d67c9bf7c844020c3b59b1fd7">tree</a> </td>לכן מריצים
grepעל התוצאה של סעיף 1 ונחפש את הביטוי הרגולרי:'<td class="link"><a href="(.*)">commit<\/a>'
ועל זה מריציםgrepשיבודד רק את מה שנמצא ב-href, שזה קישור יחסי ל-commit:
/gw?p=moodle.git;a=commit;h=0a76cd2ca1c5216d67c9bf7c844020c3b59b1fd7
את הקישור הזה שומרים במשתנהSF_COMMIT.SF_COMMIT_URL=$(echo "https://git.moodle.org".$SF_COMMIT | sed "s/a=commit/a=patch/")
כעת גולשים לקישור ל-commit (למשל בדוגמה שלנו, נגלוש לכאן) ואת התוצאה –html(בדוגמה שלנו: כמו שכאן) – מעבירים ל-sedכדי לחפש את הכתובת של ה-patch, ושומרים אותה במשתנהSF_COMMIT_URLcurl -k1 $SF_COMMIT_URL > "security_fix_$2.patch"
גולשים לכתובת של ה-patch(בדוגמה שלנו, לכאן), ושומרים את התוצאה בקובץpatchמקומי אצלנו.patch -p1 $3 < "security_fix_$2.patch"
השורה הזו מריצה את פקודת ה-patchעל הקובץ שיצרנו כדי שיטליא את המערכת.
שימו לב שיש בו שימוש בארגומנט שלישי, אופציונלי, שניתן להעביר לסקריפט:--dry-run. הארגומנט הזה מאפשר הפעלת התסריט ללא ביצוע הטלאי בפועל, אלא בדיקת התכנות התכנות בלבד, ולכן אפשר ורצוי להפעיל אותו איתו.
דוגמת הפעלה של זה נמצא בשורה 4:
<span class="pl-c">../get-security-patch-for-moodle.sh MOODLE_31_STABLE MDL-57596 --dry-run</span>
עד כאן להפעם, מקווה שתגזרו ותשמרו. אבטחה מעל הכל!

