สรุปสั้น

ช่องโหว่ CVE-2026-23870 (GHSA-rv78-f8rc-xrxh) ใน React Server Components ของบริษัท Meta เปิดทางให้ผู้โจมตีทำให้เซิร์ฟเวอร์ที่รัน React 19 ร่วมกับเฟรมเวิร์กอย่าง Next.js ค้างได้ด้วยคำขอ HTTP POST แบบ multipart ที่สร้างขึ้นเฉพาะ ต้นเหตุอยู่ที่ขั้นตอนประกอบข้อมูลฟอร์มก่อนเรียก Server Action ซึ่งทุกการอ้างอิงชนิด $K จะสั่งให้ไล่สแกนฟิลด์ทั้งหมดใหม่ตั้งแต่ต้น ทำให้งานโตแบบกำลังสอง คำขอขนาดราว 900 KB ที่มีการอ้างอิง 10,000 รายการกับฟิลด์อีก 10,000 รายการจึงสร้างการเปรียบเทียบสตริงราว 100 ล้านครั้ง

เพราะ Node.js ประมวลผล JavaScript บนเธรด event loop เดียว ระหว่างที่แยกข้อมูลอยู่ หน้าเว็บ API และ Server Action อื่นทั้งหมดจะค้างหรือหมดเวลา ที่สำคัญคือการแยกข้อมูลเกิดก่อนการตรวจสิทธิ์ระดับแอปพลิเคชัน ผู้โจมตีจึงอาจไม่ต้องล็อกอินเลย ขอแค่มี ID ของ Server Action ซึ่งมักปรากฏอยู่ใน HTML หรือไฟล์ JavaScript ที่ส่งให้เบราว์เซอร์อยู่แล้ว Meta ให้คะแนน CVSS 7.5 และแก้แล้วใน React 19.0.6, 19.1.7 และ 19.2.6 ตั้งแต่พฤษภาคม 2569 โดยยังไม่มีรายงานการโจมตีจริง

รายละเอียดข่าว

เว็บไซต์ GBHackers รายงานเมื่อวันที่ 9 ตุลาคม 2569 ถึงรายละเอียดช่องโหว่ CVE-2026-23870 หลังนาย Simon Koeck นักวิจัยผู้ค้นพบเผยแพร่บทวิเคราะห์ทางเทคนิคฉบับเต็มเมื่อวันที่ 8 ตุลาคม 2569 ตามไทม์ไลน์ของนาย Koeck เขารายงานช่องโหว่ให้ Meta เมื่อ 21 เมษายน 2569 และ React ออกแพตช์เมื่อ 6 พฤษภาคม 2569 ข่าวรอบนี้จึงเป็นการเปิดเผยกลไกและผลทดสอบหลังแพตช์ออกไปแล้วราว 5 เดือน แต่ระบบที่ยังไม่อัปเดตจะยิ่งเสี่ยงขึ้น เพราะตอนนี้มีคำอธิบายวิธีสร้างคำขอโจมตีแบบละเอียดแล้ว

แพ็กเกจที่ได้รับผลกระทบคือ react-server-dom-webpack, react-server-dom-turbopack และ react-server-dom-parcel ในเวอร์ชัน 19.0.0 ถึง 19.0.5, 19.1.0 ถึง 19.1.6 และ 19.2.0 ถึง 19.2.5 นาย Koeck ระบุเพิ่มว่า react-server-dom-esm ใช้โค้ดชุดเดียวกันแต่ไม่ได้ถูกระบุใน advisory ในทางปฏิบัติ แอป Next.js 14 ขึ้นไปและระบบ React Server Components อื่นที่ใช้ React ก่อนแพตช์และมี Server Action อย่างน้อยหนึ่งตัวที่เข้าถึงได้ล้วนเข้าข่าย

ผลทดสอบของนาย Koeck แสดงว่าบนเครื่องโน้ตบุ๊กที่รัน production build ธรรมดา คำขอเดียวทำให้เซิร์ฟเวอร์ค้างราว 4 วินาที และส่ง 5 คำขอติดกันทำให้ล่มราว 20 วินาที ส่วนในสภาพแวดล้อมใกล้เคียง production คำขอหนึ่งใช้เวลาราว 10 วินาที และ 3 คำขอติดกันทำให้ load balancer ตัดสินว่าเซิร์ฟเวอร์ตายแล้ว NIST จัดช่องโหว่นี้เป็น CWE-400 การใช้ทรัพยากรแบบไม่จำกัด ซึ่งอาจทำให้ซีพียูพุ่ง หน่วยความจำหมด หรือเซิร์ฟเวอร์ล่ม

รายละเอียดช่องโหว่

Server Actions เป็นฟีเจอร์ของ React ที่ให้เรียกฟังก์ชันฝั่งเซิร์ฟเวอร์ได้ตอนส่งฟอร์ม ก่อนรัน action นั้น React ต้องประกอบข้อมูลฟอร์มแบบ multipart กลับขึ้นมาจากคำขอ HTTP ดิบ ในรูปแบบ serialization ของ React การอ้างอิงชนิด $K บอกให้ React ไปหาโครงสร้างข้อมูลฟอร์มที่ซ้อนอยู่ข้างใน ปัญหาคือโค้ดเวอร์ชันที่มีช่องโหว่สร้างรายการฟิลด์ทั้งหมดที่ส่งมาใหม่ทุกครั้งที่เจอ $K แล้ววนตรวจทั้งรายการเพื่อหาฟิลด์ที่ตรงกัน คำขอที่มีการอ้างอิง n ตัวและฟิลด์ n ตัวจึงต้องเปรียบเทียบสตริงราว n² ครั้ง

จุดที่ทำให้ช่องโหว่นี้อันตรายกว่า DoS ทั่วไปคือตำแหน่งของมันใน pipeline การแยกข้อมูลเกิดก่อนการตรวจสิทธิ์ของ Server Action การจำกัดขนาดคำขอ การยืนยันตัวตน การป้องกัน CSRF หรือ rate limit ที่ทำในระดับ action จึงช่วยไม่ได้ และคำขอที่ใช้ก็มีขนาดค่อนข้างเล็ก ไม่ถึง 1 MB ซึ่งต่ำกว่าเพดานขนาดคำขอที่หลายระบบตั้งไว้ ผู้โจมตีต้องการเพียง ID ของ Server Action ซึ่งหาได้จากหน้าเว็บสาธารณะใดก็ตามที่มี Server Action อยู่

การแก้ไขของ React เปลี่ยนวิธีแยกข้อมูลให้ประมวลผลฟิลด์ผ่านการไล่ครั้งเดียวที่ใช้ร่วมกัน แทนที่จะเริ่มสแกนใหม่ทั้งหมดทุกครั้งที่เจอ $K ซ้อนอยู่ จึงตัดการวนซ้ำที่ทำให้ซีพียูพุ่ง

ผลกระทบ

แอปพลิเคชันเว็บที่สร้างด้วย Next.js App Router และ React 19 มีจำนวนมาก และ Server Action ถูกใช้แพร่หลายในหน้าที่เปิดสู่สาธารณะ เช่น ฟอร์มติดต่อ ฟอร์มค้นหา หรือฟอร์มสมัครรับข่าวสาร ผู้โจมตีเพียงรายเดียวที่ส่งคำขอไม่กี่ครั้งก็ทำให้เซิร์ฟเวอร์หยุดตอบสนองได้ต่อเนื่อง และในระบบที่มี load balancer ตรวจสุขภาพเซิร์ฟเวอร์ อาจทำให้โหนดถูกถอดออกจากกลุ่มทีละตัวจนบริการทั้งหมดล่ม โดยใช้ทรัพยากรฝั่งผู้โจมตีน้อยมาก

ช่องโหว่นี้ไม่ทำให้ข้อมูลรั่วหรือรันโค้ดได้ ผลกระทบจำกัดที่ความพร้อมใช้งาน แต่การที่แพตช์ออกมาตั้งแต่พฤษภาคมโดยไม่ค่อยมีคนสนใจ แล้วมีบทวิเคราะห์ละเอียดตามมาภายหลัง เป็นรูปแบบที่ทำให้ระบบที่ไม่ได้อัปเดต dependency ตามรอบกลายเป็นเป้าง่าย โดยเฉพาะแอปที่ build ครั้งเดียวแล้ว deploy ทิ้งไว้นาน

คำแนะนำ

  • ตรวจ lockfile และ production build ว่าใช้ react-server-dom-webpack, react-server-dom-turbopack, react-server-dom-parcel หรือ react-server-dom-esm เวอร์ชันใด แล้วอัปเดต React เป็น 19.0.6, 19.1.7 หรือ 19.2.6 ขึ้นไป
  • อัปเดต Next.js เป็นเวอร์ชันล่าสุดในสายที่ใช้อยู่ให้ดึง React ที่แก้แล้ว จากนั้น rebuild และ redeploy ทุกแอป เพราะการแก้ใน package.json อย่างเดียวไม่มีผลกับ build เก่าที่รันอยู่
  • อย่าพึ่งการจำกัดขนาดคำขอ การยืนยันตัวตน CSRF หรือ rate limit ระดับ action เป็นการป้องกันหลัก เพราะการแยกข้อมูลเกิดก่อนการตรวจเหล่านั้น
  • เฝ้าระวังคำขอ multipart POST ที่ยิงเข้าเส้นทางที่มี Server Action โดยเฉพาะคำขอที่มีจำนวนฟิลด์หรือการอ้างอิงแบบซ้อนผิดปกติ และพิจารณาตั้งกฎบน WAF หรือ reverse proxy จำกัดจำนวนส่วนของ multipart ระหว่างรออัปเดต
  • ตั้งค่า health check และการ restart อัตโนมัติไม่ให้โหนดทั้งหมดถูกถอดพร้อมกัน เพื่อลดผลกระทบหากถูกโจมตี

แหล่งอ้างอิง