יסודות האבטחה
מהי חולשה? פגם, איום, סיכון ואקספלויט
ההבדל בין חולשה, איום, סיכון ואקספלויט, איך CWE ו-CVE נותנים שמות לפגמים, ולמה גם לפגמים שאי אפשר להגיע אליהם יש משקל.
משולש CIA בהסבר: סודיות, שלמות וזמינות, עם דוגמאות מהיום־יום, בדיקות hash וחתימה ועשרה אירועים לסיווג.
משולש CIA הוא המודל שאנשי אבטחה משתמשים בו כדי לומר על מה בקרה מגינה. הוא נוקב בשלוש תכונות של מידע ומערכות: סודיות, שלמות וזמינות. רוב בקרות האבטחה קיימות כדי לשמור על אחת או יותר מהן. מי שיודע לומר איזו תכונה אירוע שבר, כבר יודע איזה סוג נזק נגרם ואיזה סוג בקרה היה צריך לעצור אותו.
המאמר הזה ממשיך מהמקום שבו מהי אבטחת סייבר? מסתיים. שם נאמר שאבטחה עוסקת בהגנה על מידע ומערכות מפני נזק. כאן הרעיון מצטמצם לשלוש מטרות, ומתקבלת דרך למיין אירועים אמיתיים.
כל תכונה עונה על שאלה אחרת:
NIST משתמש בשלושת המונחים האלה בכל פרסומי האבטחה שלו. FIPS 199 בונה עליהם את קטגוריות המידע הפדרליות שלו: כל קטגוריה שואלת כמה נזק אובדן של כל תכונה יגרום. ההגדרות הפורמליות ארוכות וזהירות יותר מהתקציר שלמעלה. המקורות בסוף המאמר מקשרים אליהן, וכדאי לקרוא אותן אחרי שהרעיון הבסיסי ברור.
האותיות הן עזר לזיכרון ולא דירוג. C לא מופיעה ראשונה כי היא החשובה ביותר. מערכת תזמון בבית חולים עשויה להציב את הזמינות בראש, ופנקס תשלומים עשוי לדאוג יותר לשלמות. העדיפות הנכונה תלויה במערכת ובמה שקורה כשהיא נכשלת.
"לשמור על זה בטוח" מסתיר את הפשרות. מערכת יכולה לשמור על הסודות שלה ועדיין להיות חסרת תועלת כי אף אחד לא מגיע אליה. היא יכולה להיות מקוונת כל הזמן ולספק נתונים שגויים. היא יכולה להיות מדויקת וזמינה תמיד ועדיין להדליף רשומות לאנשים הלא נכונים. כשלכל אחת משלוש התכונות יש שם, אפשר לשאול שאלה מדויקת על כל אחת ולבחור בקרות שעונות עליה.
מסגרות אחרות מוסיפות מונחים, כמו אותנטיות, אחריותיות ואי־הכחשה. הגדרות מסוימות מכניסות אותנטיות ואי־הכחשה לתוך השלמות. FIPS 199 עושה את זה. לא משנה באיזו הגדרה משתמשים, המודל של שלוש התכונות הוא נקודת ההתחלה המשותפת, ולכן לומדים אותו קודם.
נניח שחברה מייצאת את רשימת הלקוחות שלה לגיליון אלקטרוני ושומרת אותו בכונן משותף. כל מי שבחברה יכול לפתוח את הכונן הזה. קבלן שהיה אמור לראות פרויקט אחד בלבד מוריד את הקובץ כולו. שום דבר לא השתנה. השירות נשאר מקוון. המידע עדיין יצא מהמקום שבו היה אמור להישאר, ולכן הסודיות אבדה.
סודיות עוסקת במי יכול לקרוא נתונים, והיא מכסה נתונים במנוחה (בדיסק, במסד נתונים), נתונים בתעבורה (נעים ברשת) ונתונים בשימוש (פתוחים בזיכרון או על מסך).
הפקודות בהמשך רצות על קובץ לניסיון. הן מראות מה הצפנה עושה בפועל. זו המחשה ולא מעבדה לציון, וה-passphrase מיועד להדגמה הזאת בלבד. לעולם לא שמים סודות אמיתיים בשורת פקודה או בהיסטוריית ה-shell.
printf 'Patient: J. Example, diagnosis: placeholder\n' > record.txt
export DEMO_PASS='lab-only-passphrase'
openssl enc -aes-256-cbc -pbkdf2 -salt -pass env:DEMO_PASS -in record.txt -out record.enc
od -A x -t x1z record.enc | head -3
openssl enc -d -aes-256-cbc -pbkdf2 -pass env:DEMO_PASS -in record.enc
openssl enc -d -aes-256-cbc -pbkdf2 -pass pass:wrong -in record.enc -out /dev/nullעל המחשב שבו זה הורץ (Windows 11, Git Bash, OpenSSL 3.2.4), הפלט היה:
000000 53 61 6c 74 65 64 5f 5f e4 81 09 19 9d 68 fe de >Salted__.....h..<
000010 54 5b 6c 39 12 1a 38 01 b3 03 ac b8 66 be 3b 4b >T[l9..8.....f.;K<
000020 68 ae 58 39 8f 74 f1 59 23 27 09 fe b7 cf cc 58 >h.X9.t.Y#'.....X<
Patient: J. Example, diagnosis: placeholder
bad decrypt
D4C00000:error:1C800064:Provider routines:ossl_cipher_unpadblock:bad decrypt:../openssl-3.2.4/providers/implementations/ciphers/ciphercommon_block.c:107:שלוש השורות הראשונות הן תחילת הטקסט המוצפן. הבתים שאחרי הכותרת Salted__ נראים אקראיים, והם משתנים בכל הרצה כי OpenSSL בוחר salt חדש בכל פעם, ולכן ה-hex אצלך יהיה שונה. ה-passphrase הנכון מחזיר את השורה המקורית. השגוי נכשל עם bad decrypt, וזה כל מה שמפתח שגוי מפיק. טקסט השגיאה לא חושף את התוכן. גם הקוד בן שמונת התווים שבתחילת השגיאה משתנה בין הרצות.
מישהו מוריד installer מאתר מראה. אם הקובץ שונה, ייתכן שהוא עדיין ירוץ מצוין. השאלה שצריך לשאול היא אם הבתים שלו תואמים למה שהספק פרסם, ולא אם הוא רץ.
שלמות מכסה גם נתונים במסד נתונים שמישהו ערך בלי הרשאה, לוג שנמחק אחרי חדירה וקובץ קונפיגורציה ששונה על ידי סקריפט שאיש לא אישר. בכל מקרה כזה, הנזק הוא שאי אפשר עוד לסמוך על מה שהנתונים אומרים.
פונקציית hash קוראת קובץ ומפיקה טביעת אצבע באורך קבוע. שינוי של בית אחד משנה את טביעת האצבע לגמרי. השוואת טביעות אצבע מאפשרת לבדוק ששני עותקים זהים בלי לקרוא את שני הקבצים זה לצד זה.
הפקודות בהמשך יוצרות קובץ, רושמות את ה-hash שלו ב-SHA-256 ומשנות את התוכן שלו:
printf 'Transfer: 10.00 USD to account A\n' > transfer.txt
sha256sum transfer.txt
printf 'Transfer: 1000.00 USD to account A\n' > transfer.txt
sha256sum transfer.txtהפלט שהתקבל:
f5ff0bd125880721c12f4eeecd95eb1a03fbc98f61dbd4ea2235cd7c902aa936 *transfer.txt
486ca9f3224c8003ff043ae09f3d1bc6cbe5008859a81c08e95da91945812b04 *transfer.txtל-hash השני אין שום דבר משותף עם הראשון, למרות שהשינוי היה אפס אחד נוסף. הבדיקה הופכת לשימושית כשמחזיקים את ה-hash הצפוי ומשווים אליו. שומרים את ה-hash המקורי בקובץ release.sha256, ואז מאמתים:
sha256sum -c release.sha256עבור הקובץ המקורי הפקודה הדפיסה release.txt: OK. אחרי שינוי הקובץ היא הדפיסה:
release.txt: FAILED
sha256sum: WARNING: 1 computed checksum did NOT matchהפקודה יוצאת עם סטטוס 1, כך שסקריפט יכול לעצור עליה.
ל-hash יש מגבלה. אם תוקף מחליף את הקובץ ומחליף גם את ה-hash שפורסם באותו דף web, ההשוואה עוברת ולא מוכיחה כלום. ה-hash אומר רק שהקובץ תואם ל-hash שקיבלת, ולכן צריך עותק מהימן של ה-hash הזה.
חתימה דיגיטלית מטפלת בבעיה הזאת. המפרסם חותם על הקובץ עם מפתח פרטי. כל מי שמחזיק במפתח הציבורי התואם יכול לאמת את החתימה. תוקף בלי המפתח הפרטי לא יכול להפיק חתימה תקפה עבור קובץ ששונה.
הפקודות הבאות משתמשות במפתח RSA חד־פעמי שנוצר בתיקיית ניסיון. לא משתמשים בו שוב לשום דבר אמיתי.
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out priv.pem
openssl pkey -in priv.pem -pubout -out pub.pem
openssl dgst -sha256 -sign priv.pem -out release.sig release.txt
openssl dgst -sha256 -verify pub.pem -signature release.sig release.txtעל הקובץ המקורי האימות הדפיס Verified OK. אחרי שהקובץ שונה, אותו אימות הדפיס Verification failure, ואחריו שורות שגיאה של OpenSSL שכוללות נתיבי מקור. השורות האלה הושמטו כאן.
חתימה תקפה מראה שהקובץ נחתם על ידי מי שמחזיק במפתח הפרטי. היא לא מראה שהמפתח שייך לספק שציפית לו. הקשר הזה מגיע משלב נפרד: תעודה, הפצת מפתחות מהימנה או טביעת אצבע שנבדקת בערוץ אחר.
מרפאה מריצה את מערכת התורים שלה על שרת אחד. דיסק נכשל ביום שני בבוקר. מטופלים לא יכולים לקבוע תור במשך יום. שום דבר לא נגנב ושום דבר לא השתנה. השירות פשוט לא היה זמין כשאנשים היו צריכים אותו.
גם תקיפות גורמות לאותה תוצאה. מתקפת מניעת שירות מבוזרת (DDoS) מציפה שירות בתעבורה עד שמשתמשים לגיטימיים לא מצליחים לעבור. כופרה יכולה לנעול קבצים כך שעובדים לא יכולים לעבוד, גם כשאין נתונים שיוצאים מהארגון. זמינות מכסה גם את הצד האנושי: חשבון שננעל אחרי יותר מדי ניסיונות התחברות כושלים הוא אובדן זמינות קטן.
בגיבויים יש מלכודת. גיבוי יכול להגן על השלמות כשהוא מאפשר לשחזר עותק נקי אחרי חדירה, אבל רק אם הוא נוצר לפני החדירה ונשמר מחוץ להישג ידו של התוקף. גיבוי הוא גם מידע סודי, ולכן גם הוא צריך הצפנה ובקרת גישה.
רוב הבקרות נוגעות ביותר מתכונה אחת. השאלה המועילה היא על איזו תכונה מסתמכים עבור סיכון נתון.
| בקרה | תכונה עיקרית | עוזרת גם ב |
|---|---|---|
| הצפנה | סודיות | שלמות נתונים בתעבורה, כשהפרוטוקול מאמת אותם |
| הרשאה מינימלית | סודיות | שלמות, כי היא מגבילה מי יכול לשנות נתונים |
| אימות רב־שלבי | סודיות | שלמות של חשבונות |
| Hashes | שלמות | אמון בהורדות, כי הם תופסים עותקים פגומים או ששונו |
| חתימות דיגיטליות | שלמות | אותנטיות של המפרסם |
| לוגי ביקורת | שלמות | אחריותיות, שתומכת בתגובה לאירועים |
| גיבויים | זמינות | שלמות, כשאפשר לשחזר עותק נקי |
| יתירות ו-failover | זמינות | מעט מעבר לזמינות |
| מגבלת קצב והגנת DDoS | זמינות | סודיות, כי הן מאטות ניסיונות brute-force |
קוראים כל תיאור וכותבים אות אחת: C (סודיות), I (שלמות) או A (זמינות). אם שתי תכונות מתאימות, בוחרים את זו שהתיאור מדגיש יותר ומציינים את האחרת בסוגריים. לא צריך לזה מחשב. כדאי לנסות את כל העשרה לפני קריאת התשובות.
ניקוד: שמונה תשובות נכונות או יותר אומרות שאפשר כבר למיין אירועים. אם כמה טעויות היו בקבוצת השלמות, כדאי לקרוא שוב את הסעיף על hash. חלק מהאירועים מתאימים לשתי תכונות, ולכן אפשר לקבל תשובה מנומקת שבוחרת תכונה עיקרית אחרת.
קוראים במלואם את סעיפי המבוא של NIST SP 800-12 Rev. 1 ואת הגדרות ההשפעה ב-FIPS 199. הם משתמשים במילים שנלמדו כאן, וזה יקל על קריאת המסמכים הפורמליים.
אחר כך קוראים את מהי חולשה? כדי לראות איך פגם הופך לאובדן של אחת משלוש התכונות האלה. למכניקה שמאחורי הצפנה ו-hashes, קוראים את מהי קריפטוגרפיה?.
כדי לתרגל בלי לגעת במערכות של אחרים, לוקחים כמה קבצים שלך, רושמים את ה-hashes שלהם, משנים תו אחד ומריצים שוב את הבדיקה. אחר כך מצפינים עותק עם passphrase חד־פעמי, מפענחים ומנסים את ה-passphrase השגוי. בסיום מוחקים את קובצי הניסיון. המטרה היא לראות את התכונות בפעולה, ולא לבנות מערכת מאובטחת מפקודות shell.
לבסוף קוראים דוח אירוע פומבי ומסווגים את האירוע המרכזי שלו באותה שיטה. שואלים באיזו תכונה הוא פגע קודם, ואיזו בקרה הייתה משנה את התוצאה.
יסודות האבטחה
ההבדל בין חולשה, איום, סיכון ואקספלויט, איך CWE ו-CVE נותנים שמות לפגמים, ולמה גם לפגמים שאי אפשר להגיע אליהם יש משקל.
יסודות האבטחה
דיאגרמות זרימת נתונים, גבולות אמון ושש הקטגוריות של STRIDE, ואז מידול של OWASP Juice Shop מקומי ב-Threat Dragon.
יסודות האבטחה
מה אבטחת סייבר כוללת, משולש CIA, הדרכים הנפוצות שבהן מערכות נכשלות, ותרגיל ראשון בטוח עם hash על המחשב שלך.