• בלוג
  • ארבעה רעיונות למנגנוני הגנה של תוכנות

ארבעה רעיונות למנגנוני הגנה של תוכנות

01/11/2018

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

1. שידרוג גירסאות בנוד לא ישבור קוד

מכירים את npm update? הפקודה מקבלת שם של חבילה בפרויקט ומשדרגת אותה לגירסא העדכנית ביותר. אבל עם טוויסט.

נניח שיש לי ב package.json את בלוק התלויות הבא:

  "dependencies": {
    "cowsay": "^1.3.1",
    "get-stdin": "^4.0.0"
  },

ואני הולך לבדוק איזה תלויות צריכות שדרוג אז אקבל:

$ npm outdated

Package    Current  Wanted  Latest  Location
get-stdin    4.0.0   4.0.1   6.0.0  20-demo-cowsay-module

מה שאומר שאני בגירסא 4 והגירסא העדכנית ביותר היא 6. אבל כשאנסה לשדרג תראו מה קורה:

$ npm update

+ get-stdin@4.0.1
updated 1 package and audited 225 packages in 8.079s
found 0 vulnerabilities

במקום לקבל את גירסא 6 עצרנו ב 4.0.1. בגלל הגדרת הגירסא ב package.json (שאגב נכתבת כך אוטומטית כשאתם מתקינים חבילה), באופן אוטומטי npm ידע שכשמשדרגים עדיף לא לשנות Major Version ולכן נשארנו עם גירסת 4 האחרונה.

המטרה של המנגנון למנוע מכם בטעות לשדרג חבילה כשהשידרוג יגרום לשבירת קוד. הנחת העבודה כאן היא ששידרוג שמשפיע רק על המספר השני או השלישי (ה Minor או Patch) לא שובר קוד, אבל שידרוג שמשפיע על ה Major Version בהחלט עלול לשבור קוד ולכן זה לא משהו שצריך לעשות באופן אוטומטי.

2. גיט לא ייתן לכם למחוק ענף לפני מיזוג

כנסו לפרויקט גיט, צרו ענף חדש ובצעו שם קומיט:

$ git checkout -b foobar
$ touch a
$ git add a
$ git commit -m 'yo'

עכשיו חיזרו ל master ונסו למחוק את הענף:

$ git checkout master
$ git branch -d foobar
error: The branch 'foobar' is not fully merged.
If you are sure you want to delete it, run 'git branch -D foobar'.

הודעת השגיאה מספרת את כל הסיפור. מחיקת הענף עלולה להוביל לאיבוד מידע ולכן גיט דואג שלא תמחקו. אתם יכולים לבחור להתעקש (עם שינוי ה d ל D) או למזג את הענף.

הסכנה במנגנון זה היא שאנשים יתרגלו להשתמש תמיד ב-D כדי למחוק ענפים, כמו שקורה לרוב משתמשי היוניקס עם הפקודה rm (אליה מוסיפים באופן אוטומטי את -rf). ועדיין הגדרת שתי פעולות שונות למחיקה כאשר כל ההבדל ביניהן הוא מנגנון האבטחה היא דרך טובה לעזור למשתמשים לא למחוק דברים בטעות.

3. יוניקס לא ייתן לכם למחוק את התיקיה הראשית

ביוניקס בניגוד לאמונה הרווחת הפקודה:

$ rm -rf /

לא עושה כלום. וכן צריך אומץ או מכונה וירטואלית בשביל לבדוק את זה. אבל אם תתעקשו תקבלו מהמערכת את ההודעה:

$ rm -rf /
rm of / is not allowed

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

4. באש ישמור שלא תדרסו קובץ קיים בטעות

ויש גם מנגנוני הגנה שדורשים שתפעילו אותם מבעוד מועד, כמו מנגנון מניעת ה clobbering של Bash. באופן רגיל אפשר להשתמש בחץ קדימה כדי לדרוס תוכן של קבצים קיימים. הפעלת שתי הפקודות הבאות ב bash:

$ echo one > output.txt
$ echo two > output.txt

משאירה אותנו עם קובץ output.txt בו רשומה רק השורה השניה. באמצעות מנגנון noclobber אותו יהיה עליכם להפעיל באופן יזום נוכל למנוע מ shell לבצע דריסה זו:

$ set -o noclobber
$ rm output.txt
$ echo one > output.txt
$ echo two > output.txt

-bash: output.txt: cannot overwrite existing file

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