FastAPI เวอร์ชัน 0.140.0-0.141.1 อาจเปิดเผยค่าดิบ (raw values) ที่ถูกห่อหุ้มด้วยคลาส Secret ของ Pydantic เมื่อเส้นทาง (route) ส่งคืนค่าเป็น dictionary หรือ list ธรรมดาโดยไม่มี response model การรั่วไหลนี้อาจทำให้รหัสผ่าน, API keys หรือข้อมูลประจำตัวอื่นๆ ที่นักพัฒนาพยายามซ่อนไว้ถูกเปิดเผยออกมา

ทำไมบั๊กนี้ถึงสำคัญ

FastAPI สร้าง JSON response โดยการตรวจสอบประเภทข้อมูลที่ส่งคืนจาก view function หากคุณระบุ response model ไว้ FastAPI จะส่งต่อออบเจกต์นั้นให้ Pydantic ซึ่งจะทำการพราง (mask) SecretStr ให้เป็น "**********" แต่ในเวอร์ชันที่ได้รับผลกระทบ เฟรมเวิร์กจะรับรู้เฉพาะประเภท SecretStr ที่มีมาให้ในตัวเท่านั้น เมื่อคุณสร้างคลาสย่อยจาก Secret (หรือใช้ประเภท secret แบบกำหนดเอง) และส่งคืนออบเจกต์นั้นภายใน dict หรือ list แบบดิบ FastAPI จะเปลี่ยนไปใช้วิธีการแปลง object-to-dict แบบทั่วไปแทน ซึ่งการแปลงนั้นจะเข้าถึง attribute ส่วนตัว (private attribute) ที่เก็บค่าความลับจริงและส่งไปยังไคลเอนต์โดยไม่มีการเปลี่ยนแปลง

การรั่วไหลจะเกิดขึ้นก็ต่อเมื่อเข้าเงื่อนไข ทั้งสามข้อ ดังนี้:

  • ประเภทของ secret เป็นคลาสย่อย (subclass) ของคลาสพื้นฐาน Secret ของ Pydantic
  • เส้นทาง (route) นั้น ไม่ได้ ระบุ response model ไว้
  • view ส่งคืนค่า secret ภายใน dict หรือ list ธรรมดา

วิธีป้องกันข้อมูลความลับของคุณในวันนี้

  • ระบุ response model สำหรับทุก endpoint ที่อาจมีการส่งคืนข้อมูลที่มีความลับ FastAPI จะให้ Pydantic จัดการเรื่องการทำ serialization ซึ่งจะทำการพรางค่าต่างๆ อย่างถูกต้อง
  • ห่อหุ้มความลับไว้ภายในฟิลด์ของ Pydantic BaseModel แทนการส่งคืน container แบบดิบ โดยประเภทฟิลด์ของ model สามารถเป็นคลาส secret ที่ระบบรับรู้ได้ เพื่อให้มั่นใจว่ามีการจัดการที่เหมาะสม
  • ลงทะเบียน custom JSON encoder สำหรับคลาสย่อยของ secret หากคุณจำเป็นต้องใช้รูปแบบการส่งคืนข้อมูลแบบเดิม โดย encoder สามารถส่งคืนค่าในรูปแบบที่ถูกพรางไว้ ("**********")

ระดับความรุนแรงและการตอบสนองของชุมชน

ปัญหานี้มีความรุนแรงต่ำ เนื่องจากต้องมีการตั้งค่าเฉพาะเจาะจงจึงจะเกิดปัญหาขึ้นได้ แต่การเปิดเผยข้อมูลประจำตัวโดยไม่ตั้งใจถือเป็นความเสี่ยง โดยเฉพาะอย่างยิ่งใน public API หรือบริการที่มีการบันทึก (log) responses

บทสรุป: การไม่ระบุ response model อาจเปลี่ยนตัวห่อหุ้มความลับที่ตั้งใจทำมาอย่างดีให้กลายเป็นการรั่วไหลของข้อมูล การเพิ่ม response model ที่ชัดเจนหรือการใช้ custom encoder เป็นวิธีที่ง่ายและเชื่อถือได้ในการซ่อนข้อมูลประจำตัว จนกว่า FastAPI จะออกตัวแก้ไขอย่างเป็นทางการ