Skip to content

Sentry: max_request_body_size="never" — אינטגרציית Starlette קוראת גוף בקשה לפני האימות ובלי דדליין, ובוובאפ אירועי שגיאה נושאים גופי בקשות #3513

Description

@amirbiron

מה מצאתי (בקוד של 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 מודלק, כדי שהתצורה הזו תהיה מקובעת ולא מונחת.

ראה גם

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions