Skip to content

קריסת תצורה בעלייה מעתיקה ללוג קטעים מערכי משתני הסביבה — כולל סודות (config.py) #3503

Description

@amirbiron

עלה בעבודה על PR #3502 (העלאת תוכן ארוך ל-CodeKeeper בלי לעבור דרך המודל). מחוץ לתחום שלו, ולכן לא תוקן שם.

הבעיה במשפט אחד

כשהתצורה נכשלת בזמן import — למשל כש-BOT_TOKEN חסר — config.py זורק ValueError(str(exc)), וה-str() של ValidationError ב-pydantic כולל את input_value: הייצוג של המילון שנאסף מהסביבה, מקוצר אבל עם תחילתו וסופו. כלומר קטעים מערכים של משתני סביבה אחרים — טוקנים, כתובת מונגו עם סיסמה — נכנסים להודעת החריגה, ומשם ל-traceback בלוג של השירות.

מה נבדק (main, 928addc)

  • config.py#L689-L693: config = load_config() בתוך try, ו-raise ValueError(str(exc)) from exc.
  • config.py#L485-L490: ה-model_config של BotConfig, בלי hide_input_in_errors.
  • שחזור (30.09, pydantic 2.12.3, pydantic-settings 2.11.0): מחלקת BaseSettings עם שדה חובה חסר, וסוד מזויף במשתנה סביבה אחר. str(exc) הכיל את הסוד המזויף. אותה מחלקה עם hide_input_in_errors=True ב-model_config לא הכילה אותו, וגם לא את input_value.
  • ובסביבה אמיתית: import mcp_server.app בלי BOT_TOKEN ו-MONGODB_URL הדפיס בשגיאה קטע מטוקן שהיה בסביבה.

hide_input_in_errors מתועד ב-pydantic/config.py של הגרסה המותקנת: "You can hide the input value and type by setting the hide_input_in_errors config to True".

מה זה עושה בפועל

קריסת עלייה בגלל משתנה חסר או שגוי — בדיוק הרגע שבו מישהו פותח את הלוגים — מעתיקה לתוכם קטעים של סודות. זה secret-in-derived-text (K13) ב-amir-bug-patterns: הסוד לא נרשם ישירות, הוא נגזר לתוך טקסט של חריגה.

כיוון לתיקון (לא החלטה — לדיון)

  1. hide_input_in_errors=True ב-SettingsConfigDict של BotConfig. זה השורש: הדליפה נוצרת בעיבוד השגיאה של pydantic, וההגדרה מסירה את הקלט מכל שגיאת ולידציה של המחלקה, לא רק בעלייה. BotConfig היא מחלקת ה-BaseSettings היחידה בקוד (scripts/audit_config_definitions.py רק קורא את שמות השדות).
  2. ה-ValueError נשאר (לפי ההערה בקוד, יש טסט שמצפה לו בזמן import); אחרי סעיף 1 הטקסט שלו כבר לא נושא קלט.
  3. טסט בתת-תהליך (-B): שדה חובה חסר וסוד-דגל במשתנה אחר, והודעת השגיאה אינה מכילה את הדגל. הטסט צריך ליפול על הקוד הנוכחי.

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