הברחת בקשות HTTP מוסברת - Request Smuggling¶
יש חולשות שקל להסביר בדוגמה אחת, ויש חולשות שדורשות שתעצרו לרגע ותחשבו איך בכלל אינטרנט עובד מתחת לפני השטח. הברחת בקשות, או בשמה המקורי Request Smuggling, שייכת לקטגוריה השנייה. היא לא נובעת מבאג בקוד שלכם, אלא מאי הסכמה שקטה בין שני שרתים על משהו שנשמע טריוויאלי - איפה בקשת HTTP אחת נגמרת ומתחילה הבאה.
המבנה שרוב האתרים היום בנויים עליו¶
כמעט אף אתר גדול היום לא מדבר ישירות עם שרת האפליקציה שלו. יש שכבה של פרוקסי בין הגולש לבין השרת - יכול להיות מאזן עומסים (load balancer), רשת הפצת תוכן (CDN), או שער API. הבקשה שלכם עוברת קודם דרך השכבה הזאת, שמעבירה אותה הלאה לשרת הפנימי.
זה מצוין לביצועים ולאבטחה, אבל זה יוצר בעיה שאנשים נוטים לשכוח - עכשיו יש שני שרתים שכל אחד מהם מפרש לבד את אותה בקשת HTTP. וברוב הזמן שני הפרשנויות מסכימות. הבעיה מתחילה כשהן לא.
מאיפה בדיוק נובעת אי ההסכמה¶
פרוטוקול HTTP מגדיר שתי דרכים שונות לומר לשרת המקבל היכן מסתיים גוף הבקשה. הראשונה היא כותרת Content-Length, שפשוט מציינת מספר בייטים מדויק. השנייה היא Transfer-Encoding: chunked, שבה הגוף מחולק לחתיכות (chunks) עם גודל מוצהר לכל חתיכה, עד שמגיעים לחתיכה בגודל אפס שמסמנת סוף.
הבעיה מתחילה כשבקשה אחת מכילה איכשהו את שתי הכותרתים גם יחד, או גרסאות מוזרות ולא תקניות שלהן. אם הפרוקסי בקדמת המערכת מסתמך על כותרת אחת כדי לדעת איפה הבקשה נגמרת, והשרת מאחוריו מסתמך על הכותרת השנייה, שני הצדדים "מסכימים" שהבקשה טופלה, אבל בפועל הם חלוקים לגבי איפה היא באמת הסתיימה. התוצאה היא שנשארת שארית מהבקשה שהפרוקסי כבר "סגר" עבורה, אבל השרת עדיין רואה כחלק מתוכן חדש.
מה קורה עם השארית הזאת¶
זו בדיוק הנקודה שהופכת את זה מסקרנות טכנית לחולשת אבטחה אמיתית. השארית הזאת, שהשרת הפנימי חושב שהיא תחילת בקשה חדשה, בעצם מתמזגת עם הבקשה הבאה שמגיעה מגולש אחר לגמרי, דרך אותו חיבור לשרת. במילים אחרות, בקשה של תוקף יכולה "להידבק" לתחילת הבקשה של משתמש תמים אחר, בלי שאף אחד מהם מודע לזה.
זה שונה מרוב החולשות שהכרתם עד עכשיו, כי הבעיה לא בקוד האפליקציה, ולא בקלט של משתמש בודד - היא בפרשנות של שני מרכיבי תשתית שכל אחד מהם, בפני עצמו, פועל בדיוק לפי הספרות.
למה זה חמור במיוחד בקנה מידה גדול¶
בשרת בודד, הסיפור הזה בקושי היה קורה. אבל ברגע שיש רשתות הפצת תוכן, מאזני עומסים ושרתי פרוקסי בין הגולש לשרת האמיתי, ולכל שכבה יש מימוש קצת שונה של פרוטוקול HTTP, הסיכוי לאי הסכמה כזאת עולה משמעותית. וכיוון שאותו חיבור לשרת האחורי לרוב משמש כמה משתמשים ברצף לצורך יעילות, "שארית" של בקשה אחת יכולה להתערבב עם הבקשה הבאה בתור, שלא בהכרח שייכת לאותו משתמש בכלל.
מה תוקף יכול להשיג עם זה¶
התוצאות האפשריות משתנות בהתאם לאיך בדיוק המערכת בנויה, אבל כמה תרחישים חוזרים על עצמם:
- עקיפת בקרות אבטחה. אם הפרוקסי הקדמי אחראי לחסום בקשות מסוימות, למשל לנתיבים ניהוליים, אפשר "להבריח" חלק מהבקשה כך שהפרוקסי רואה משהו תמים והשרת האחורי מקבל בקשה אחרת לגמרי.
- חטיפת בקשות של משתמשים אחרים. כשהשארית מתמזגת עם בקשה של גולש אחר, תשובת השרת יכולה לחזור לתוקף במקום למשתמש המקורי, מה שחושף עוגיות, טוקני הרשאה, או מידע רגיש אחר.
- הרעלת מטמון - Cache Poisoning. אם יש שכבת מטמון בדרך, תגובה שנוצרה כתוצאה מבקשה מוברחת יכולה להישמר במטמון ולהיות מוגשת אחר כך לכל מי שמבקש את אותו משאב, וכך חולשה שנוצלה פעם אחת ממשיכה להשפיע על משתמשים רבים אחרי זה.
חשוב להדגיש - אלה תוצאות אפשריות ברמת העיקרון, ולא מדריך יישום. המורכבות בפועל תלויה לגמרי בתצורה הספציפית של כל מערכת, וזו בדיוק הסיבה שלרוב נדרש ידע מעמיק כדי אפילו לזהות שהחולשה קיימת.
למה זה קשה כל כך לתפוס בבדיקות רגילות¶
הברחת בקשות כמעט לעולם לא תתגלה בבדיקה ידנית רגילה של האתר, כי מנקודת המבט של דפדפן רגיל הכל נראה תקין לגמרי. היא דורשת הבנה של הפרוטוקול ברמה נמוכה, כלים שמאפשרים לשלוח בקשות HTTP גולמיות ולא תקניות בכוונה, והרבה סבלנות כדי לזהות את אי ההתאמה בין שני מרכיבי התשתית. זו בדיוק הסיבה שהיא נחשבת לחולשה ברמה מתקדמת, ולמה גילוי שלה בבדיקת חדירה אמיתית שווה כל כך הרבה למי שמזמין אותה.
זה בדיוק סוג הנושא שאנחנו מלמדים בצורה מסודרת, שלב אחרי שלב, בקורס פריצת אתרים מתקדם - כולל הבנה של פרוטוקול HTTP ברמה שרוב המפתחים אף פעם לא נדרשים אליה.
מתלבטים או נתקעים באמצע? יש לנו קהילה שלמה שעוברת בדיוק את אותו מסלול.
לסיכום¶
הברחת בקשות היא תזכורת טובה לכך שלא כל חולשה נובעת מטעות בקוד - לפעמים היא נובעת מהנחה שקטה ולא כתובה בשום מקום, שנשברת בדיוק בנקודת המפגש בין שני מרכיבי מערכת. ברגע שמבינים את זה, קל הרבה יותר להבין למה תשתיות ענק עם צוותי אבטחה מנוסים עדיין מוצאות את עצמן פגיעות לחולשה הזאת.