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 не появится встроенное исправление.
