יסודות האבטחה
משולש CIA: סודיות, שלמות וזמינות
משולש CIA בהסבר: סודיות, שלמות וזמינות, עם דוגמאות מהיום־יום, בדיקות hash וחתימה ועשרה אירועים לסיווג.
דיאגרמות זרימת נתונים, גבולות אמון ושש הקטגוריות של STRIDE, ואז מידול של OWASP Juice Shop מקומי ב-Threat Dragon.
STRIDE היא רשימה של שש קטגוריות איומים: spoofing, tampering, repudiation, information disclosure, denial of service ו-elevation of privilege. Microsoft משתמשת בה בהנחיות מידול האיומים שלה. STRIDE לא מוצאת איומים במקומך. היא נותנת שש שאלות לשאול על כל חלק בתכנון, כך שהתוצאה לא תלויה במה שבמקרה עולה בזיכרון באותו אחר צהריים.
השיטה קודמת לרוב כלי האבטחה. סורק מסתכל על מערכת רצה. מודל איומים מסתכל על התוכנית: אילו רכיבים קיימים, אילו נתונים עוברים ביניהם ואיפה רמת האמון משתנה. אפשר להתחיל בנייר ועט לפני שיש שורת קוד.
כשלים רבים באבטחת web הם כשלי תכנון. השרת סומך על מחיר שהדפדפן שלח. נתיב ניהול בודק שמשתמש מחובר, אבל לא בודק שהוא אדמין. קובץ לוג שומר טוקנים של סשן. אפשר לתקן כל אחד מאלה בקוד, אבל הקוד תואם לעיתים קרובות לתכנון שניתן לו. הבעיה מתחילה בתכנון.
OWASP Threat Modeling Cheat Sheet אומר את אותו הדבר. צריך להבין זרימות נתונים, גבולות אמון ואת שאר חלקי המערכת לפני שאפשר לקבוע אילו איומים רלוונטיים. מודל איומים כותב את ההבנה הזאת בצורה שאחרים יכולים לסקור.
בדיאגרמת זרימת נתונים (DFD) יש ארבעה סוגי רכיבים:
הדיאגרמה נשארת בעמוד אחד. אם צריך עמוד שני, כנראה שמצוירות בה שתי מערכות.
גבול אמון הוא קו שבו נתונים עוברים ממקום ברמת אמון אחת למקום ברמה אחרת. השרת שלך יושב בתוך הקו. דפדפן יושב מחוצה לו, כי מי שמשתמש בו יכול לשנות כל בקשה לפני שהיא מגיעה אליך. כל זרימה שחוצה גבול צריכה ולידציה, ורוב האיומים המעניינים נמצאים במעברים האלה. ה-Cheat Sheet של OWASP מתאר את המעברים האלה כנקודות תקיפה סבירות.
גבול הוא לא בהכרח קצה רשת. תהליך שרץ תחת חשבון מערכת הפעלה אחר, ספק זהויות של צד שלישי או מסד נתונים שמקבל חיבורים מכמה שירותים יכולים כל אחד להיות גבול.
כל קטגוריה שוברת תכונת אבטחה אחת.
| קטגוריה | התכונה שהיא שוברת | שאלה לשאול |
|---|---|---|
| Spoofing | אימות | האם מישהו יכול להתחזות למשתמש, לשירות או לרכיב אחר? |
| Tampering | שלמות | האם נתונים יכולים להשתנות בתעבורה או באחסון בלי שאיש ישים לב? |
| Repudiation | אחריותיות | האם מישהו יכול להכחיש פעולה, בלי רשומה שמוכיחה אחרת? |
| Information disclosure | סודיות | האם מישהו יכול לקרוא נתונים שלא אמור לראות? |
| Denial of service | זמינות | האם מישהו יכול להאט את הרכיב הזה או להפיל אותו? |
| Elevation of privilege | הרשאה | האם מישהו יכול לעשות יותר ממה שמותר לו? |
אלה תואמים לתיאורים בתיעוד מידול האיומים של Microsoft. Spoofing, למשל, פירושו שימוש בפרטי האימות של משתמש אחר.
לא כל קטגוריה חלה על כל רכיב. מיפוי התחלתי נפוץ, שמשמש כלים רבים למידול איומים, הוא: ישויות חיצוניות מקבלות spoofing ו-repudiation; תהליכים מקבלים את כל השש; מאגרי נתונים מקבלים tampering, repudiation, information disclosure ו-denial of service; זרימות נתונים מקבלות tampering, information disclosure ו-denial of service. המיפוי הוא נקודת התחלה לחשיבה. אם קטגוריה נראית לא רלוונטית לרכיב, כותבים למה, כדי שסוקר יוכל לערער על כך.
בפיצ׳ר קטן, שלבים 1 עד 5 יכולים לקחת שעה. בפעם הראשונה סביר לצייר את הדיאגרמה מחדש לפחות פעם אחת. זה נורמלי.
OWASP Juice Shop היא אפליקציית web לא מאובטחת בכוונה, לצורכי הדרכה. במעבדה הזאת לא מנצלים אותה. מציירים את התכנון שלה, מונים איומים וכותבים מיטיגציות. האיומים מגיעים מקריאת התכנון ולא מתקיפת האפליקציה.
מריצים את המעבדה רק על המחשב שלך, כשהיא קשורה לכתובת 127.0.0.1. אם הקונטיינר עוד לא הוקם, כדאי קודם לעבור על OWASP Juice Shop עם Docker.
צריך:
במחשב הבדיקה של המאמר הזה, git --version הדפיס:
git version 2.49.0.windows.1docker run --rm -d --name juice-shop-lab -p 127.0.0.1:3000:3000 bkimminich/juice-shopהחלק -p 127.0.0.1:3000:3000 מפרסם את הפורט רק על ממשק ה-loopback, כך שמחשבים אחרים ברשת שלך לא יכולים להגיע אליו.
מוודאים שאפליקציית ה-web עונה:
curl -sI http://127.0.0.1:3000/ | head -n 1במחשב הבדיקה, השורה הראשונה בפלט הייתה:
HTTP/1.1 200 OKמוודאים שה-API עונה. זו בקשת GET פשוטה לרשימת מוצרים:
curl -s -o /dev/null -w "products %{http_code} %{content_type}\n" http://127.0.0.1:3000/api/Productsפלט:
products 200 application/json; charset=utf-8בודקים את הגרסה שהאפליקציה מדווחת:
curl -s http://127.0.0.1:3000/rest/admin/application-versionפלט:
{"version":"20.3.0"}זו הגרסה שה-image דיווח עליה ב-8 בנובמבר 2026 במחשב הבדיקה. ה-image שלך עשוי לדווח על גרסה אחרת. כדאי לרשום את הגרסה שמופיעה אצלך, כי מודל האיומים מתאר גרסה מסוימת.
מורידים את גרסת ה-desktop למערכת ההפעלה שלך מדף ה-releases, מתקינים ופותחים. שמות התפריטים בשלבים הבאים לא נבדקו מול גרסת Threat Dragon עבור המאמר הזה, והם משתנים בין גרסאות. מתאימים את השמות למה שמופיע אצלך.
יוצרים מודל איומים חדש ומוסיפים את הרכיבים האלה:
המודל אמור להיראות כך:
Browser (external actor)
| HTTP requests and responses
v
=================== trust boundary ===================
Juice Shop web and API (process, 127.0.0.1:3000)
| SQL queries and rows
v
SQLite database (data store)הסקיצה הטקסטואלית היא רק להכוונה. הקובץ האמיתי הוא מה ש-Threat Dragon שומר.
המודל משתמש ב-SQLite כמאגר הנתונים. כדאי לבדוק את תיעוד הפרויקט עבור הגרסה שרצה אצלך, כי פרטי האחסון יכולים להשתנות בין גרסאות.
מחילים את המיפוי ההתחלתי שלמעלה. הדפדפן הוא ישות חיצונית, ולכן הוא מקבל spoofing ו-repudiation. כל זרימה מהדפדפן ל-API מקבלת tampering, information disclosure ו-denial of service. תהליך ה-API מקבל את כל שש הקטגוריות. מאגר ה-SQLite מקבל tampering, repudiation, information disclosure ו-denial of service.
הנה דוגמה אחת לכל קטגוריה. במודל אמיתי יש יותר שורות לכל רכיב.
| קטגוריה | רכיב | איום | מיטיגציה |
|---|---|---|---|
| Spoofing | דפדפן וסשן API | טוקן גנוב מאפשר למישהו לפעול בשם קונה | אורך חיים קצר לטוקן, בדיקת חתימה בכל בקשה, ביטול טוקנים ביציאה, מגבלת קצב על התחברויות |
| Tampering | זרימה מהדפדפן ל-API | קונה משנה את המחיר או הכמות בבקשת הזמנה | השרת מחשב מחדש מחירים ממסד הנתונים ולעולם לא סומך על סכומים מצד הלקוח; אימות סכמת הבקשה |
| Repudiation | תהליך ההזמנה | קונה טוען שמעולם לא ביצע הזמנה, ואין רשומה שמראה אחרת | יומן ביקורת בצד השרת של אירועי הזמנה עם מזהה משתמש, חותמת זמן ומזהה בקשה; בלי סודות ביומן |
| Information disclosure | זרימה מה-API לדפדפן | תגובת שגיאה חושפת stack traces או שדות פנימיים | להחזיר רק שדות מ-allowlist; הודעות שגיאה כלליות ללקוח; פרטים מלאים רק בלוגים של השרת |
| Denial of service | Endpoint של חיפוש | בקשות חיפוש יקרות רבות מאטות את השירות לכולם | מגבלות קצב לכל לקוח, אורך שאילתה וגודל עמוד מרביים, timeouts על שאילתות למסד הנתונים |
| Elevation of privilege | פונקציות ניהול | משתמש רגיל קורא ל-endpoint ניהולי אחרי שינוי ערך תפקיד | בדיקת הרשאה בשרת לכל בקשה, דחייה כברירת מחדל, התפקיד נקרא מהסשן בצד השרת |
תיעוד הפרויקט מראה אילו חולשות הגרסה שלך כוללת בכוונה. מתארים כל איום במונחי תכנון. לא כותבים במודל שלבי אקספלויט. המעבדה הזאת לא צריכה שום תעבורת תקיפה.
ב-Threat Dragon מוסיפים כל איום לרכיב שאליו הוא שייך, עם כותרת, תיאור ומיטיגציה. אם יש בגרסה שלך שדה סטטוס, מגדירים אותו ל-open עבור מיטיגציות שעוד לא נבנו.
מייצאים את המודל כ-JSON מתפריט הקובץ ונותנים לקובץ את השם juice-shop-threat-model.json. אחר כך, בתיקיית המעבדה:
git init
cp /path/to/juice-shop-threat-model.json .
git add juice-shop-threat-model.json && git commit -m "First STRIDE model"Git מדפיס תקציר קצר עם שם ה-branch והודעת ה-commit. הטקסט המדויק תלוי בגרסת ה-Git ובהגדרות שלך. אם Git מבקש זהות, מגדירים את הזהות שלך עם git config user.name וגם git config user.email, ומבצעים commit בשם שלך.
לפני ה-commit קוראים את הקובץ. לא אמורים להיות בו שמות מארחים אמיתיים, טוקנים או נתוני לקוחות. המודל הזה משתמש רק בכתובת 127.0.0.1.
עוצרים את המעבדה בסיום:
docker stop juice-shop-lab
curl -s -o /dev/null -w "%{http_code}\n" --max-time 2 http://127.0.0.1:3000/במחשב הבדיקה הפלט היה:
juice-shop-lab
000השורה הראשונה היא הפלט של docker stop. הערך 000 אומר ש-curl לא קיבל תשובה מהפורט, כלומר המעבדה למטה.
מודל איומים מתאר תכנון ביום שבו נכתב. כשהתכנון משתנה, המודל מתיישן. טריגרים נפוצים:
Threat Modeling Manifesto אומר שמידול איומים צריך ללכת בעקבות שינויי תכנון, באיטרציות, כל אחת על חלק של המערכת שאפשר לנהל. בפועל מדובר בשלושה הרגלים. שומרים את קובץ ה-JSON ב-repository ליד הקוד. מוסיפים שאלת סקירה ל-pull requests שנוגעים באימות, בזרימות נתונים או באינטגרציות חיצוניות: האם מודל האיומים עדיין תואם? רושמים את התאריך ואת גרסת האפליקציה שהמודל מתאר. איומים שסומנו כמטופלים הם עדיין היסטוריה שימושית, ולכן משאירים אותם.
יסודות האבטחה
משולש CIA בהסבר: סודיות, שלמות וזמינות, עם דוגמאות מהיום־יום, בדיקות hash וחתימה ועשרה אירועים לסיווג.
יסודות האבטחה
ההבדל בין חולשה, איום, סיכון ואקספלויט, איך CWE ו-CVE נותנים שמות לפגמים, ולמה גם לפגמים שאי אפשר להגיע אליהם יש משקל.
יסודות האבטחה
מה אבטחת סייבר כוללת, משולש CIA, הדרכים הנפוצות שבהן מערכות נכשלות, ותרגיל ראשון בטוח עם hash על המחשב שלך.