איך כדאי ללמד אבטחת מידע
הוזמנתי להעביר בקרוב סדנא בפיתוח קוד מאובטח. אני מעביר סדנאות כאלה מפעם לפעם ובדרך כלל עיקר הסדנא הוא הדגמות של בעיות אבטחה בתוכנות ואיך אפשר היה להימנע מהן. התחלתי לחשוב על כיוון אחר אז משתף כאן ואשמח לשמוע גם דעות שלכם.
1. מה בעצם הבעיה בניתוח חולשות בדיעבד
אז לפני שמתקנים משהו צריך קודם לחשוב אם הוא בכלל דורש תיקון. בנושא אבטחת מידע אני מתחיל לחשוב שלשמוע סיפורים על פירצות ולראות קוד שבור לא הופך אותנו למתכנתים מודעים יותר. זה לא שעשיתי מחקר או משהו אלא יותר התרשמות משיחות עם אנשים שהיו בסדנאות כאלה בפרספקטיבה של שלושה-ארבעה חודשים אחרי.
יש הבדל גדול בין זה שבן אדם יודע שקוד מסוים הוא שבור לבין היכולת של אותו מתכנת לעצור לפני כתיבת הקוד ולשאול אם יש בעיות בקוד הפוטנציאלי שהוא עומד לכתוב. ניתוח של פירצות בדיעבד יכול לעזור ל Pen Testers שיקבלו רעיונות איפה לחפש בעיות, אבל מתכנתים לא מנסים לפרוץ לעצמם ליישום.
מה שאולי יעזור יותר למתכנתים זה לאמן את המנגנון של לעצור לפני כתיבת קוד ולשאול איזה בעיות אבטחה יכולות להיות בקוד הזה, ולקיים כזה דיון במסגרת היערכות לכתיבת קוד. ההשערה שלי שביצוע מספר דיונים כאלה במסגרת של כיתה יכול לשפר טוב יותר את הנכונות של המתכנתים לבצע דיונים כאלה גם אחרי הסדנא בחיים האמיתיים.
לכן מתכונת טובה יותר לסדנא תהיה בפורמט של בניית מערכת, כאשר לפני כל שלב בבניה עוצרים לשאול איזה בעיות אבטחה עשויות להופיע בשלב זה ואיך חשבנו להתמודד אתן.
2. נקודת התחלה: Setup
בהנחה שנלך על מערכת מבוססת Web, נקודת התחלה אפשרית היא ה Setup של המערכת, כלומר בניית קוד ראשוני שעובד והעלאה לשרת. אפשר להתחיל עם קוד שרק מראה מסך ״ברוכים הבאים״, ואז האתגר הוא בסך הכל העלאה לרשת.
במהלך הדיון בשלב זה אפשר להסביר איך עובד DNS ומה הסכנות בפריצה לשרתי DNS, מהו HTTPS ולמה חשוב להגדיר עבור המערכת שלנו, באיזה מכונה כדאי להתקין את המערכת ואיך נתגונן ממתקפות DDoS ברמת הרשת.
עוד נושאים שיעלו הם יתירות ופיזור השרתים שלנו למספר אזורים גיאוגרפיים. גיבוי ושיחזור מגיבוי, תהליך Deployment מאובטח שמאפשר תמיד לחזור גירסא אחורה אם דברים נשברים. הרשאות והרצת מערכות שונות דרך משתמשים שונים, התחברות מאובטחת לשרת עם SSH Keys ועוד.
ההתלבטות היחידה לגבי כל הדיון הזה זה עד כמה זה מעניין מתכנתים, או שעדיף לדלג עליו ולהתחיל ישר מפיתוח המערכת.
3. הוספת מערכת משתמשים
בשביל מערכת מעניינת נצטרך מערכת שמשתמשים יכולים להתחבר אליה ולבצע בה פעולות, למשל רשת חברתית. במערכת כזאת כל אחד יכול לפתוח פרופיל, לפרסם הודעות בפרופיל ולראות את כל ההודעות של כל האנשים האחרים או רק של החברים שלו.
השלב הראשון בפיתוח יהיה מימוש מערכת משתמשים הכולל מסך יצירת משתמש, מסך התחברות ומסך שכחתי סיסמא.
רק מסכים אלו נותנים לנו הזדמנות לדבר על המון דברים מעניינים בהיבט של אבטחת המידע: איך שומרים את הסיסמאות בבסיס הנתונים? איך שולחים מייל לכל משתמש שנרשם? איפה שומרים את ה Credentials לשרת ה SMTP? איפה שומרים את ה Credentials לבסיס הנתונים? איך עובד מנגנון ״זכור אותי״? איך עובד מנגנון ״שכחתי סיסמא״?
השאיפה שקיום דיון כזה לפני מימוש הקוד והצפת הבעיות במימושים לא מאובטחים בזמן הכתיבה יתנו פרספקטיבה טובה יותר על תהליך הפיתוח מאשר ניתוח הקוד בדיעבד.
4. הוספת מערכת הודעות
המודול הבא יהיה האפשרות לשלוח הודעות ולהציג הודעות של משתמשים אחרים. מימוש קוד כזה הוא מקום אידאלי לדבר על XSS ו CSRF, כלומר לשאול האם אפשר לשלוח בתוך הודעה קוד זדוני שיפגע במשתמשים אחרים שקוראים את ההודעה, והאם אפשר לגרום למשתמש מסוים לשלוח הודעה שלא התכוון לשלוח.
רק אחרי שרואים את הבעיות אפשר לעבור למימוש אמצעי ההגנה שיכללו וולידציה של הקלט ושימוש ב authenticity token או למתקדמים same site cookies.
5. סיכום ביניים
הנושאים שרשמתי כאן מספיקים לסדנא של יום שכוללת המון דיונים וקצת מימוש קוד. מה דעתכם? הייתם באים לסדנא כזאת? לרדת מהרעיון ולחזור להציג קוד שבור? רעיונות לשיפור שלא חשבתי עליהם? ספרו בתגובות.