חזרה
למה מפתחים עדיין לא מבינים CORS — הלקח מפרצת ה-localhost של זום
SiTech AI Team3 წთ. საკითხავი

למה מפתחים עדיין לא מבינים CORS — הלקח מפרצת ה-localhost של זום

מסה של היועץ כריס פוסטר, שמשתמשת בפרצת ה-localhost של זום מ-2019, מראה כיצד אי-הבנה של מנגנון CORS יצרה עקיפה שאפשרה לכל אתר להפעיל פעולות באפליקציה — וכיצד נראית מימוש נכון.

מסה של כריס פוסטר, יועץ לפיתוח תוכנה, שפורסמה ב-2019 ועדיין מופצת בקרב מפתחים, טוענת שיותר מדי מפתחי ווב אינם מבינים כיצד פועל מנגנון Cross-Origin Resource Sharing (CORS), ושלתפיסה השגויה הזו יש השלכות אבטחה ממשיות. מקרה הבוחן שלו הוא פרצת ה-localhost בתוכנת זום לשולחן העבודה, שנחשפה בידי חוקר האבטחה ג'ונתן לייצ'וק ביולי 2019.

מלכודת ה-localhost של זום

לקוח זום התקין במחשב שרת ווב שהאזין לכתובת http://localhost:19421. כאשר משתמש פתח קישור של זום, אתר zoom.us שלח בקשה לשרת המקומי והורה לו להפעיל את היישום המקורי. במקום בקשת AJAX רגילה, הדף טען תמונה מהשרת המקומי, ומידות התמונה קידדו את קוד הסטטוס או השגיאה של השרת. בכתיבתו שיער לייצ'וק שהדבר נעשה כדי לעקוף את CORS, שכן, כלשונו, דפדפנים מתעלמים לחלוטין ממדיניות CORS עבור שרתים הפועלים על localhost.

פוסטר מציין שקביעה זו שגויה: Chrome מכבד כותרות CORS גם עבור שרתי ווב מקומיים, ובקשות חוצות-מקור אל localhost נתמכות בכל הדפדפנים — מפתחים עושים זאת דרך קבע כשהחזית של Create React App רצה על פורט אחד וה-API על פורט אחר. תעלול התמונה, לדבריו, מלמד שזום או לא הבינה את CORS או בחרה לעקוף אותה, ומחיר העקיפה היה גבוה: לא רק zoom.us יכלה להפעיל פעולות ביישום המקורי ולקרוא את התשובה, אלא כל אתר אחר באינטרנט.

איך נראה מימוש מאובטח

שרת הווב המקומי אמור לחשוף REST API ולשלוח כותרת Access-Control-Allow-Origin עם הערך https://zoom.us, כך שרק קוד JavaScript שרץ בדומיין zoom.us יוכל לדבר איתו. בנוסף, zoom.us צריכה לשלוח כותרת Content Security Policy שחוסמת הצגה בתוך iframe, כדי שדפים לא יפתחו פגישות ברקע בשקט. עדיין נותרת העובדה שכל דף יכול להפנות את הדפדפן לקישור zoom.us ולפגישה לא צפויה. פוסטר מסווג זאת כהחלטת חוויית משתמש ולא כפרצת תוכנה, והוא חולק עליה: תוכנה חייבת להיות צפויה, ולחיצה על קישור לא אמורה לחשוף את המצלמה והמיקרופון שלך לזרים. כדוגמה טובה יותר הוא מביא את החלון המוקפץ בתוך היישום של Google Meet.

מדוע הבלבול נמשך

הבעיה אינה ייחודית לזום: ספקים נוספים נתפסו עם אותה פרצה בדיוק, ו-Stack Overflow מלא בשאלות על CORS, שלעיתים קרובות מלוות בעצות עם ברירות מחדל לא מאובטחות — למשל דוגמת Express שפורסמה ב-enable-cors.org, שהייתה הופכת יישום לרגיש אם הייתה מועתקת כפי שהיא. גם תירוצים טכניים אינם מחזיקים: Firefox אמנם עשוי לחסום בקשות מסוימות ממקור מאובטח למקור לא מאובטח, אך הוא תומך ב-localhost, ויישומים מקוריים יכולים לייצר תעודה חתומה עצמית או לספק תוסף לדפדפן. עקיפת מדיניות אותו-המקור עשויה לגרום לקוד לעבוד, מסכם פוסטר, אבל בהמשך היא יוצרת בעיות — ועדיין לא ברור אם CORS הוא API מורכב מדי או שפשוט חסרה הדרכה למפתחים.

SSiTech

SiTech — פיתוח אתרים בכוח ה-AI

אנחנו בונים אתרים מהירים ומודרניים ומשלבים AI בתהליכי עבודה אמיתיים. יש לכם פרויקט או שאלה? נשמח לעזור.