חוקר אבטחה שסרק 24 פרויקטים של שרתי MCP (Model-Control-Protocol) בקוד פתוח חשף פרצת הזרקת פקודות (command-injection) חמורה בתוך סביבת ארגז חול (sandbox), שקיבלה ציון של 9.8 בסולם CVSS. הבאג נמצא ב-AgenticX, מסגרת עבודה (framework) של סוכני AI בדרגת ביניים, ומאפשר לתוקף להזריק פקודות shell שרירותיות לתוך קונטיינר ה-Docker שמריץ את השרת.
למה שרתי MCP חשובים
MCP הוא ה"דבק" המאפשר לסוכני AI אוטונומיים לתקשר עם כלים חיצוניים — קבצים, מסדי נתונים, דפדפנים וכדומה. מפתחים מטמיעים שרת MCP בתוך האפליקציות שלהם כדי להעניק למודל שפה את היכולת לקרוא, לכתוב ולפעול על משאבים בעולם האמיתי. הפרוטוקול עצמו הוא קל משקל ומאומץ על ידי רבים, אך האחריות לאבטחת הקוד הסובב אותו מוטלת על המפתחים של כל פרויקט.
מימושי MCP בקנה מידה גדול, כמו Cline או Aider, כבר עוברים ביקורות (audits) קבועות ונהנים מתהליכי אבטחה בשלים. 24 הפרויקטים שנבדקו כאן נמצאים בטווח ה-"mid-tier" ב-GitHub, עם בין 100 ל-1,000 כוכבים. מאגרי קוד (repositories) אלו נוטים לעיתים קרובות לתת עדיפות לאספקת תכונות במהירות על פני כתיבת קוד מאובטח (hardened code), מה שיוצר נקודה עיוורת עבור משתמשים המניחים שכל שרת MCP בקוד פתוח הוא בטוח כברירת מחדל.
הסריקה
החוקר בנה סורק שחיפש חמישה דפוסי תקיפה קלאסיים של אפליקציות ווב:
- Command injection
- Path traversal
- Server-Side Request Forgery (SSRF)
- SQL injection
- Sandbox escape
הרצת הסורק על פני 5,911 קבצי מקור הניבה 94 התראות ראשוניות. לאחר מיון ידני (triage), רק התראה אחת התבררה כפגיעות אמיתית.
הצצה אל תוך הבאג ב-AgenticX
AgenticX בונה פקודות shell על ידי השחלה (interpolation) של מחרוזות שסופקו על ידי המשתמש לתוך f-strings של Python, ולאחר מכן מעבירה את התוצאה ישירות ל-shell של הקונטיינר. לא מתבצע אימות (validation) או שימוש בגרשיים (quoting) עבור נתיבי קבצים. לכן, prompt עוין יכול להזריק נקודה-פסיק (semicolon) או תו-מטא (metacharacter) אחר של ה-shell, מה שיגרום לקונטיינר להריץ כל פקודה שהתוקף יבחר.
החוקר תיקן את הקוד על ידי:
- שימוש ב-
shlex.quote()כדי לבצע escape בבטחה לכל נתיב שסופק על ידי מודל השפה. - הוספת בדיקות מפורשות לדפוסי path-traversal (
../) לפני בניית הפקודה.
הרצה חוזרת של הסורק לאחר התיקון הראתה ירידה דרמטית ברמת הסיכון, מה שאישר שהפתרון (mitigation) מטפל בגורם השורשי.
מי מרוויח, מי מפסיד
- מפתחי AI המטמיעים שרת MCP במוצרים שלהם מקבלים כעת דוגמה מוחשית לאופן שבו שלב sanitization (ניקוי קלט) אחד שחסר יכול לשבור שרשרת אבטחה שלמה. התייחסו לכל פרמטר שמגיע ממודל שפה כאל קלט לא מהימן (untrusted input), בדיוק כפי שהייתם מתייחסים לכל payload של API חיצוני.
הצד השני של הסיפור
החוקר מדגיש כי פרוטוקול ה-MCP עצמו נותר תקין. הפגם אינו חולשת עיצוב בפורמט הנתונים (wire format), אלא טעות בכתיבת הקוד במימוש ספציפי. פרויקטים גדולים יותר שעברו ביקורות קפדניות כבר טיפלו בבעיות דומות, וקהילת הקוד הפתוח יכולה ללמוד מתיקון של AgenticX. עם זאת, האירוע מראה שפרויקטים בדרגת "mid-tier" עלולים להכיל באגים בעלי השפעה גבוהה למרות מספר כוכבים צנוע.
שורה תחתונה
f-string אחד לא מאומת ב-AgenticX הפך שרת MCP שלם למנוף להרצת קוד שרירותי. המקרה מוכיח שאבטחת המערכות האקולוגיות (ecosystems) של סוכני AI תלויה פחות בפרוטוקול ויותר במימוש ממושמע. מפתחים חייבים להתייחס לכל פרמטר שנוצר על ידי LLM כאל עוין, פלטפורמות צריכות לאכוף מנגנוני הגנה בזמן ריצה (runtime safeguards), וכלי אבטחה צריכים להתפתח כדי להבין את שרשראות האמון הייחודיות שסוכני AI יוצרים.
Source: dev.to/easterndev/i-scanned-24-mcp-server-projects-and-found-a-real-sandbox-command-injection-cvss-98-4k9h
