FastAPI 0.140.0-0.141.1 עלולות לחשוף את הערכים הגולמיים העטופים על ידי מחלקות ה-Secret של Pydantic כאשר נתיב (route) מחזיר מילון (dictionary) או רשימה (list) פשוטים ללא מודל תגובה (response model). הדליפה עלולה לחשוף סיסמאות, מפתחות API או כל פרט זיהוי (credential) אחר שמפתח ניסה להסתיר.
למה הבאג הזה חשוב
FastAPI בונה תגובות JSON על ידי בדיקת סוג הערך המוחזר מפונקציית התצוגה (view function). אם מספקים מודל תגובה, FastAPI מעבירה את האובייקט ל-Pydantic, שמסווה את SecretStr כ-"**********". בגרסאות המושפעות, המסגרת (framework) מזהה רק את סוג ה-SecretStr המובנה. כאשר יוצרים תת-מחלקה (subclass) של Secret (או משתמשים בסוג סוד מותאם אישית) ומחזירים את האובייקט בתוך dict או list גולמיים, FastAPI חוזרת להמרה גנרית של אובייקט ל-dict. המרה זו מגיעה למאפיין הפרטי (private attribute) שמחזיק את ערך הסוד בפועל ושולחת אותו ללקוח ללא שינוי.
הדליפה מתרחשת רק כאשר כל שלושת התנאים מתקיימים:
- סוג הסוד הוא תת-מחלקה (subclass) של מחלקת הבסיס
Secretשל Pydantic. - הנתיב (route) אינו מצהיר על מודל תגובה (response model).
- התצוגה מחזירה את הסוד בתוך
dictאוlistפשוטים.
איך להגן על הסודות שלכם כבר היום
- צהירו על מודל תגובה (response model) עבור כל נקודת קצה (endpoint) שעשויה להחזיר נתונים המכילים סודות. FastAPI תאפשר אז ל-Pydantic לטפל בסריאליזציה (serialization), מה שיסווה את הערכים כראוי.
- עטפו סודות בתוך שדה
BaseModelשל Pydantic במקום להחזיר מכולות (containers) גולמיים. סוג השדה של המודל יכול להיות מחלקת סוד מוכרת, מה שיבטיח טיפול תקין. - רשמו JSON encoder מותאם אישית עבור תת-המחלקת של הסוד שלכם אם אתם חייבים לשמור על סגנון ההחזרה הנוכחי. ה-encoder יכול להחזיר את הייצוג המוסתר (
"**********").
חומרה ותגובת הקהילה
רמת החומרה של הבעיה היא נמוכה. היא דורשת הגדרה ספציפית כדי להפעיל אותה, אך כל חשיפה מקרית של פרטי זיהוי (credentials) מהווה סיכון, במיוחד ב-APIs ציבוריים או בשירותים המתעדים (log) תגובות.
שורה תחתונה: השמטת מודל תגובה עלולה להפוך עטיפת סוד שנועדה להגן על המידע לדליפת נתונים. הוספת מודלי תגובה מפורשים או encoders מותאמים אישית היא דרך זולה ואמינה לשמור על פרטי הזיהוי חסויים עד ש-FastAPI תוציא תיקון מובנה.
