FastAPI 0.140.0-0.141.1 dapat mengekspos nilai mentah yang dibungkus oleh kelas Secret milik Pydantic ketika sebuah rute mengembalikan dictionary atau list biasa tanpa model respons. Kebocoran ini dapat mengungkap kata sandi, kunci API, atau kredensial lainnya yang coba disembunyikan oleh pengembang.

Mengapa bug ini penting

FastAPI menyusun respons JSON dengan memeriksa tipe pengembalian (return type) dari fungsi view. Jika Anda menyediakan model respons, FastAPI menyerahkan objek tersebut ke Pydantic, yang akan menyamarkan SecretStr sebagai "**********". Pada versi yang terdampak, framework ini hanya mengenali tipe SecretStr bawaan. Saat Anda membuat subclass dari Secret (atau menggunakan tipe rahasia kustom) dan mengembalikan objek tersebut di dalam dict atau list mentah, FastAPI akan beralih ke konversi objek-ke-dict generik. Konversi tersebut menjangkau atribut privat yang menyimpan nilai rahasia sebenarnya dan mengirimkannya ke klien tanpa perubahan.

Kebocoran terjadi hanya jika ketiga kondisi berikut terpenuhi:

  • Tipe rahasia tersebut merupakan subclass dari kelas dasar Secret milik Pydantic.
  • Rute tersebut tidak mendeklarasikan model respons.
  • Fungsi view mengembalikan rahasia tersebut di dalam dict atau list biasa.

Cara melindungi rahasia Anda saat ini

  • Deklarasikan model respons untuk setiap endpoint yang mungkin mengembalikan data berisi rahasia. FastAPI kemudian akan membiarkan Pydantic menangani serialisasi, yang akan menyamarkan nilai tersebut dengan benar.
  • Bungkus rahasia di dalam field BaseModel Pydantic alih-alih mengembalikan kontainer mentah. Tipe field model tersebut dapat berupa kelas rahasia yang dikenali, guna memastikan penanganan yang tepat.
  • Daftarkan JSON encoder kustom untuk subclass rahasia Anda jika Anda harus tetap menggunakan gaya pengembalian saat ini. Encoder tersebut dapat mengembalikan representasi yang disamarkan ("**********").

Tingkat keparahan dan respons komunitas

Masalah ini memiliki tingkat keparahan yang rendah. Diperlukan pengaturan khusus untuk memicunya, namun setiap paparan kredensial yang tidak disengaja tetap merupakan risiko, terutama pada API publik atau layanan yang mencatat (log) respons.

Kesimpulan: Tidak menyertakan model respons dapat mengubah pembungkus rahasia yang sudah dirancang dengan baik menjadi kebocoran data. Menambahkan model respons eksplisit atau encoder kustom adalah cara yang murah dan andal untuk menjaga kredensial tetap tersembunyi hingga FastAPI merilis perbaikan bawaan.