FastAPI 0.140.0-0.141.1 在路由返回不带响应模型的普通字典或列表时,可能会泄露被 Pydantic 的 Secret 类包装的原始值。这种泄露可能会暴露密码、API 密钥或开发者试图隐藏的任何其他凭据。

为什么该漏洞很重要

FastAPI 通过检查视图函数的返回类型来构建 JSON 响应。如果你提供了响应模型,FastAPI 会将对象交给 Pydantic,后者会将 SecretStr 掩码为 "**********"。在受影响的版本中,框架仅能识别内置的 SecretStr 类型。当你通过继承 Secret(或使用自定义的密钥类型)并将该对象放在原始字典或列表中返回时,FastAPI 会退回到通用的对象到字典(object-to-dict)转换。这种转换会访问持有实际密钥值的私有属性,并将其原封不动地发送给客户端。

只有在满足全部三个条件时,才会发生泄露:

  • 密钥类型继承自 Pydantic 的 Secret 基类。
  • 路由没有声明响应模型。
  • 视图在普通的 dictlist 中返回该密钥。

如何立即保护您的密钥

  • 为每个可能返回包含密钥数据的端点声明响应模型。这样 FastAPI 就会让 Pydantic 处理序列化,从而正确地掩码这些值。
  • 将密钥包装在 Pydantic 的 BaseModel 字段中,而不是返回原始容器。模型的字段类型可以是一个被识别的密钥类,从而确保得到妥善处理。
  • 如果必须保持当前的返回风格,请为您的密钥子类注册自定义 JSON 编码器。该编码器可以返回掩码后的表示形式 ("**********")。

严重程度与社区响应

该问题的严重程度较低。它需要特定的配置才能触发,但任何凭据的意外泄露都是一种风险,尤其是在公共 API 或会记录响应的服务中。

总结: 遗漏响应模型可能会使原本设计良好的密钥包装器变成数据泄露点。在 FastAPI 发布内置修复程序之前,添加显式的响应模型或自定义编码器是保持凭据隐藏的一种低成本且可靠的方法。