
Next.js มีช่องโหว่ RCE ระดับ Critical 2 ตัว: อัปเป็น 16.4.1 หรือ 15.5.28 ด่วน
Next.js มีช่องโหว่ระดับ Critical สองตัวที่อาจทำให้คนที่ ไม่ได้ล็อกอิน สั่งรันโค้ดบนเซิร์ฟเวอร์ของเว็บเราได้ ตัวแรกอยู่ในระบบ Image Optimization เมื่อมีไฟล์ SVG (CVE-2026-96889) ตัวที่สองอยู่ในฟังก์ชัน use cache ของ Next.js 16 ทางทีม Next.js ออกเวอร์ชันแก้ไขแล้วคือ 16.4.1 และ 15.5.28 (Next.js) ถ้าเว็บของคุณรัน Next.js บนเซิร์ฟเวอร์ของตัวเอง ให้อัปเดตแล้ว build ใหม่วันนี้ครับ
สรุป 30 วินาที
- GHSA-2464-fhr4-w9xw / CVE-2026-96889 (CVSS 4.0 คะแนน 9.5): ช่องโหว่ด้านหน่วยความจำในไลบรารีต้นทางที่ Image Optimization ใช้ อาจนำไปสู่การรันโค้ดจากระยะไกลเมื่อ Next.js ทำงานบน Linux ที่ใช้ glibc กระทบ Next.js 10.0.0 ถึง 15.5.27 และ 16.0.0 ถึง 16.4.0 (vercel/next.js)
- GHSA-673q-mjm6-r5xr (CVSS 4.0 คะแนน 9.5): แอปที่ใช้ App Router กับ Cache Components และมีฟังก์ชัน
use cacheที่คืนค่า typed array หลายตัว อาจโดนรันโค้ดได้โดยไม่ต้องล็อกอิน กระทบ 16.0.0 ถึง 16.4.0 และ ไม่มีทางเลี่ยงชั่วคราว (vercel/next.js) - แพตช์ออกตั้งแต่ 14 ตุลาคม 2026 แต่ฐานข้อมูล GitHub Advisory เพิ่งตรวจและเผยแพร่รายการเมื่อ 22 ตุลาคม (GitHub Advisory Database) โปรเจกต์ที่เคยผ่าน
npm auditเมื่อสัปดาห์ก่อนจึงอาจเริ่มขึ้นแดงตอนนี้ - รอบเดียวกันยังแก้ช่องโหว่ DoS ระดับ High ใน Server Actions ด้วย (Next.js)
ทำไมเรื่องนี้เกี่ยวกับคุณ
Next.js เป็น framework ที่ทีมเว็บในไทยใช้กันเยอะมาก ทั้งเว็บบริษัท ร้านค้าออนไลน์ หน้า landing และระบบหลังบ้าน ช่วงรุ่นที่โดนของตัว Image Optimization กว้างย้อนไปถึง Next.js 10 (vercel/next.js) โปรเจกต์ที่ทำไว้หลายปีแล้วไม่มีใครแตะก็อาจอยู่ในกลุ่มนี้
ถ้าคุณไม่ได้เขียนโค้ดเอง แต่จ้างเอเจนซีทำเว็บด้วย Next.js ให้ส่งบทความนี้ไปถามเขาว่าเว็บเรารันรุ่นไหน และอัปแล้วหรือยัง
รุ่นที่ต้องอัป
| ช่องโหว่ | รุ่นที่โดน | รุ่นที่แก้แล้ว |
|---|---|---|
| Image Optimization + SVG (CVE-2026-96889) | 10.0.0 – 15.5.27 | 15.5.28 |
| Image Optimization + SVG (CVE-2026-96889) | 16.0.0 – 16.4.0 | 16.4.1 |
use cache คืน typed array (GHSA-673q-mjm6-r5xr) | 16.0.0 – 16.4.0 | 16.4.1 |
| DoS ใน Server Actions (GHSA-p3m5-59mp-jv5r, High) | 13.0.0 – 15.5.27 และ 16.0.0 – 16.4.0 | 15.5.28 / 16.4.1 |
ข้อมูลจาก advisory ของ Next.js (GHSA-2464, GHSA-673q) และประกาศบนบล็อกทางการ (Next.js) ทีม Next.js เรียก 16.4 ว่าสาย Active LTS และ 15.5 ว่า Maintenance LTS ใครยังอยู่สายเก่ากว่า 15.5 ประกาศนี้ไม่ได้ระบุรุ่นแก้ไขให้ ทางที่ปลอดภัยคือย้ายขึ้นสายที่ยังได้แพตช์
ทำงานยังไง (พร้อมอุปมาไทย)
ตัว Image Optimization คือส่วนที่ย่อและแปลงรูปให้อัตโนมัติเวลาเราใช้คอมโพเนนต์รูปของ Next.js งานนี้ไม่ได้ทำเองทั้งหมด แต่ส่งต่อให้ไลบรารีจัดการรูป ปัญหาอยู่ที่ไลบรารีต้นทางนั้น เมื่อเจอไฟล์ SVG ที่ถูกจัดมาเป็นพิเศษบน Linux ที่ใช้ glibc ก็อาจพาไปสู่การรันโค้ดได้ (vercel/next.js) รายการ CVE-2026-96889 ใน NVD อธิบายบั๊กต้นทางว่าเป็น use-after-free ใน librsvg ซึ่งเกิดเมื่อ SVG มี XInclude ซ้อนกันพร้อมการประกาศ entity ซ้ำ (NVD)
นึกภาพร้านถ่ายเอกสารที่รับไฟล์จากใครก็ได้มาย่อขนาด แล้วเครื่องย่อมีจุดบกพร่องที่ถ้าเจอไฟล์หน้าตาแปลกบางแบบ เครื่องจะทำตามคำสั่งที่ซ่อนอยู่ในไฟล์แทน ร้านไม่ได้ผิดที่รับงาน แต่ต้องเปลี่ยนเครื่องย่อเป็นรุ่นที่แก้แล้ว
ตัว use cache อยู่ใน Cache Components ของ App Router ถ้าฟังก์ชันที่ทำเครื่องหมาย use cache คืนค่าเป็น typed array หลายตัว ก็อาจถูกใช้รันโค้ดได้ (vercel/next.js) ประกาศของ Next.js โยงปัญหานี้กับ advisory ฝั่ง React (GHSA-xqc2-xf4c-x3h3) และย้ำว่าให้อัปทันทีแม้แอปจะไม่มีฟังก์ชันลักษณะนี้ (Next.js)
เช็กง่าย ๆ ว่าเว็บเราเข้าข่ายไหม
ไม่ใช่ทุกเว็บที่ใช้ Next.js จะโดนครบทั้งสองช่องโหว่ ลองไล่ทีละข้อแบบนี้ครับ
- ใช้ Next.js 16 และเปิด Cache Components อยู่หรือเปล่า ถ้าใช่ และมีฟังก์ชัน
use cacheที่คืนค่าเป็น typed array หลายตัว แอปนั้นเข้าเงื่อนไขของ GHSA-673q-mjm6-r5xr ตรง ๆ (vercel/next.js) แต่ทีม Next.js ก็ยังขอให้ทุกคนในสาย 16 อัปอยู่ดี เพราะการไล่ตรวจโค้ดเองว่าไม่มีฟังก์ชันแบบนี้เลยนั้นพลาดง่าย - เว็บใช้ระบบย่อรูปของ Next.js กับไฟล์ SVG หรือไม่ ช่องโหว่ CVE-2026-96889 ผูกกับ Image Optimization เมื่อมี SVG เข้ามาเกี่ยว และเกิดบน Linux ที่ใช้ glibc (vercel/next.js) ซึ่งเป็นสภาพแวดล้อมที่เซิร์ฟเวอร์และ Docker image ทั่วไปจำนวนมากใช้อยู่
- ใช้ App Router คู่กับ Server Actions หรือไม่ ถ้าใช่ จะโดนช่องโหว่ DoS ระดับ High ที่ทำให้ CPU พุ่งจนโปรเซสรับคำขออื่นไม่ไหว ส่วนแอปที่ใช้ Pages Router หรือไม่ได้ใช้ Server Actions ประกาศระบุว่าไม่โดนตัวนี้ (Next.js)
ถ้าตอบว่า “ไม่แน่ใจ” สักข้อ ให้ถือว่าเข้าข่ายแล้วอัปไปเลยครับ เพราะการอัปขึ้นรุ่นแพตช์ในสายเดิมมักเปลี่ยนแค่ส่วนที่แก้บั๊ก ใช้เวลาน้อยกว่านั่งพิสูจน์ว่าตัวเองไม่โดน
ทำไมแพตช์รอบนี้ถึงออกนอกรอบ
ทีม Next.js เล่าว่าได้ประกาศล่วงหน้าหนึ่งสัปดาห์ว่าจะมีแพตช์ความปลอดภัยแบบนอกรอบ (out-of-band) และสองในสามเรื่องที่แก้คือการแก้ที่ต้องเลื่อนมาจากรอบแพตช์เดือนกันยายน เพราะรอ dependency ต้นทางที่ยังไม่พร้อม (Next.js) แปลว่าปัญหาไม่ได้อยู่ในโค้ดของ Next.js อย่างเดียว แต่ต้องรอให้ไลบรารีที่อยู่ข้างใต้แก้ก่อน ซึ่งตรงกับที่ advisory ของ Image Optimization บอกว่าปัญหาอยู่ใน “upstream library” และแนะนำให้ดูรุ่น sharp ประกอบ (vercel/next.js)
ฝั่ง use cache ก็คล้ายกัน ประกาศโยงไปยัง advisory ของ React ด้วย (Next.js) ทีมที่ใช้ React Server Components ผ่าน framework อื่นจึงควรตามดูประกาศฝั่ง React ของตัวเองด้วย ไม่ใช่ดูแค่ Next.js
ข้อมูลที่ยังไม่ชัด
- ประกาศทางการของ Next.js และ GitHub ไม่ได้ระบุว่ามีการโจมตีจริงแล้ว (Next.js) แต่นี่คือสถานะตอนเขียน ไม่ใช่คำรับรองว่าปลอดภัย
- ประกาศไม่ได้บอกรายละเอียดว่าเว็บที่โฮสต์บนแพลตฟอร์มจัดการให้ (เช่น Vercel) ได้รับการป้องกันโดยอัตโนมัติหรือไม่ จึงควรอัปเดต dependency ใน repo เองอยู่ดี
- ยังไม่มีรายละเอียดเทคนิคเต็มหรือโค้ดสาธิตจากผู้ค้นพบในประกาศทางการ
แล้วเราควรทำอะไร
- เช็กรุ่น ในโปรเจกต์ด้วย
npm ls nextและnpm ls sharp - อัปเดต ตามสายที่ใช้:
npm install [email protected]หรือnpm install [email protected](Next.js) แล้ว build และ deploy ใหม่ ถ้าใช้ Docker ให้ build image ใหม่ด้วย - ถ้ายังอัป Next.js ไม่ได้ทันที สำหรับช่องโหว่ Image Optimization ให้แน่ใจว่า
sharpที่ Next.js ใช้เป็นรุ่น 0.35.5 ขึ้นไป (vercel/next.js) แต่ทางนี้ไม่ช่วยเรื่องuse cacheซึ่งไม่มีทางเลี่ยง - เริ่มจากเว็บที่รับรูปหรือ SVG จากผู้ใช้ และเว็บที่เปิดสู่อินเทอร์เน็ตก่อน
- รัน
npm auditใน CI ตอนนี้รายการนี้อยู่ในฐานข้อมูลแล้ว (GitHub Advisory Database) ใช้ผลนั้นไล่หาโปรเจกต์ที่ยังค้างอยู่
ผมมองว่า…
เรื่องนี้ไม่ใช่แค่ข่าว Next.js แต่คือบทเรียนเรื่อง dependency ที่ซ้อนกันหลายชั้น เราเขียนแค่แท็กรูป แต่ข้างใต้มี sharp และไลบรารีจัดการรูปอีกชั้นที่เราไม่เคยเปิดดู แพตช์ออกมาเกือบสิบวันแล้ว ใครยังไม่ได้อัปเพราะไม่เห็นคำเตือน ตอนนี้คำเตือนมาแล้วครับ ผมว่าควรจบภายในคืนนี้
Recap
- Next.js 16.x อัปเป็น 16.4.1
- Next.js 15.x (ย้อนไปถึง 10.x) อัปเป็น 15.5.28
- เช็ก
sharpให้เป็น 0.35.5 ขึ้นไป - build และ deploy ใหม่ รวมถึง Docker image
- เพิ่ม
npm auditใน CI