כל הסקריפטים בפוסט הזה הם באדיבותו הרבה של נדב קבלרצ’יק, האיש ועדכוני הפייסבוק, ולמעשה הפוסט לא יכול היה להיכתב בלעדיו. תודה נדב! עליי להדגיש כי כל האמור בפוסט הזה הוא מתוך הבנה שלי את הסבריו של נדב, ויתכן שנפלו שגיאות בהבנותיי אלה. אם אתם מוצאים שגיאות כאלה אשמח מאוד על כל הערה ותיקון. תודה!
אם אתם אדמינים במערכות מוודל שרשמתם באתר 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_URL
curl -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>
עד כאן להפעם, מקווה שתגזרו ותשמרו. אבטחה מעל הכל!