מסד נתונים גרפי, חשבון Azure רגיל, וכמה דקות של הקמה. זה כל מה שחוקר היה צריך כדי להגיע למפתח יחיד שפותח כמעט כל מסד נתונים אחר שרץ על Azure Cosmos DB, כולל של ארגונים אחרים לגמרי ובאזורים אחרים בעולם.

צוות המחקר של Wiz פרסם השבוע את הפרטים של חולשה שקראו לה CosmosEscape. בקצה של שרשרת הניצול ישב מה שהחוקרים מכנים Master Key: מפתח־על ברמת הפלטפורמה כולה, שאיתו אפשר היה לשלוף את מפתחות הגישה של חשבונות Cosmos DB אחרים ולקרוא את הנתונים שלהם ישירות. מיקרוסופט כבר תיקנה את הבעיה, ולפי הדיווח לא נמצאה עדות לשימוש לרעה מחוץ למחקר עצמו. בהמשך נראה איך בורחים משאילתה תמימה אל הרצת קוד על התשתית, ולמה דווקא הרכיב שאמור לבודד לקוחות זה מזה הפך למפתח שפתח את כולם.

רגע, מה זה Cosmos DB ולמה Gremlin

Azure Cosmos DB הוא שירות מסדי הנתונים המבוזר של מיקרוסופט, כזה שמריץ את אותו מסד נתונים במקביל בכמה אזורים בעולם. הוא לא רק עוד מוצר בקטלוג. לפי Wiz, חלקים מרכזיים ב-Azure עצמו נשענים עליו, בהם Microsoft Entra ID (שירות הזהויות), Teams ו-Copilot. כשמסד נתונים אחד מחזיק כל כך הרבה מעל, כל סדק בו נהיה מעניין.

המוצר תומך בכמה שפות שאילתה וממשקים, וזה חלק מהעיצוב שלו: אותו חשבון יכול להיות נגיש דרך ממשק שנראה כמו SQL, כמו MongoDB, כמו Cassandra או דרך Gremlin. לזכור את הריבוי הזה יעזור בהמשך, כי הוא בדיוק מה שהפך את המפתח שהחוקרים מצאו לכל כך רחב. Gremlin עצמה היא שפה לתשאול גרפים, כלומר רשתות של צמתים והקשרים ביניהם.

מבחינת המשתמש זה נראה תמים: כותבים שאילתת Gremlin, השרת מריץ אותה ומחזיר תוצאה. מתחת למכסה המנוע קורה משהו פחות תמים. השרת מתרגם כל שאילתת Gremlin לקוד .NET ומריץ אותו אצלו, בתוך מערכת הגבלות שנועדה לוודא שהשאילתה לא תעשה שום דבר מעבר לפעולות גרף. ההגבלות האלה הן ה-sandbox, ארגז החול שאמור להשאיר את הקוד שהמשתמש הזריק כלוא בתוך גבולות ברורים.

איך בורחים מארגז החול

כאן נכנסת החולשה. ההגבלות של ארגז החול, כך מצאו החוקרים, לא לקחו בחשבון מנגנון בשם .NET reflection. בקצרה, reflection הוא יכולת של קוד .NET לבחון ולקרוא לקוד אחר לפי שם בזמן ריצה, כלומר לעקוף את מה שהוגדר מראש בזמן ההידור ולהגיע לפונקציות שהיו אמורות להיות מחוץ להישג יד. הפער הזה הספיק. reflection הוא מהחשודים המיידיים בבריחות מ-sandbox: כמעט כל מערכת שמנסה לכלוא קוד מנוהל צריכה לזכור לחסום גם את הדרך העקיפה, קריאה לפונקציות לפי שם, וזה בדיוק מה שקל לשכוח כשמתמקדים בחסימת הקריאות הישירות.

מכאן זה נבנה שלב אחר שלב. דרך ה-reflection הרכיבו החוקרים קודם יכולת לקרוא קבצים מהשרת, אחר כך יכולת לכתוב קבצים, ומרגע שאפשר גם לקרוא וגם לכתוב על מערכת הקבצים, הדרך להרצת קוד כללית קצרה. ההוכחה שהם מביאים פשוטה ומצמררת בפשטותה: הרצה של הפקודה hostname על השרת האחורי של Cosmos DB, ישירות מתוך שאילתת Gremlin. ברגע שאפשר להריץ hostname, אפשר להריץ כמעט הכול.

עד כאן זה סיפור מוכר של בריחת sandbox: הזרקת קוד לרכיב, ניצול פער בהגבלות, יציאה החוצה. מה שהופך את CosmosEscape למשהו גדול יותר הוא איפה בדיוק הקוד הזה רץ.

המפתח שפתח את הכל

הקוד רץ על רכיב שנקרא DB Gateway, השער שמקבל את שאילתות הלקוחות ומעביר אותן הלאה. ה-Gateway הזה לא רץ בנפרד לכל לקוח. הוא יושב על אשכולות Service Fabric משותפים, כלומר אותו רכיב פיזי משרת בו-זמנית לקוחות רבים ושונים. וכדי להגיע למסד הנתונים של הלקוח, ה-Gateway עושה בדיוק מה שכל קליינט של Cosmos DB עושה: ניגש עם מפתח הגישה הראשי של החשבון.

וכאן החוקרים מצאו את הפרס. על ה-Gateway היה זמין ה-Master Key, מפתח חתימה ברמת הפלטפורמה שעבד לרוחב הכול: חוצה לקוחות, חוצה אזורים, ואפילו חוצה סוגי ממשק, כלומר עבד מול חשבונות שהוגדרו ב-SQL, ב-MongoDB, ב-Cassandra וב-Gremlin באותה מידה. לצידו ישב רכיב בשם Config Store, שהוא בעצמו מסד Cosmos DB, ובו רשומים שמות החשבונות, מזהי המנוי (subscription IDs), מזהי הארגון (tenant IDs), הגדרות רשת ותגיות.

מכאן שרשרת התקיפה מתקצרת למשפט אחד: מתשאלים את ה-Config Store כדי לאתר ארגון יעד, מושכים איתו ובעזרת ה-Master Key את מפתח הגישה הראשי של אותו ארגון, וקוראים את מסד הנתונים שלו כאילו הוא שלכם. בידוד הרשת, המחיצה שאמורה למנוע מלקוח אחד להגיע לרשת של לקוח אחר, נאכף מתוך ה-Gateway עצמו. מי שכבר מריץ קוד על ה-Gateway נמצא כבר בצד הפנימי של המחיצה.

וזו רק חצי מהתמונה. ל-Config Store לא הייתה רק גישת קריאה אלא גם גישת כתיבה, ולפי החוקרים המשמעות היא שתוקף יכול היה לא רק לקרוא את הגדרות הרשת של חשבונות אחרים אלא גם לשנות אותן. במילים אחרות, לדרוס את הגדרות בידוד הרשת של חשבון סגור ולפתוח אותו לגישה מבחוץ. מפתח קריאה לכל מסד נתונים זה כבר חמור. היכולת לשכתב למי מותר להגיע לחשבון לוקחת את זה צעד נוסף.

ומה נדרש כדי להתחיל בכל זה? כמעט כלום. "התנאי המקדים היחיד היה חשבון Azure סטנדרטי עם מסד נתונים מסוג Gremlin שבשליטת התוקף, שאפשר להקים בתוך דקות", כתבו החוקרים. בלי הרשאות מיוחדות, בלי גישת פנים, בלי דריסת רגל קודמת ברשת של הקורבן.

איפה זה יושב בנוף

זו לא הפעם הראשונה ש-Cosmos DB מקבל ממצא חוצה־לקוחות, וגם לא הפעם הראשונה שהוא מגיע מ-Wiz. לפי The Hacker News, CosmosEscape נבדל משתי חולשות מוקדמות יותר, ChaosDB ו-CosMiss (2021 עד 2022), שישבו ברכיב אחר לגמרי, פיצ\'ר ה-Jupyter Notebook. החוט המשותף הוא לא הרכיב הספציפי אלא המודל: בענן ציבורי, לקוחות רבים חולקים אותה תשתית, ובאג בודד ברכיב משותף אחד יכול לחצות את הגבול שהלקוח מניח שהוא מוצק. וכשהתשתית הזאת מחזיקה מתחתיה שירותי ליבה כמו Entra ID, Teams ו-Copilot, טווח הפגיעה האפשרי לא נעצר בגניבת נתונים מלקוח בודד אלא נוגע בשכבות שכל Azure נשען עליהן.

התגובה של מיקרוסופט הייתה מהירה. לפי לוח הזמנים של Wiz, החולשה דווחה ב-20 בנובמבר 2025, וכבר ב-22 בנובמבר הוטמע תיקון חירום שחסם את נקודת הכניסה דרך Gremlin. משם התחילה עבודה ארוכה יותר על התשתית, והפריסה המלאה על פני כל האזורים הסתיימה ביולי 2026. מיקרוסופט מסרה שלא נמצאה עדות לפעילות בלתי מורשית מעבר לבדיקות של החוקרים, ושלא נדרשה שום פעולה מצד הלקוחות. את פרטי שרשרת הניצול המלאה מתכננים ב-Wiz להציג בכנס Black Hat USA ב-6 באוגוסט.

מה זה אומר בפועל

ללקוחות Cosmos DB אין כאן מה לתקן: התיקון כולו בצד של מיקרוסופט, וכל מי שמשתמש בשירות כבר מכוסה. מה שכן שווה לקחת הוא את התזכורת על גבולות האחריות בענן. הספק אחראי על השכבה המשותפת, אבל הצד שלכם עדיין כולל ניטור הגישה לחשבונות, החלפה תקופתית של מפתחות הגישה, והנחת יסוד בריאה שהמחיצה בין לקוחות היא חזקה אבל לא קסומה. חולשה אחת ברכיב הנכון, וגם היא נבקעת.