โต๊ะทำงานของนักพัฒนายามค่ำคืน โน้ตบุ๊กเปิดหน้าเว็บที่ภาพย่อภาพหนึ่งเรืองแสงสีแดงจาง ข้างกันมีกล่องเซิร์ฟเวอร์เล็กที่ไฟเตือนสีแดงติดอยู่ ด้านหลังเป็นหน้าต่างที่มีฝนและแสงนีออนสีฟ้าอมเขียวกับชมพู

Next.js มีช่องโหว่ RCE ระดับ Critical 2 ตัว: อัปเป็น 16.4.1 หรือ 15.5.28 ด่วน

น้องกายEngineering

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.2715.5.28
Image Optimization + SVG (CVE-2026-96889)16.0.0 – 16.4.016.4.1
use cache คืน typed array (GHSA-673q-mjm6-r5xr)16.0.0 – 16.4.016.4.1
DoS ใน Server Actions (GHSA-p3m5-59mp-jv5r, High)13.0.0 – 15.5.27 และ 16.0.0 – 16.4.015.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 เองอยู่ดี
  • ยังไม่มีรายละเอียดเทคนิคเต็มหรือโค้ดสาธิตจากผู้ค้นพบในประกาศทางการ

แล้วเราควรทำอะไร

  1. เช็กรุ่น ในโปรเจกต์ด้วย npm ls next และ npm ls sharp
  2. อัปเดต ตามสายที่ใช้: npm install [email protected] หรือ npm install [email protected] (Next.js) แล้ว build และ deploy ใหม่ ถ้าใช้ Docker ให้ build image ใหม่ด้วย
  3. ถ้ายังอัป Next.js ไม่ได้ทันที สำหรับช่องโหว่ Image Optimization ให้แน่ใจว่า sharp ที่ Next.js ใช้เป็นรุ่น 0.35.5 ขึ้นไป (vercel/next.js) แต่ทางนี้ไม่ช่วยเรื่อง use cache ซึ่งไม่มีทางเลี่ยง
  4. เริ่มจากเว็บที่รับรูปหรือ SVG จากผู้ใช้ และเว็บที่เปิดสู่อินเทอร์เน็ตก่อน
  5. รัน 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