שבט

הטלאת מוודל בטלאי אבטחה

כל הסקריפטים בפוסט הזה הם באדיבותו הרבה של נדב קבלרצ’יק, האיש ועדכוני הפייסבוק, ולמעשה הפוסט לא יכול היה להיכתב בלעדיו. תודה נדב! עליי להדגיש כי כל האמור בפוסט הזה הוא מתוך הבנה שלי את הסבריו של נדב, ויתכן שנפלו שגיאות בהבנותיי אלה. אם אתם מוצאים שגיאות כאלה אשמח מאוד על כל הערה ותיקון. תודה!

אם אתם אדמינים במערכות מוודל שרשמתם באתר Moodle העולמי ולא שיניתם את ברירת המחדל לגבי הודעות דוא”ל (“כן, אנא הודע על נושאים חשובים”) גם אתם מקבלים לפעמים דוא”לי עדכון גרסאות המכילים בין השאר עדכוני אבטחה :

ההודעות האלה מודיעות על גרסאות מוודל חדשות, ומפרטות את עדכוני האבטחה שהתבצעו בגרסאות אלה. חשוב לקרוא את הודעות האבטחה מפני שלפעמים ישנן פרצות המוגדרות חמורות. הדואל ממליץ לשדרג לגרסה החדשה המכילה את התיקון, אבל מה נעשה אם אנחנו לא רוצים לשדרג את המערכת? הרי שדרוג מערכת עלול ליצור בעיות לא מעטות ויש לבצע זאת בצורה זהירה ואילו פרצות אבטחה נרצה לתקן מהר. מה עושים?

אם יש לך GIT

במקרה שהקוד של המוודל שלנו מנוהל ב-git ואחד ה-remote-ים שלנו הוא moodle ב-github, נבצע את הצעדים להלן:

  1. מהסקריפט להלן ניצור אצלנו סקריפט עם סיומת .sh ונשמור אותו בתיקיה שמעל לכל התיקיות של התקנות המוודל שלנו (למשל אם כל התקנות המוודל שלנו נמצאות בתיקיית html, נשים את הסקריפט בתיקיית html).
  2. ניכנס לתיקיית המוודל הרלוונטית.
  3. נריץ git fetch. זה יעדכן אצלנו את כל הענפים של המוודל לפי העדכונים שקרו ב-github של המוודל, ובתוכם גם ה-commit של תיקון האבטחה.
  4. נריץ את הסקריפט עם שני פרמטרים:
    1. הענף בגיטהאב של moodle שממנו יש לקבל את ה-commit (הענף כמובן יותאם לגרסת המוודל של המערכת שלנו),
    2. ה-MDL הרלוונטי לתיקון האבטחה.
    3. כך למשל עשויה להיראות קריאה:
      sh ../mop_moodle_security_patch_git.sh MOODLE_31_STABLE MDL-57596

זה הסקריפט שיבצע את ההטלאה:

#!/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

מה הסקריפט עושה

  1. 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 המתאים.
  2. <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.
  3. <strong>git cherry-pick $SF_COMMIT</strong> – מריץ cherry-pick (שזה בחירה של commit מ-branch אחד והחלתו על branch אחר) עם מספר ה-hash של ה-commit שמצאנו ומחיל אותו על ה-branch שלנו.

אם אין לך GIT

במקרה שהקוד של המוודל שלנו אינו מנוהל ב-git, אפשר להשתמש בסקריפט הבא כדי להוריד ולהדביק את הטלאי של commit האבטחה המתאים לגרסת מוודל הנוכחית היציבה ל-MDL הספציפי הזה. נעשה זאת ע”י ביצוע הצעדים להלן:

  1. מהסקריפט להלן ניצור אצלנו סקריפט עם סיומת .sh ונשמור אותו בתיקיה שמעל לכל התיקיות של התקנות המוודל שלנו (למשל אם כל התקנות המוודל שלנו נמצאות בתיקיית html, נשים את הסקריפט בתיקיית html).
  2. ניכנס לתיקיית המוודל הרלוונטית
  3. נריץ את הסקריפט עם שני פרמטרים (ואפשר גם עם פרמטר שלישי, כמו שאפרט בסעיף 5 של “מה הסקריפט עושה”)
    1. הענף בגיטהאב של moodle שממנו יש לקבל את ה-commit (הענף כמובן יותאם לגרסת המוודל של המערכת שלנו)
    2. ה-MDL הרלוונטי לתיקון האבטחה.
    3. כך למשל עשויה להיראות קריאה עם שני פרמטרים: ../get-security-patch-for-moodle.sh MOODLE_31_STABLE MDL-57596
    4. וכך עשויה להיראות קריאה עם 3 פרמטרים: <span class="pl-c">../get-security-patch-for-moodle.sh MOODLE_31_STABLE MDL-57596 --dry-run</span>

מה הסקריפט עושה

  1. 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.
  2. <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.

  3. SF_COMMIT_URL=$(echo "https://git.moodle.org".$SF_COMMIT | sed "s/a=commit/a=patch/")
    כעת גולשים לקישור ל-commit (למשל בדוגמה שלנו, נגלוש לכאן) ואת התוצאה – html (בדוגמה שלנו: כמו שכאן) – מעבירים ל-sed כדי לחפש את הכתובת של ה-patch, ושומרים אותה במשתנה SF_COMMIT_URL
  4. curl -k1 $SF_COMMIT_URL > "security_fix_$2.patch"
    גולשים לכתובת של ה-patch (בדוגמה שלנו, לכאן), ושומרים את התוצאה בקובץ patch מקומי אצלנו.
  5. 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>

עד כאן להפעם, מקווה שתגזרו ותשמרו. אבטחה מעל הכל!

כתבו תגובה

כתובת הדוא"ל שלכם לא תוצג.