FastAPI версий 0.140.0–0.141.1 могут раскрывать исходные значения, обернутые в классы Secret библиотеки Pydantic, если маршрут возвращает обычный словарь или список без использования модели ответа (response model). Эта утечка может привести к раскрытию паролей, API-ключей или любых других учетных данных, которые разработчик пытался скрыть.

Почему эта ошибка важна

FastAPI формирует JSON-ответы, анализируя тип возвращаемого значения функции представления. Если вы указываете модель ответа (response model), FastAPI передает объект в Pydantic, который маскирует SecretStr в виде "**********". В затронутых версиях фреймворк распознает только встроенный тип SecretStr. Если вы создаете подкласс Secret (или используете собственный тип секретных данных) и возвращаете этот объект внутри обычного словаря или списка, FastAPI переключается на стандартное преобразование объекта в словарь. При таком преобразовании происходит обращение к приватному атрибуту, содержащему реальное секретное значение, и оно отправляется клиенту в исходном виде.

Утечка происходит только при соблюдении всех трех условий:

  • Тип секретных данных является подклассом базового класса Secret в Pydantic.
  • В маршруте не объявлена модель ответа (response model).
  • Функция представления возвращает секрет внутри обычного dict или list.

Как защитить свои секреты уже сегодня

  • Объявляйте модель ответа (response model) для каждого эндпоинта, который может возвращать данные, содержащие секреты. В этом случае FastAPI позволит Pydantic выполнить сериализацию, которая корректно маскирует значения.
  • Оборачивайте секреты в поля BaseModel в Pydantic вместо возврата «сырых» контейнеров. Тип поля модели может быть распознаваемым классом секретных данных, что обеспечит их правильную обработку.
  • Зарегистрируйте пользовательский JSON-энкодер для вашего подкласса секретных данных, если вам необходимо сохранить текущий стиль возврата. Энкодер может возвращать маскированное представление ("**********").

Уровень серьезности и реакция сообщества

Проблема имеет низкий уровень серьезности. Для её возникновения требуется специфическая конфигурация, однако любое случайное раскрытие учетных данных представляет риск, особенно в публичных API или сервисах, которые логируют ответы.

Итог: Отсутствие модели ответа может превратить даже тщательно продуманную обертку для секретов в утечку данных. Добавление явных моделей ответа или пользовательских энкодеров — это простой и надежный способ скрыть учетные данные до тех пор, пока в FastAPI не появится встроенное исправление.