שרשור חולשות - מ-Low ל-Critical¶
אם עשיתם קצת bug bounty, בטח נתקלתם בתחושה המתסכלת הזאת - מוצאים חולשה, מדווחים עליה בהתרגשות, ומקבלים חזרה "Low severity" עם תגמול צנוע. זה קורה כי לבד, רוב הממצאים באמת לא חמורים. הקסם קורה כשמפסיקים לחפש חולשה בודדת, ומתחילים לחפש שרשרת. זה בדיוק ההבדל בין בודק שמריץ רשימת בדיקות, לבין בודק שחושב כמו תוקף אמיתי.
אז מה זה בעצם שרשור חולשות?¶
שרשור חולשות הוא הרעיון שכמה ממצאים, שכל אחד מהם בפני עצמו לא מספיק כדי לגרום נזק ממשי, יכולים יחד ליצור מסלול תקיפה שלם עם השפעה גבוהה בהרבה מסכום החלקים שלו. חולשה אחת פותחת דלת קטנה, השנייה מרחיבה אותה, והשלישית הופכת אותה לפרצה של ממש. תוכניות bug bounty רבות בודקות בדיוק את זה - לא רק "האם יש בעיה", אלא "עד כמה רחוק אפשר להגיע איתה".
למה תוכניות אוהבות דוחות משורשרים¶
מבחינת צוות טריאז' בתוכנית bug bounty, יש הבדל עצום בין דוח שאומר "מצאתי הפניה פתוחה" (open redirect) לבין דוח שאומר "מצאתי הפניה פתוחה, וכך השתמשתי בה כדי לגנוב טוקן אימות מלא". הדוח הראשון הוא מידע. הדוח השני הוא הוכחה ממשית לסיכון עסקי. תוכניות משלמות משמעותית יותר על שרשראות מלאות, כי הן מראות בדיוק מה עלול לקרות במציאות, ולא רק מציינות חולשה תאורטית.
איך נראית שרשרת בפועל - שתי דוגמאות היפותטיות¶
חשוב להדגיש - שתי הדוגמאות הבאות הן היפותטיות לגמרי, נועדו להמחיש את העיקרון, ולא מתארות אירוע אמיתי כלשהו.
דוגמה ראשונה - מהפניה תמימה לחטיפת חשבון. נניח שיש הפניה פתוחה (open redirect) בפרמטר שמעביר משתמשים לאתר שותפים אחרי התחברות. לבד, זו חולשה ברמה נמוכה - הכי גרוע, אפשר לשלוח למישהו קישור שמפנה אותו לאתר לא רצוי. עכשיו נניח שבתהליך איפוס הסיסמה, טוקן האיפוס נשלח כפרמטר בכתובת ה-URL, וזו כתובת שיכולה לעבור דרך אותה הפניה. השילוב בין השניים פתאום מאפשר מסלול שבו טוקן איפוס סיסמה "דולף" דרך הפניה לאתר חיצוני שתוקף שולט בו. כל חוליה לבד היא לא סוף העולם. יחד, זו חטיפת חשבון מלאה.
דוגמה שנייה - מדליפת מידע לפריצה מלאה. נניח שיש נקודת קצה שמחזירה מידע קצת יותר ממה שהיא צריכה - למשל, מזהה פנימי של משתמש שאמור להישאר חסוי. בפני עצמה, זו חולשת חשיפת מידע ברמה נמוכה. עכשיו נניח שבנקודת קצה אחרת יש IDOR - אפשר לגשת לנתונים של משתמש אחר אם יודעים את המזהה שלו, אבל המזהים "קשים לניחוש" אז החולשה סווגה כברמת חומרה בינונית. השילוב בין השתיים - למידע דולף שמספק בדיוק את המזהים החסרים - הופך IDOR תיאורטי לכלי שמאפשר גישה שיטתית לנתונים של כל משתמש במערכת.
בשני המקרים, שום חוליה בודדת לא הייתה "קריטית". השרשור הוא מה שהופך אותן לכך.
למה זה דורש חשיבה שונה לגמרי¶
הסיבה ששרשור חולשות נחשב למיומנות מתקדמת היא שהוא דורש לפעול הפוך מהאינסטינקט הטבעי. האינסטינקט אומר למצוא חולשה, לתעד אותה, ולעבור הלאה. חשיבה בשרשראות אומרת לעצור בכל ממצא, גם כזה שנראה שולי, ולשאול - מה עוד יש כאן במערכת שיכול להשתמש בממצא הזה כאבן דריכה? זה דורש מפה מנטלית שלמה של המערכת, לא רק רשימת חולשות מבודדות.
זו גם הסיבה שממצאים משורשרים כמעט תמיד יוצאים מבדיקה ידנית ומעמיקה, ולא מסריקה אוטומטית. כלי סריקה מדווח על כל ממצא בנפרד, לפי חומרה משלו. הוא לא "רואה" שהפניה פתוחה בעמוד אחד קשורה לטוקן שדולף בעמוד אחר לגמרי.
איך מתרגלים את סוג החשיבה הזה¶
הדרך הכי טובה להתחיל היא להפסיק לשאול "מה מצאתי", ולהתחיל לשאול "מה אני יכול לעשות עם מה שמצאתי". כל חולשה ברמה נמוכה שמצאתם שווה בדיקה נוספת - האם יש דרך לחבר אותה למשהו אחר במערכת. זו בדיוק סוג ההרגל שאנחנו מטמיעים בקורס פריצת אתרים מתקדם, כשמלמדים לא רק לזהות חולשות בודדות, אלא לחשוב על המערכת כמכלול אחד.
ואם אתם רוצים לתרגל בניית שרשראות יחד עם אנשים אחרים שעושים בדיוק את זה - זה בדיוק המקום.
לסיכום¶
חולשה בודדת ברמת Low כמעט אף פעם לא הסוף של הסיפור. השאלה האמיתית היא תמיד מה קורה כשמחברים אותה לממצא אחר, שלישי, רביעי. מי שלומד לחשוב ככה מפסיק לרדוף אחרי חולשות בודדות, ומתחיל לבנות מסלולי תקיפה שלמים - וזה בדיוק מה שמבדיל בודק ממוצע מבודק שכל תוכנית bug bounty רוצה לראות אצלה שוב.