FastAPI 0.140.0-0.141.1 പതിപ്പുകളിൽ, ഒരു റൂട്ട് (route) റെസ്പോൺസ് മോഡൽ (response model) ഇല്ലാതെ ഒരു പ്ലെയിൻ ഡിക്ഷണറിയോ (dictionary) ലിസ്റ്റോ (list) തിരികെ നൽകുന്ന സാഹചര്യത്തിൽ, Pydantic-ന്റെ Secret ക്ലാസുകൾക്കുള്ളിലെ യഥാർത്ഥ മൂല്യങ്ങൾ (raw values) വെളിപ്പെട്ടേക്കാം. ഈ ചോർച്ച (leak) പാസ്വേഡുകൾ, API കീകൾ അല്ലെങ്കിൽ ഒരു ഡെവലപ്പർ മറച്ചുവെക്കാൻ ശ്രമിച്ച മറ്റേതെങ്കിലും വിവരങ്ങൾ വെളിപ്പെടുത്തിയേക്കാം.
ഈ ബഗ് പ്രധാനമായിരിക്കുന്നത് എന്തുകൊണ്ട്
ഒരു വ്യൂ ഫംഗ്ഷന്റെ (view function) റിട്ടേൺ ടൈപ്പ് പരിശോധിച്ചുകൊണ്ടാണ് FastAPI JSON റെസ്പോൺസുകൾ നിർമ്മിക്കുന്നത്. നിങ്ങൾ ഒരു റെസ്പോൺസ് മോഡൽ നൽകുകയാണെങ്കിൽ, FastAPI ആ ഒബ്ജക്റ്റിനെ Pydantic-ന് കൈമാറുന്നു, അത് SecretStr-നെ "**********" എന്ന് മാസ്ക് (mask) ചെയ്യുന്നു. ബാധിക്കപ്പെട്ട പതിപ്പുകളിൽ, ഫ്രെയിംവർക്ക് ബിൽറ്റ്-ഇൻ SecretStr ടൈപ്പ് മാത്രമേ തിരിച്ചറിയുന്നുള്ളൂ. നിങ്ങൾ Secret-ന്റെ ഒരു സബ്ക്ലാസ് (subclass) ഉപയോഗിക്കുകയോ അല്ലെങ്കിൽ ഒരു കസ്റ്റം സീക്രട്ട് ടൈപ്പ് ഉപയോഗിക്കുകയോ ചെയ്യുകയും, ഒരു പ്ലെയിൻ ഡിക്റ്ററിനുള്ളിലോ ലിസ്റ്റിനുള്ളിലോ ആ ഒബ്ജക്റ്റ് തിരികെ നൽകുകയും ചെയ്യുമ്പോൾ, FastAPI ഒരു ജനറിക് ഒബ്ജക്റ്റ്-ടു-ഡിക്റ്റ് (object-to-dict) കൺവേർഷനിലേക്ക് മാറുന്നു. ഈ കൺവേർഷൻ യഥാർത്ഥ സീക്രട്ട് മൂല്യം സൂക്ഷിച്ചിരിക്കുന്ന പ്രൈവറ്റ് അറ്റ്രിബ്യൂട്ടിലേക്ക് (private attribute) എത്തിച്ചേരുകയും അത് മാറ്റമില്ലാതെ ക്ലയന്റിന് അയച്ചുകൊടുക്കുകയും ചെയ്യുന്നു.
താഴെ പറയുന്ന മൂന്ന് നിബന്ധനകളും ഒരേസമയം പാലിക്കപ്പെടുമ്പോൾ മാത്രമേ ഈ ചോർച്ച സംഭവിക്കൂ:
- സീക്രട്ട് ടൈപ്പ് Pydantic-ന്റെ
Secretബേസ് ക്ലാസിന്റെ സബ്ക്ലാസ് ആയിരിക്കണം. - റൂട്ടിൽ ഒരു റെസ്പോൺസ് മോഡൽ പ്രഖ്യാപിച്ചിരിക്കാൻ പാടില്ല (not).
- വ്യൂ ഒരു പ്ലെയിൻ
dictഅല്ലെങ്കിൽlist-നുള്ളിൽ സീക്രട്ട് തിരികെ നൽകണം.
നിങ്ങളുടെ സീക്രട്ടുകൾ ഇന്ന് എങ്ങനെ സംരക്ഷിക്കാം
- സീക്രട്ടുകൾ അടങ്ങിയ ഡാറ്റ തിരികെ നൽകാൻ സാധ്യതയുള്ള ഓരോ എൻഡ്പോയിന്റിനും (endpoint) ഒരു റെസ്പോൺസ് മോഡൽ പ്രഖ്യാപിക്കുക. അപ്പോൾ FastAPI, Pydantic-നെ ഉപയോഗിച്ച് സീരിയലൈസേഷൻ (serialization) നടത്തുകയും മൂല്യങ്ങൾ ശരിയായി മാസ്ക് ചെയ്യുകയും ചെയ്യും.
- പ്ലെയിൻ കണ്ടെയ്നറുകൾ തിരികെ നൽകുന്നതിന് പകരം സീക്രട്ടുകൾ ഒരു Pydantic
BaseModelഫീൽഡിനുള്ളിൽ ഉൾപ്പെടുത്തുക. മോഡലിലെ ഫീൽഡ് ടൈപ്പ് തിരിച്ചറിയപ്പെടുന്ന ഒരു സീക്രട്ട് ക്ലാസ് ആയിരിക്കണം, ഇത് ശരിയായ കൈകാര്യം ചെയ്യൽ ഉറപ്പാക്കുന്നു. - നിലവിലെ റിട്ടേൺ രീതി തന്നെ തുടരണമെന്നുണ്ടെങ്കിൽ, നിങ്ങളുടെ സീക്രട്ട് സബ്ക്ലാസിനായി ഒരു കസ്റ്റം JSON എൻകോഡർ (custom JSON encoder) രജിസ്റ്റർ ചെയ്യുക. ഈ എൻകോഡറിന് മാസ്ക് ചെയ്ത രൂപം (
"**********") തിരികെ നൽകാൻ കഴിയും.
ഗൗരവവും കമ്മ്യൂണിറ്റി പ്രതികരണവും
ഈ പ്രശ്നം കുറഞ്ഞ ഗൗരവമുള്ളതാണ് (low severity). ഇത് സംഭവിക്കണമെങ്കിൽ പ്രത്യേകമായ ഒരു ക്രമീകരണം ആവശ്യമാണ്, എങ്കിലും ക്രെഡൻഷ്യലുകൾ അബദ്ധവശാൽ വെളിപ്പെടുന്നത് ഒരു റിസ്ക് ആണ്, പ്രത്യേകിച്ച് പബ്ലിക് API-കളിലോ റെസ്പോൺസുകൾ ലോഗ് ചെയ്യുന്ന സർവീസുകളിലോ.
ചുരുക്കത്തിൽ: ഒരു റെസ്പോൺസ് മോഡൽ ഒഴിവാക്കുന്നത്, സുരക്ഷിതമായിരിക്കേണ്ട ഒരു സീക്രട്ട് റാപ്പറിനെ (secret wrapper) ഒരു ഡാറ്റാ ചോർച്ചയാക്കി മാറ്റിയേക്കാം. FastAPI ഒരു ബിൽറ്റ്-ഇൻ പരിഹാരം പുറത്തിറക്കുന്നത് വരെ, ക്രെഡൻഷ്യലുകൾ മറച്ചുവെക്കാൻ വ്യക്തമായ റെസ്പോൺസ് മോഡലുകളോ കസ്റ്റം എൻകോഡറുകളോ ചേർക്കുന്നത് ലളിതവും വിശ്വസനീയവുമായ മാർഗമാണ്.
