איך SPACE מנתבת בקשות להרצה הנכונה של ארגז החול
SPACE של Perplexity קושרת בקשות של סוכני AI להרצה הנכונה של ארגז החול באמצעות בדיקות זהות ונתיבים חתומים.

כשמישהו מבקש מסוכן AI לנתח גיליון אלקטרוני או לבדוק תוכנה, הוא סומך עליו שיעבוד בבטחה עם הקבצים והנתונים שלו. סוכנים זקוקים לסביבות מבודדות שבהן הם יכולים לבצע את העבודה הזו בלי לחשוף נתונים של משתמשים אחרים או להפריע לעומסי העבודה שלהם.
ככל שסוכנים לוקחים על עצמם משימות מורכבות יותר עם יותר אוטונומיה, הסביבות האלה עוזרות להכיל טעויות ולהגביל את הנזק שקוד לא בטוח או זדוני עלול לגרום. ארגזי חול מספקים את הבידוד הזה תוך שיתוף של שירותי מישור הבקרה, צמתי העבודה ותשתית הניתוב.
התשתית המשותפת הזו חייבת להעביר כל פעולה להרצה שמורשית לטפל בה. נתיב מיושן עלול לשלוח בקשה תקפה לארגז חול אחר, או להרצה ישנה יותר של ארגז החול הנכון. SPACE, פלטפורמת ארגזי החול המאובטחת של Perplexity, קושרת כל פעולה להרצה שנבחרה ובודקת את היעד לפני ההעברה.
כבר חודשים ש-SPACE מטפל במיליוני הרצות ביום, כשכל אחת מהן מוגנת באמצעות זהות קריפטוגרפית ייחודית, עם שיעור שגיאות של פחות מ-0.0002% ובלי אף חיבור שנותק.
בעיית הניתוב
אבטחת ארגזי חול תלויה גם בכך שכל בקשה תגיע ליעד הנכון. אפילו קריאת קובץ פשוטה עוברת דרך תשתית משותפת, שחייבת לעקוב אחר המקום שבו ארגז החול פועל בזמן שהוא מושהה, מחודש או עובר בין מכונות.
קריאת קובץ עוברת דרך כמה רכיבים. מישור הבקרה של SPACE ממפה את ארגז החול להרצה ולצומת עבודה. הבקשה נכנסת דרך node-api, עוברת למנהל ארגז החול, sbx-manager, וחוצה socket של Unix אל גשר המארח, spaced-host. הגשר מעביר אותה דרך VSOCK, מנגנון התעבורה מבוסס ה-socket בין המארח לאורח, אל spaced-guest בתוך ה-microVM של Firecracker.
כל החלטה מסתמכת על מצב שעלול לפגר אחרי שינויים בתשתית. מסד נתונים עשוי לשמור מיקום ישן, כתובת שמורה במטמון עשויה להצביע למקום אחר, ונתיב socket עשוי לקבל מאזין אחר. גם חיבור מוצלח עדיין עלול להגיע ליעד השגוי. קריאה עלולה לחשוף נתונים של משתמש אחר; כתיבה עלולה לשנות את מערכת הקבצים הלא נכונה.
תמונות מצב (snapshots) מוסיפות בעיה נוספת. חידוש ארגז חול בצומת עבודה אחר משמר את הזהות הלוגית שלו, אבל מתחיל הרצה חדשה. בקשה שהתעכבה או חיבור ששרד עלולים להגיע להרצה הקודמת ולהחזיר מצב ישן תחת השם הנכון של ארגז החול.
זהות ארגז החול וזהות ההרצה
SPACE מפרידה בין סביבת המשתמש לבין סביבת הריצה שמשרתת אותה:
- זהות ארגז החול: המזהה הקבוע של הסביבה הלוגית. אימות ההרשאה של הגורם הקורא קובע את הגישה לארגז החול הזה.
- זהות נתיב/הרצה: מופע זמן הריצה שנבחר והמיקום שלו, כולל ה-worker, התשתית (substrate) וההפעלה שלו.
דור הרצה מבחין בין מופעים של סביבת הריצה. ב-Kubernetes, הנתיב כולל גם את ה-UID של ה-pod. כתובות מאתרות נקודות קצה; זהות ההרצה קובעת אם נקודות הקצה האלה רשאיות לשרת את הפעולה.
נניח שארגז החול S פועל כהרצה 7 בצומת העבודה A, ולאחר מכן מחודש כהרצה 8 בצומת העבודה B. בקשה שנבחרה עבור הרצה 8 חייבת להיכשל אם היא מגיעה להרצה 7. בדיקה של מזהה ארגז החול בלבד לא הייתה מזהה את אי-ההתאמה.
בחירה חתומה של הרצה
כל בקשה נושאת הוכחה חתומה שמציינת איזו הרצה של ארגז החול רשאית לטפל בה ואיזו גישה מותרת. הרכיב המקבל בודק את ההוכחה מול זהות סביבת הריצה שלו לפני שהוא מאפשר לבקשה להמשיך.
לאחר אימות ההרשאה של הגורם הקורא, SPACE מנפיקה אסימון יכולת חתום וקצר מועד שמזהה את ארגז החול, ההרצה, המיקום והגישה המותרת. אסימוני יכולת של פורטי שירות ציבוריים מציינים גם את הפורט והפרוטוקול המותרים.
מנהל ארגז החול המקבל מאמת את החתימה ומשווה את הזהות המלאה לרשומת סביבת הריצה שנשמרה אצלו באופן מקומי. החתימה קובעת מי אישר את הבחירה. ההשוואה קובעת אם הבחירה הזו תואמת את הצד המקבל.
תעבורת ServicePort עוברת בדיקה שנייה בשער הרשת של כל ארגז חול, netgtw, לפני שנפתח חיבור לאורח. השער משווה את הזהות למצב אקטיבציה מהימן ובודק את הפורט והפרוטוקול. פעולות בקרה ממשיכות לאימות נקודות הקצה של הגשר.
SPACE משתמשת בחתימות Ed25519. מפתחות החתימה של מישור הבקרה מנפיקים אסימוני יכולת; מפתחות האימות הציבוריים בצמתי העבודה ובשערים לא יכולים להנפיק אותם.
אסימוני היכולת תקפים למשך 120 שניות, עם מרווח של עד 15 שניות להפרשי שעון בבדיקת התפוגה. חתימה תקפה ואסימון שתוקפו לא פג עדיין אינם מספיקים כשהזהות שנבחרה והזהות המותקנת אינן תואמות.
דחייה ביעד השגוי
צומת העבודה המקבל יכול לזהות טעות ניתוב גם כשהבקשה עצמה מורשית. הוא בודק אם הוא מריץ את ההרצה שנבחרה עבור הבקשה הזו, ודוחה את הבקשה אם יש אי-התאמה.
אם בקשה שנבחרה עבור הרצה 8 מגיעה ל-worker A, שעדיין משרת את הרצה 7, worker A דוחה אותה לפני שהוא מעביר אותה הלאה. ברגע שנמען מתקין את הזהות של הרצה 8, הוא דוחה גם יכולות (capabilities) של הרצה 7, עוד לפני שתוקפן פג.
לערובה הזו יש גבול חשוב. אסימון יכולת עבור הרצה 7 עדיין עשוי להתאים לצומת עבודה שמשרת את הרצה 7, עד שצומת העבודה יידע על הוצאתה משימוש או עד שתוקף האסימון יפוג. אכיפה מקומית ואורך חיים מוגבל של אסימוני היכולת פועלים יחד בזמן שהעדכונים מופצים.
אימות נקודות הקצה של הגשר
רשומת סביבת ריצה תואמת קובעת מהי ההרצה המיועדת. גשר הבקרה חייב גם להגיע לתהליכים ולשכבת התעבורה ששייכים לאקטיבציה הזו, ולא לתחליף שירש את אותה כתובת.
מנהלי ארגז החול והצמתים מאמתים את אישורי ה-peer של גשר המארח ואת זהויות התהליכים של הגשר ושל Firecracker, כולל זמני ההתחלה, ובכך מזהים מזהים שנעשה בהם שימוש חוזר או קובצי הפעלה שהשתנו
בדיקות שכבת התעבורה קושרות את מאזין ה-VSOCK לתהליך ה-Firecracker הצפוי באמצעות הבעלות על ה-socket, זהות האורח וראיות מה-socket ברמת הקרנל. הגשר מעביר פעולות רק לאחר האימות ומסרב לחיבורים מחדש שקופים. כל חיבור חדש חייב לעבור שוב את הבדיקות.
האימות הזה חל על גשר הבקרה של Firecracker ב-Kubernetes ובמארחים המנוהלים ישירות. תעבורת ServicePort עוברת בדיקות של הרצה ושל פורט בשער שלה; היא לא מאשרת את הזהות של אפליקציה שרירותית בתוך האורח.
אורך החיים של זרמים ושחזור נתיבים
חלק מהחיבורים נשארים פתוחים בזמן שההרצה של ארגז החול משתנה, ולכן בדיקות הזהות חייבות להימשך גם מעבר לבקשה הראשונית. SPACE מוציאה משימוש חיבורים שקשורים להרצה הישנה, ומאפשרת לפעולות שעומדות בתנאים להתחבר מחדש להרצה הנוכחית תחת אותן בדיקות אבטחה.
מסופים ומעקבי קבצים עשויים להמשיך להתקיים אחרי הבקשות שפתחו אותם. SPACE קושרת זרמי backend לתקופת זהות (identity epoch), כך שזרם לא יכול להישאר מחובר להרצה הקודמת אחרי שהצד המקבל מתקין הרצה חלופית.
SPACE בודקת שוב את הזהות השמורה לפני פתיחת זרם. החלפת הנתיב או ההרצה שלו מבטלת את החכירה (lease) של הזרם ועוצרת את הקלט והפלט.
שינויי בעלות שונים מהחלפת הרצה. העברת האחריות על פעולת מחזור חיים, כשהמופע ב-Kubernetes נשאר ללא שינוי, משמרת את זהות הנתיב שלו, את אסימוני היכולת שתוקפם לא פג ואת הזרמים. השער גם משמר זרמים קיימים כשהשינויים נוגעים רק לניסיון האקטיבציה, באותו נתיב ובאותו דור הרצה. פתיחה של זרמים חדשים מחייבת את הזהות המעודכנת.
תהליך ההתאוששות שומר על הבדיקות האלה בשלמותן. משווה הזהויות יכול להחזיר RefreshRoute במקרה של אי-התאמה במופע בתוך אותו ארגז חול, או Deny עבור ארגז חול אחר. רק אות רענון מוכר מפעיל תיקון נתיב אחרי דחיית זהות. כשלי תעבורה כפופים לכללי התאוששות נפרדים, הספציפיים לכל פעולה. חתימות, ייעודים (purposes) או פרופילי פורטים לא תקינים ממשיכים להידחות.
פעולה שעומדת בתנאים יכולה לאתר את ההרצה הנוכחית ולבצע ניסיון חוזר אחד עם בקשה שנבנתה מחדש. החלפת הרשומה במטמון מתבצעת רק אם היא עדיין מכילה את הנתיב שנדחה, וכך דחייה שהתעכבה לא יכולה לפנות רשומה חדשה יותר. רענון של הפעלה מקורית (native session) משמר את מועד התפוגה שנקבע במקור למטמון, ובכך מפריד בין תיקון הנתיב לבין חידוש ההרשאה של הגורם הקורא.
כללי השידור החוזר (replay) נשארים ספציפיים לכל פעולה. רכיב backend חלופי חייב לעבור שוב את בקרת הקבלה, גם כשה-WebSocket הפונה ללקוח נשאר פתוח.
פשרות וגבולות אמון
זהות ההרצה הופכת למצב קריטי לאבטחה. עדכונים של מישור הבקרה וחבילות של מפתחות אימות חייבים להגיע לרכיבים המשרתים, וההוצאה משימוש נכנסת לתוקף כשכל צד מקבל מתקין את העדכון. אורך חיים קצר של אסימוני היכולת מגביל שימוש חוזר בהם בזמן ההפצה.
התכנון מניח שאכיפת הזהות מופעלת, וסומך על החותם של מישור הבקרה, על הקרנל של צומת העבודה ועל שירותי הניהול המקומיים בצומת. פריצה להרשאות root בצומת העבודה או לחשבון מנהל אשכול בעל הרשאות מיוחדות נמצאת מחוץ למודל האיומים. אימות הגשר הוא אימות מקומי של תהליכים ושל שכבת התעבורה, ולא אישור מרחוק (remote attestation) המבוסס על חומרה.
אימות חתימות, השוואות של סביבת הריצה ואימות הגשר מוסיפים עבודה לנתיב הבקשה. הם מסתמכים על מצב מקומי, ולא על בדיקת הרשאה מרוחקת בכל קפיצה פרטית.
השוואה לתעשייה
ההשוואה הרלוונטית היא האופן שבו פלטפורמות מטפלות בבקשה מורשית שמגיעה להרצה השגויה של ארגז החול הנכון. הממצאים האלה נוגעים למימושים שנבדקו, ולא לאבטחת הפלטפורמות באופן כללי. SPACE, OpenShell ו-E2B נבדקו ב-8 באוקטובר 2026:
- OpenShell: מספקת בחירת הרצה דומה לקריאות חדשות וקישור דומה בין ה-supervisor לסביבת הריצה, באמצעות בדיקות דור ובדיקות הרשאה בשער, אימות זהות ה-backend ווידוא של חיבורי supervisor פעילים (קבלה בשער, אימות וקישור של סביבת הריצה). SPACE מעבירה בחירה חתומה לאורך נתיב השירות שלה ומוסיפה אימות מקומי של תהליכים ושל שכבת התעבורה בצומת העבודה; OpenShell מפזרת בדיקות מקבילות בין השער, זהות ההשקה ופרוטוקול סביבת הריצה המאומת (תכנון סביבת הריצה).
- E2B: עוקבת אחר מזהי הרצה ומבודדת מאגרי proxy לפי מחזור החיים של Firecracker, אבל ה-proxy הנכנס שלה בוחר את ארגז החול הלוגי ואת הפורט בלי זהות הרצה צפויה שהצד המקבל יכול להשוות אליה (פרסום נתיבים, קבלה ב-proxy). הבדיקות האלה לא יכולות להבחין בין הרצה ישנה יותר שעדיין רשומה כפעילה בצד מקבל מיושן עם אישורים תואמים לבין ההרצה החדשה יותר שנבחרה, אף שתהליך הפירוק הרגיל מסיר נתיבים וסוגר חיבורים הקשורים למחזור החיים (אישורים, פירוק).
- CubeSandbox: מתקנת את הניתוב בעת חידוש ומבטלת את תוקף המטמונים, אבל תעבורת ingress פרטית משתמשת באישורים ברמת ארגז החול ומעבירה בקשות בלי לציין את מופע סביבת הריצה הצפוי (ניתוב בעת חידוש, ניתוב ingress). תיקון הנתיבים מקצר את פרקי הזמן שבהם נתיבים מיושנים נשארים בשימוש; אסימון היכולת של SPACE, הקשור להרצה מסוימת, מספק גם לצד המקבל בסיס עצמאי לדחיית המופע השגוי.
זהות כגבול בידוד
האצלה בטוחה תלויה בשמירה על עבודתו של כל סוכן בתוך הגבולות שנועדו לו. מכונה וירטואלית זעירה (microVM) מספקת בידוד, ואילו הפלטפורמה שסביבה חייבת להבטיח שכל בקשה וכל חיבור מתמשך יגיעו להרצה שמורשית לטפל בהם.
SPACE הופכת את זהות ההרצה לחלק מההגנה הזו. באמצעות בדיקת יעדים, אימות נקודות הקצה של הגשר וקשירת חיבורים להרצה שאישרה אותם, היא משמרת את הגבולות האלה גם כשארגזי חול מושהים, מחודשים ועוברים ממקום למקום.
אנחנו ממשיכים בעבודה הזו ככל שהתשתית מתפתחת. ב-SPACE ובפלטפורמות ארגזי חול אחרות, אבטחה מחייבת לבדוק את הנתיבים האלה מול טעויות ניתוב שגרתיות וגם מול עומסי עבודה עוינים, ולאחר מכן לחזק את הגבולות בכל מקום שבו הבדיקות חושפות פערים.