ตรรกะในการสร้าง URL ใหม่ของ Starlette ทำให้เกิดความไม่ตรงกันที่เป็นอันตรายระหว่าง Path ที่ถูกจัดเส้นทางกับ Path ที่ถูกตรวจสอบสิทธิ์ เมื่อมีคำขอ HTTP เข้ามา เราเตอร์จะระบุปลายทางของ Endpoint ได้อย่างถูกต้องจากบรรทัดคำขอดิบ อย่างไรก็ตาม เมื่อแอปพลิเคชันตรวจสอบ request.url ในภายหลังเพื่อตัดสินใจว่าผู้ใช้ได้รับอนุญาตหรือไม่ Starlette จะสร้าง URL นั้นขึ้นมาใหม่โดยการต่อค่า Host Header เข้ากับ Path ของคำขอ แล้วนำผลลัพธ์ที่ได้ไปประมวลผล (Parse) ใหม่อีกครั้ง
ผู้โจมตีสามารถใช้ประโยชน์จากสิ่งนี้ได้โดยการส่งคำขอไปยัง Endpoint ที่ได้รับการป้องกัน เช่น /admin/secure พร้อมกับ Host Header ที่ถูกวางยาพิษไว้อย่างแนบเนียน ตัวอย่างเช่น:
Host: legitimate.com/health?x=
เราเตอร์จะส่งคำขอไปยัง Handler ของ /admin/secure ได้อย่างถูกต้อง แต่เมื่อเมิดเดิลแวร์ตรวจสอบสิทธิ์เข้าไปดูที่ request.url.path มันกลับเห็นเป็น /health แทน หากเมิดเดิลแวร์ใช้ Allowlist ที่เชื่อถือว่า /health เป็น Endpoint สำหรับเช็คสถานะสาธารณะ ผู้โจมตีก็จะเล็ดลอดเข้าไปได้ การตรวจสอบสิทธิ์ถูกข้ามผ่านอย่างเงียบๆ โดยไม่ต้องใช้โทเค็น, รหัสผ่าน หรือการโต้ตอบใดๆ จากผู้ใช้เลย
คำแนะนำของ X41 D-Sec ยืนยันถึงความง่ายดายที่น่าตกใจ: "แค่ใส่ตัวอักษรเพียงตัวเดียวลงใน HTTP Host Header ก็เพียงพอที่จะหลอกเซิร์ฟเวอร์ได้" ตัวอักษรเฉพาะที่ทำให้เกิดความสับสนนี้รวมถึงเครื่องหมายทับ (Slash), เครื่องหมายคำถาม และเครื่องหมายแฮช ซึ่งเป็นตัวคั่น URL มาตรฐานที่ Starlette ไม่เคยตรวจสอบมาก่อน
ขอบเขตของช่องโหว่นี้น่าตกตะลึง Starlette คือกลไกที่ซ่อนอยู่เบื้องหลังเครื่องมือ AI ที่ใช้ไพธอนแทบทุกตัว โดยมียอดดาวน์โหลดประมาณ 325 ล้านครั้งต่อสัปดาห์ โปรเจกต์ดาวน์สตรีมทั้งหมดที่ใช้ Starlette เวอร์ชันก่อน 1.0.1 ล้วนได้รับผลกระทบ:
เวอร์ชันที่ได้รับผลกระทบที่ยืนยันแล้วครอบคลุมตั้งแต่ Starlette >= 0.8.3 ถึง < 1.0.1 ซึ่งหมายความว่าระบบที่ใช้เวอร์ชันเสถียรมาหลายปีต่างก็มีความเสี่ยงทั้งหมด
ระดับความรุนแรงอย่างเป็นทางการของ CVE-2026-48710 ได้จุดประเด็นการถกเถียงอย่างมากในหมู่ผู้เชี่ยวชาญด้านความปลอดภัย:
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N มองว่าผลกระทบต่อความลับและความสมบูรณ์เป็น "ต่ำ" จำกัดขอบเขตเป็น "ไม่เปลี่ยนแปลง" และรายงานว่าไม่มีผลกระทบต่อความพร้อมใช้งาน CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:N/SC:H/SI:H/SA:Nปัจจัยสามประการที่สนับสนุนข้อโต้แย้งของนักวิจัยว่าคะแนน 6.5 ต่ำเกินไปจนอันตราย:
SC:H/SI:H ของ CVSS v4.0 จับได้ในที่สุด Starlette เวอร์ชัน 1.0.1 ซึ่งเปิดตัวเมื่อวันที่ 22 พฤษภาคม 2026 มีแพตช์ที่แก้ไขปัญหานี้อย่างสมบูรณ์ การแก้ไขนี้ถูกติดตามอยู่ใน GitHub Security Advisory GHSA-86qp-5c8j-p5mr และคำแนะนำของ X41 ในรหัส X41-2026-002
แพตช์นี้ใช้การป้องกันหลักสองประการ:
Host Header จะถูกตรวจสอบกับหลักไวยากรณ์ที่ระบุไว้ใน RFC 9112 §3.2 และ RFC 3986 §3.2.2 ก่อนที่จะถูกนำไปใช้สร้าง request.url scope["server"] ซึ่งเป็นทูเพิลการเชื่อมต่อเซิร์ฟเวอร์จริง แทนที่จะใช้ค่าที่ผู้โจมตีส่งมา ผลลัพธ์ก็คือ request.url.path จะสะท้อนถึง Path ที่จัดเส้นทางจริงอย่างสม่ำเสมอ โปรเจกต์ FastAPI ได้ยืนยันว่าแพตช์นี้มีประสิทธิภาพและแนะนำให้อัปเกรด starlette เป็นเวอร์ชัน >=1.0.1 ทันที
การอัปเกรดแพ็คเกจ Starlette เป็นขั้นตอนแรกที่จำเป็น แต่การป้องกันที่ครอบคลุมต้องมีหลายชั้น:
ติดตั้งแพตช์ทันที ในทุก Virtual Environment, Container Image และ Deployment Pipeline ที่ใช้งานโครงสร้างพื้นฐาน AI ให้รันคำสั่ง:
pip install --upgrade starlette
จากนั้นรีสตาร์ทบริการที่ได้รับผลกระทบทั้งหมด ซึ่งรวมถึงทั้งการติดตั้ง Starlette โดยตรงและอินสแตนซ์ของ FastAPI, vLLM, LiteLLM และเซิร์ฟเวอร์ MCP
ตรวจสอบและตรึงเวอร์ชัน Dependencies FastAPI และเฟรมเวิร์กอื่นๆ อาจไม่บังคับใช้เวอร์ชันขั้นต่ำของ Starlette โดยอัตโนมัติ ให้ระบุ starlette>=1.0.1 อย่างชัดเจนใน requirements.txt, pyproject.toml, poetry.lock หรือไฟล์ล็อกที่เทียบเท่ากัน ใช้คำสั่ง pip list | grep starlette
สแกนทุกองค์ประกอบใน AI Stack บริการไพธอนใดๆ ที่ให้บริการ HTTP ไม่ว่าจะเป็นแอป FastAPI แบบกำหนดเอง, Endpoint การอนุมาน LLM, ระนาบการจัดการ Agent, แผงประเมินผลโมเดล และพร็อกซีที่เข้ากันได้กับ OpenAI อาจมี Starlette เวอร์ชันที่มีช่องโหว่ฝังตัวอยู่ ดำเนินการตรวจสอบโครงสร้างพื้นฐานอย่างเต็มรูปแบบ
เพิ่มความแข็งแกร่งให้กับ Reverse Proxy และ WAF กำหนดค่า nginx, Envoy, HAProxy, Cloudflare หรือ AWS ALB เพื่อปฏิเสธหรือทำให้ Host Header ที่มีรูปแบบผิดปกติสะอาดขึ้นก่อนส่งต่อทราฟฟิกไปยังแอปพลิเคชันไพธอน นี่เป็นการป้องกันเชิงลึกที่บล็อกการโจมตีได้แม้ว่าการแพตช์แอปพลิเคชันจะล่าช้าก็ตาม
เขียนการตรวจสอบความปลอดภัยของ Path ใหม่ โดยไม่ใช้ request.url.path สาเหตุหลักคือความไม่ตรงกันระหว่าง Path ของการจัดเส้นทางและ request.url.path หากเป็นไปได้ ให้เปลี่ยนเมิดเดิลแวร์ตรวจสอบสิทธิ์ไปใช้ request.scope["path"] ซึ่งได้มาจากขอบเขต ASGI ดิบและไม่สามารถถูกทำให้เสียหายโดย Host Header ได้ X41 D-Sec แนะนำให้หลีกเลี่ยงการตรวจสอบสิทธิ์แบบ Path-based ทั้งหมด และหันไปใช้กลไกการยืนยันตัวตนภายในตัว Endpoint แทน
ทดสอบการเปิดเผยช่องโหว่ มีการเปิดตัวสแกนเนอร์ออนไลน์เพื่อช่วยให้องค์กรตรวจสอบว่าเซิร์ฟเวอร์ของตนมีช่องโหว่หรือไม่ เมื่อใช้ร่วมกับการทดสอบการเจาะระบบอย่างละเอียดในขอบเขตการยืนยันตัวตน จะสามารถเปิดเผยพื้นผิวการโจมตีที่ถูกมองข้ามไปได้
สำหรับการปรับใช้บน Debian นั้น CVE-2026-48710 จะถูกติดตามใน Debian Security Tracker ด้วยระดับความรุนแรง "สำคัญ" และมีแพตช์ starlette แบบ Point Release สำหรับ Suite ที่ได้รับผลกระทบพร้อมให้ใช้งานแล้ว ให้ใช้คำสั่ง
apt เพื่อแก้ไขจาก bullseye-security หรือ Repository ที่เทียบเท่ากัน และโหลดไฟล์ systemd unit ที่ได้รับผลกระทบใหม่
Comments
0 comments