מה מצאתי (בקוד של sentry-sdk 2.42.1, ובהרצה)
1. אינטגרציית Starlette קוראת את גוף הבקשה לפני ה-route. היא עוטפת כל route שנבנה ב-Route של Starlette (_sentry_async_func), ובעטיפה, לפני שה-endpoint רץ, מחכה ל-StarletteRequestExtractor.extract_request_info(). כשהאורך המוצהר בתוך max_request_body_size — ברירת המחדל "medium", כלומר עד 10,000 בתים — והגוף אינו JSON, הוא נקרא במלואו (form() ← request.body()), בלי דדליין. והכול יושב בתוך capture_internal_exceptions(), שה-__exit__ שלו מחזיר True לכל חריגה — כולל CancelledError.
2. מה זה אומר ל-PUT /api/agent/upload, אם Sentry יודלק אי פעם בתהליך של ה-MCP. היום הוא לא מודלק שם (נבדק). אבל ה-route הזה מאמת בתוך ה-endpoint — authenticate_bearer הוא השורה הראשונה — ולכן תחת Sentry, בקשה אנונימית עם אורך מוצהר עד 10,000 בתים נקראת במלואה לפני ה-401, ולקוח שמטפטף מחזיק קורוטינה כמה שירצה, כי ל-uvicorn אין timeout לגוף בקשה. זה בדיוק מה ש-SEC-001 (#3443) סגר, נפתח מחדש משכבה שאינה שלנו. נמדד בבדיקות: טסט הטפטוף של ה-route נתקע עד שתקציב ה-5 שניות של הטסט נגמר, והביטול יצא רק ב-await הראשון של ה-route.
3. בוובאפ, היום. ב-Flask הקריאה עצלה — היא קורית רק כשנבנה אירוע — אבל היא קורית: FlaskRequestExtractor.extract_into_event מכניס לכל אירוע שגיאה את גוף הבקשה עד 10,000 בתים (אותה ברירת מחדל "medium"). כלומר אם Sentry מוגדר לוובאפ — ולפי האישוז שנוצרו מ-Sentry בריפו הזה, הוא מוגדר — שגיאה בבקשה ששומרת קוד שולחת ל-Sentry את הקוד עצמו. לא הסתכלתי ב-Sentry כדי לראות אם אירועים כאלה אכן קיימים שם.
הצעה לתיקון
max_request_body_size="never" בשני מקומות האתחול: observability.init_sentry ו-sentry_sdk.init שב-webapp/app.py. עם "never" הפונקציה request_body_within_bounds (sentry_sdk/integrations/_wsgi_common.py) מחזירה False, ולכן אינטגרציית Starlette חוזרת בלי לקרוא את הגוף בכלל, ואינטגרציית Flask מסמנת במקומו "הוסר". המחיר: גופי בקשות לא יופיעו באירועים, כלומר פחות מידע לדיבאג — וכאן פרטיות ומשטח מתקפה חשובים יותר.
ואם יום אחד ירצו את Sentry בשרת ה-MCP, זה תנאי מקדים. יחד עם זה צריך טסט שמריץ את טסט הטפטוף עם Sentry מודלק, כדי שהתצורה הזו תהיה מקובעת ולא מונחת.
ראה גם
מה מצאתי (בקוד של sentry-sdk 2.42.1, ובהרצה)
1. אינטגרציית Starlette קוראת את גוף הבקשה לפני ה-route. היא עוטפת כל route שנבנה ב-
Routeשל Starlette (_sentry_async_func), ובעטיפה, לפני שה-endpoint רץ, מחכה ל-StarletteRequestExtractor.extract_request_info(). כשהאורך המוצהר בתוךmax_request_body_size— ברירת המחדל"medium", כלומר עד 10,000 בתים — והגוף אינו JSON, הוא נקרא במלואו (form()←request.body()), בלי דדליין. והכול יושב בתוךcapture_internal_exceptions(), שה-__exit__שלו מחזירTrueלכל חריגה — כוללCancelledError.2. מה זה אומר ל-
PUT /api/agent/upload, אם Sentry יודלק אי פעם בתהליך של ה-MCP. היום הוא לא מודלק שם (נבדק). אבל ה-route הזה מאמת בתוך ה-endpoint —authenticate_bearerהוא השורה הראשונה — ולכן תחת Sentry, בקשה אנונימית עם אורך מוצהר עד 10,000 בתים נקראת במלואה לפני ה-401, ולקוח שמטפטף מחזיק קורוטינה כמה שירצה, כי ל-uvicorn אין timeout לגוף בקשה. זה בדיוק מה ש-SEC-001 (#3443) סגר, נפתח מחדש משכבה שאינה שלנו. נמדד בבדיקות: טסט הטפטוף של ה-route נתקע עד שתקציב ה-5 שניות של הטסט נגמר, והביטול יצא רק ב-awaitהראשון של ה-route.3. בוובאפ, היום. ב-Flask הקריאה עצלה — היא קורית רק כשנבנה אירוע — אבל היא קורית:
FlaskRequestExtractor.extract_into_eventמכניס לכל אירוע שגיאה את גוף הבקשה עד 10,000 בתים (אותה ברירת מחדל"medium"). כלומר אם Sentry מוגדר לוובאפ — ולפי האישוז שנוצרו מ-Sentry בריפו הזה, הוא מוגדר — שגיאה בבקשה ששומרת קוד שולחת ל-Sentry את הקוד עצמו. לא הסתכלתי ב-Sentry כדי לראות אם אירועים כאלה אכן קיימים שם.הצעה לתיקון
max_request_body_size="never"בשני מקומות האתחול:observability.init_sentryו-sentry_sdk.initשב-webapp/app.py. עם"never"הפונקציהrequest_body_within_bounds(sentry_sdk/integrations/_wsgi_common.py) מחזירהFalse, ולכן אינטגרציית Starlette חוזרת בלי לקרוא את הגוף בכלל, ואינטגרציית Flask מסמנת במקומו "הוסר". המחיר: גופי בקשות לא יופיעו באירועים, כלומר פחות מידע לדיבאג — וכאן פרטיות ומשטח מתקפה חשובים יותר.ואם יום אחד ירצו את Sentry בשרת ה-MCP, זה תנאי מקדים. יחד עם זה צריך טסט שמריץ את טסט הטפטוף עם Sentry מודלק, כדי שהתצורה הזו תהיה מקובעת ולא מונחת.
ראה גם
bugbot-rules/body-read-outside-cheap-reject.mdו-bugbot-rules/wait-without-own-deadline.mdב-amir-bug-patterns.