FastAPI w wersjach 0.140.0-0.141.1 może ujawniać surowe wartości opakowane w klasy Secret biblioteki Pydantic, gdy trasa zwraca zwykły słownik lub listę bez modelu odpowiedzi (response model). Wyciek ten może ujawnić hasła, klucze API lub wszelkie inne dane uwierzytelniające, które programista próbował ukryć.

Dlaczego ten błąd jest istotny

FastAPI buduje odpowiedzi JSON poprzez sprawdzanie typu zwracanego przez funkcję widoku. Jeśli podasz model odpowiedzi, FastAPI przekazuje obiekt do Pydantic, który maskuje SecretStr jako "**********". W dotkniętych wersjach framework rozpoznaje jedynie wbudowany typ SecretStr. Gdy tworzysz podklasę Secret (lub używasz własnego typu sekretu) i zwracasz obiekt wewnątrz surowego słownika lub listy, FastAPI przełącza się na ogólną konwersję obiektu na słownik. Konwersja ta dociera do prywatnego atrybutu przechowującego rzeczywistą wartość sekretu i wysyła go do klienta bez zmian.

Wyciek następuje tylko wtedy, gdy spełnione są wszystkie trzy warunki:

  • Typ sekretu jest podklasą klasy bazowej Secret biblioteki Pydantic.
  • Trasa nie deklaruje modelu odpowiedzi.
  • Widok zwraca sekret wewnątrz zwykłego dict lub list.

Jak chronić swoje sekrety już dziś

  • Zadeklaruj model odpowiedzi dla każdego punktu końcowego, który może zwracać dane zawierające sekrety. FastAPI pozwoli wtedy Pydantic na obsługę serializacji, co prawidłowo zamaskuje wartości.
  • Umieść sekrety wewnątrz pola BaseModel biblioteki Pydantic zamiast zwracać surowe kontenery. Typ pola modelu może być rozpoznawalną klasą sekretu, co zapewni prawidłową obsługę.
  • Zarejestruj własny enkoder JSON dla swojej podklasy sekretu, jeśli musisz zachować obecny styl zwracania danych. Enkoder może zwracać zamaskowaną reprezentację ("**********").

Stopień dotkliwości i reakcja społeczności

Problem ma niski stopień dotkliwości. Wymaga specyficznej konfiguracji, aby go wywołać, ale każde przypadkowe ujawnienie danych uwierzytelniających stanowi ryzyko, szczególnie w publicznych API lub usługach, które logują odpowiedzi.

Wniosek: Brak modelu odpowiedzi może sprawić, że dobrze zaprojektowany wrapper sekretu stanie się przyczyną wycieku danych. Dodanie jawnych modeli odpowiedzi lub własnych enkoderów to tani i niezawodny sposób na ukrycie danych uwierzytelniających, dopóki FastAPI nie wyda wbudowanej poprawki.