
החוקר קיבל 90,000 דולר על פריצת הרצת קוד מרחוק באתרי המפתחים של Google
החוקר גילה שפלטפורמת DevSite של Google אחסנה סודות OAuth בעוגיות הסשן של Flask והשתמשה באותו מפתח גם לחתימה, מה שאפשר הרצת קוד מרחוק לא מורשית באמצעות עוגיות מזויפות.
סודות OAuth הטמונים בעוגיות הסשן של Flask
החוקר לאבטחה Simon Koeck גילה שבאתרי התיעוד למפתחים של Google, זרימת OAuth הכללית שמה סודות רגישים ישירות בעוגיות הסשן של Flask. בכניסה לכתובת /oauth2authorize ב-developers.google.com נכתבת עוגיית סשן חתומה אך לא מוצפנת, כך שבעל העוגייה יכול לפענח את תוכנה.
בתוך העוגייה Koeck מצא אובייקט oauth2client.client.OAuth2WebServerFlow שסרילז ב-pickle וכלל את client_id ו-client_secret של Google OAuth פתוחים. אפילו יותר קריטי היה שאותו client secret היה גם SECRET_KEY של Flask שבו חתומות העוגיות עצמן. הוא אימת זאת בחישוב חתימה מחדש במצב לא מקוון עם HMAC והפקת מפתח cookie-session, וקיבל תוצאה זהה בבייטים לחתימה שבעוגייה המקורית.
מעוגייה מזויפת להרצת קוד מרחוק
לאחר שיקום מפתח החתימה, Koeck יכול היה ליצור עוגיות סשן שרירותיות שהשרת יכל לקבל כתקפים. callback של OAuth קורא אובייקט flow מהסשן ומעביר ל-pickle.loads, שמבצע קוד בזמן unpickling באמצעות opcode REDUCE.
במקום להריץ פקודות במערכות הייצור של Google, Koeck הוכיח את הפריצה באופן זמני. payload שמקצר עד time.sleep(N) יצר עיכובי תשובה בהתאם לערך הנבחר: 0,207 שניות עבור sleep(0), 3,193 עבור sleep(3), 5,194 עבור sleep(5) ו-8,283 עבור sleep(8). מבחני בקרה אימתו התנהגות זו: היעדר עוגייה, ביית חתימה שונה או היעדר רשומת flow החזירו בכל מקרה Invalid request, בעוד sleep-payload איכפה תשובה בדיוק בכמות הזמן הנדרשת.
השפעה ופרס
הפריצה פגעה בפלטפורמה DevSite כולה, ולכן המפתחות ששוקמו איפשרו יצירת סשנים תקפים ב-firebase.google.com, developer.android.com, source.android.com ו-docs.partner.android.com. Google קיבלה דיווח והעניקה פרס של 90,000 דולר, המחושב כ-75,000 דולר בסיס עבור RCE רגיל ב-Google Applications כפול 1.2 בשל חשיבות מיוחדת של הדיווח. הדיווח הוגש ב-6 באוגוסט 2026, אומת והתקבל ב-7 באוגוסט, והפריצה תוקנה ב-7 באוקטובר 2026.
תיקון
Google ביצעה שינוי בארבע שכבות: החליפה את שני סודות הלקוח של OAuth שנחשפו וביטלה סשנים חתומים איתם, לכל התקנה ניתן SECRET_KEY של Flask עם אנטרופיה גבוהה מאוסן בצד השרת שאינו קשור לנתוני OAuth, אובייקט flow של OAuth נשאר בשרת ובעוגיות נשמר רק מצביע אטרום, והחליפה pickle בפורמט מאומת בסכימה של נתונים בלבד לכל דבר, שמחליש את גבול הלקוח. כל שינוי אחד בפני עצמו היה שובר את שרשרת ההתקפה.
מקורות: simonkoeck.com
SiTech — פיתוח אתרים בכוח ה-AI
אנחנו בונים אתרים מהירים ומודרניים ומשלבים AI בתהליכי עבודה אמיתיים. יש לכם פרויקט או שאלה? נשמח לעזור.