CVE สองรายการที่เพิ่งถูกเปิดเผย—CVE-2025-55182 ใน React Server Components และ CVE-2025-29927 ใน Next.js middleware—เปิดช่องทางสำหรับการรันโค้ดจากระยะไกล (remote-code execution) และการข้ามผ่านการยืนยันตัวตน (authentication bypass) บน JavaScript stack สมัยใหม่ เพียงแค่คำขอ (request) เดียวก็สามารถกระตุ้นให้เกิดช่องโหว่เหล่านี้ได้ และการตั้งค่าเพียงอย่างเดียวไม่สามารถหยุดยั้งได้ ทีมที่ใช้งาน React Server Components หรือ Next.js middleware ต้องถือว่าบั๊กเหล่านี้เป็นเรื่องเร่งด่วนและต้องรีบติดตั้งแพตช์ทันที
ทำไมสัญญาณรบกวนใน Log ถึงทำให้เข้าใจผิด
เราได้ดึงข้อมูล edge logs ย้อนหลังหนึ่งเดือนจากเว็บไซต์ Next.js ที่ใช้งานจริง ชุดข้อมูลนี้ประกอบด้วยคำขอ 8,900 รายการที่ถูกระบุว่าเป็นอันตราย เกือบทุกรายการล้มเหลวตั้งแต่การเชื่อมต่อครั้งแรก URL ที่พบบ่อยที่สุดคือ /wp-admin/install.php ซึ่งถูกเรียกถึง 518 ครั้ง ทั้งที่เว็บไซต์ไม่ได้รัน WordPress ไม่ได้ใช้ PHP และไม่มีไฟล์ WordPress อยู่เลย
สแกนเนอร์อัตโนมัติเป็นตัวสร้างทราฟฟิกเหล่านี้ พวกมันสุ่มยิงข้อมูลไปทั่วอินเทอร์เน็ตเพื่อค้นหา:
- ไฟล์ความลับและไฟล์กำหนดค่า – 64% ของความพยายามทั้งหมด
- แผงควบคุมและ PHP shells – 22%
- เส้นทางของ WordPress – 11%
- เครื่องมือจัดการฐานข้อมูล – 1%
จำนวนคำขอที่ถูกบล็อกจำนวนมากบอกเพียงว่าคุณไม่ได้รันซอฟต์แวร์ที่บอทเหล่านั้นคาดหวัง แต่มันไม่ได้การันตีว่าแอปพลิเคชันที่คุณ กำลัง รันอยู่นั้นปลอดภัย
การโจมตีระดับเฟรมเวิร์กที่เงียบเชียบ
เมื่อผู้โจมตีมุ่งเป้าไปที่แอป Next.js ทราฟฟิกจะดูเหมือนคำขอของผู้ใช้ทั่วไป โดยใช้กลไกของตัวเฟรมเวิร์กเองในการโจมตี
React2Shell (CVE-2025-55182)
ช่องโหว่ใน React Server Components ช่วยให้ผู้โจมตีสามารถฉีด payload ที่สร้างขึ้นเป็นพิเศษ ซึ่งเซิร์ฟเวอร์จะประมวลผลเป็นโค้ด ผลลัพธ์คือการรันโค้ดจากระยะไกล (remote-code execution) ได้อย่างสมบูรณ์โดยไม่จำเป็นต้องข้ามผ่านไฟร์วอลล์หรือตัวกรองเว็บแอปพลิเคชัน (web-application filter) ช่องโหว่นี้ฝังอยู่ในตัวเฟรมเวิร์ก วิธีแก้ไขเพียงอย่างเดียวคือการอัปเกรดเป็นเวอร์ชันที่มีการแก้ไขแล้ว
Middleware Authorization Bypass (CVE-2025-29927)
Next.js middleware สามารถบังคับใช้การตรวจสอบความปลอดภัยตาม request headers ได้ CVE นี้แสดงให้เห็นว่าผู้โจมตีสามารถส่ง internal header บางอย่างเพื่อทำให้ middleware ข้ามการตรวจสอบเหล่านั้นไปทั้งหมด จากภายนอก คำขอดังกล่าวจะดูเหมือนคำขอปกติ ทำให้ตรวจจับได้ยาก
บั๊กทั้งสองแสดงให้เห็นว่าทราฟฟิกที่อันตรายที่สุดสามารถปะปนไปกับทราฟฟิกปกติในแต่ละวัน และหลบเลี่ยงการแจ้งเตือนที่ตรวจจับการสแกน WordPress ที่ส่งเสียงดังได้
สิ่งที่ต้องเผชิญ (ความเสี่ยง)
- นักพัฒนา (Developers) ที่มองว่าการอัปเดตเฟรมเวิร์กเป็นเรื่องทางเลือก เสี่ยงต่อการถูกยึดเซิร์ฟเวอร์โดยสมบูรณ์
- ทีมปฏิบัติการ (Operations teams) ที่พึ่งพาการตั้งค่าแบบคงที่ (static configuration) ในการเสริมความแข็งแกร่งให้กับ stack ไม่สามารถป้องกันโค้ดที่รันอยู่ภายในตัวเฟรมเวิร์กเองได้
รายการตรวจสอบการป้องกันที่นำไปใช้ได้จริง
- สุขอนามัยในการ Deploy (Deployment hygiene) – อย่าใส่ความลับไว้ในไฟล์ เช่น
.envให้เก็บไว้ใน environment variables ที่ส่งมาตอน runtime หรือในระบบจัดการความลับ (secret-management system) โดยเฉพาะ - ลดพื้นที่การโจมตี (Minimal attack surface) – ปิดฟีเจอร์ของเฟรมเวิร์กที่คุณไม่ได้ใช้งาน บังคับใช้ Content-Security-Policy ที่เข้มงวดเพื่อบล็อกการโหลดสคริปต์ที่ไม่ได้รับอนุญาต
- การติดตั้งแพตช์อย่างรวดเร็ว (Rapid patching) – ทำระบบ build pipeline ให้เป็นอัตโนมัติ เพื่อให้สามารถทดสอบและ Deploy เวอร์ชันใหม่ของเฟรมเวิร์กได้ภายในไม่กี่ชั่วโมงหลังการปล่อยออกมา ให้ถือว่าการอัปเดตความปลอดภัยเป็นส่วนหนึ่งของวงจรการปล่อยซอฟต์แวร์ตามปกติ ไม่ใช่เรื่องที่ค่อยทำทีหลัง
สิ่งที่ควรเฝ้าระวังต่อไป
- สมัครรับข้อมูลข่าวสารด้านความปลอดภัย (security advisory feeds) อย่างเป็นทางการของ React, Next.js และไลบรารี runtime อื่นๆ ที่คุณใช้งาน
- ผสานรวม vulnerability scanners ที่เข้าใจ metadata ของ JavaScript package เพื่อให้เมื่อมีการประกาศ CVE ใหม่ ระบบจะแจ้งเตือนโดยอัตโนมัติ
- สร้าง deployment pipeline ที่พร้อมสำหรับการ rollback หากแพตช์ที่ติดตั้งทำให้เกิดปัญหา (regressions) คุณจะสามารถย้อนกลับได้อย่างรวดเร็วโดยไม่ปล่อยให้ระบบตกอยู่ในความเสี่ยง
บทเรียนนี้ชัดเจน: การโจมตีที่ส่งเสียงดังที่สุดใน Log ของคุณมักเป็นการเบี่ยงเบนความสนใจ อันตรายที่แท้จริงซ่อนอยู่ในเฟรมเวิร์กที่โค้ดของคุณไว้วางใจ จงรักษา stack ให้คล่องตัว เก็บความลับอย่างปลอดภัย และปฏิบัติกับการติดตั้งแพตช์ให้เป็นเรื่องปกติ แล้วคุณจะเปลี่ยนภัยคุกคามระดับเฟรมเวิร์กที่เงียบเชียบให้กลายเป็นความเสี่ยงที่จัดการได้
