สรุปสั้น

บริษัท Vercel เปิดเผยช่องโหว่ความปลอดภัยตัวใหม่ใน Next.js ที่อาจเปิดให้ผู้โจมตีรันโค้ดบนเซิร์ฟเวอร์ผ่าน ImageResponse ซึ่งเป็นฟีเจอร์สำหรับสร้างภาพ Open Graph และภาพพรีวิวสำหรับโซเชียลมีเดีย ช่องโหว่นี้เกิดขึ้นเมื่อแอปนำค่าที่ผู้โจมตีควบคุมได้ เช่น ข้อความที่อ่านมาจาก URL ของคำขอ ไปใส่ในภาพที่สร้างขึ้น ช่องโหว่ถูกติดตามในรหัส CVE-2026-94545 มีคะแนน CVSS 9.5 ระดับร้ายแรง และกระทบ Next.js เวอร์ชัน 16.2.0 ถึง 16.3.5 เฉพาะเมื่อ ImageResponse ทำงานบน Node.js runtime ซึ่งเป็นค่าเริ่มต้นของ Next.js ส่วนเวอร์ชัน Edge และ Next.js 15 ไม่ได้รับผลกระทบ บริษัท Vercel ได้แก้ไขช่องโหว่เมื่อวันที่ 22 กันยายนในเวอร์ชัน 16.3.6 ต้นตอที่แท้จริงอยู่ในไลบรารี Satori ที่ Next.js ใช้แปลงเลย์เอาต์ภาพให้เป็นโค้ด SVG ก่อนสร้างเป็น PNG

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

เว็บไซต์ The Hacker News รายงานเมื่อวันที่ 23 กันยายน พ.ศ. 2569 ว่า มีช่องโหว่ใหม่ใน Next.js ที่อาจเปิดให้ผู้โจมตีรันโค้ดบนเซิร์ฟเวอร์ผ่าน ImageResponse ตามที่บริษัท Vercel ผู้พัฒนา Next.js ระบุ

ImageResponse ใช้ไลบรารี Satori ของ Vercel ในการแปลงเลย์เอาต์ภาพให้เป็นโค้ด SVG ก่อนที่จะสร้างเป็นภาพ PNG สุดท้าย แอปที่ได้รับผลกระทบคือแอปที่ “ส่งค่าที่ผู้โจมตีควบคุมได้เข้าไปในเนื้อหา แอตทริบิวต์ หรือสไตล์ของ SVG ระหว่างการสร้างภาพ” ตามคำแนะนำของ Vercel โดยตัวอย่างในคำแนะนำนำค่าจาก URL ของคำขอไปวางไว้ในองค์ประกอบ title ของ SVG แต่ไม่ได้ระบุว่าข้อความในองค์ประกอบทั่วไป เช่น หัวเรื่องภายใน div จะนับด้วยหรือไม่

วิธีค้นหาจุดที่แอปใช้ฟีเจอร์นี้คือ ให้มองหา ImageResponse ที่ถูก import มาจาก next/og เช่นในไฟล์ route handlers และไฟล์ opengraph-image โดย route handlers จะสร้างภาพเมื่อมีคำขอเข้ามา ส่วนไฟล์ opengraph-image สามารถสร้างภาพได้ทั้งตอน build หรือตอนที่มีคำขอเข้ามา ทั้งนี้ ณ วันที่ 23 กันยายน The Hacker News พบว่ายังไม่มีรายงานการโจมตีที่ใช้ช่องโหว่นี้และยังไม่มีโค้ดโจมตีสาธารณะ

แพตช์ที่แก้ไขคือ Next.js 16.3.6 ซึ่งเป็นเวอร์ชันเดียวที่ได้รับการแก้ไข ติดตั้งด้วยคำสั่ง npm install next@16.3.6 อนึ่ง ณ วันที่ 23 กันยายน รีจิสตรี npm ยังไม่มีรุ่นแก้ไขสำหรับสาย 16.2 ดังนั้นแอปที่อยู่บน 16.2 จึงต้องย้ายไปเป็น 16.3.6 ส่วน Next.js 15.5.26 เพิ่มการเสริมความแข็งแกร่งด้านความปลอดภัยให้ next/og บนสาย 15.5

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

บั๊กที่แท้จริงอยู่ในไลบรารี Satori โดยคำแนะนำของ Satori ที่เผยแพร่ในวันเดียวกันระบุว่า มีบางค่าที่หลุดไปยังผลลัพธ์ SVG โดยไม่ได้ถูก escape อย่างเหมาะสม ค่าที่ถูกดัดแปลงมาเป็นพิเศษจึงอาจถูกตีความว่าเป็นโค้ด SVG แทนที่จะเป็นข้อความธรรมดา ในบริบทของ Next.js ค่าดังกล่าวอาจไปกระตุ้นช่องโหว่ในไลบรารีอื่น ๆ ที่ Next.js พึ่งพาและนำไปสู่การรันโค้ด ตามที่ Vercel ระบุ แม้บริษัทจะยังไม่ได้เปิดเผยชื่อไลบรารีเหล่านั้น

คำแนะนำของ Satori ให้คะแนน CVE เดียวกันนี้ในระดับปานกลางที่ 5.3 และระบุว่าผลกระทบขึ้นอยู่กับวิธีการนำผลลัพธ์ SVG ไปใช้ นักพัฒนาที่ใช้ Satori โดยตรงควรอัปเดตเป็นเวอร์ชัน 0.33.5 ซึ่งมีการแก้ไขแล้ว

มีข้อสังเกตที่น่ากังวลหลายจุด คือ Satori ถูกรวมมาในแพ็กเกจ Next.js อยู่แล้ว ไฟล์ lockfile จึงไม่ได้ระบุ Satori ว่าเป็น dependency ของ Next.js ทำให้ต้องตรวจสอบเวอร์ชัน Next.js โดยตรง นอกจากนี้ในการทดสอบของ The Hacker News เมื่อวันที่ 23 กันยายน คำสั่ง npm audit ยังไม่แจ้งเตือน Next.js 16.3.5 ซึ่งเป็นเวอร์ชันที่มีช่องโหว่ และคำแนะนำนี้ยังไม่ปรากฏในฐานข้อมูล GitHub Advisory อีกทั้งยังไม่มีการเผยแพร่บันทึก CVE สำหรับ CVE-2026-94545 คำแนะนำและประกาศของ Vercel ยังไม่ได้ระบุว่าแอปที่โฮสต์บน Vercel ได้รับการป้องกันหรือไม่ และไม่มีวิธีตรวจสอบว่า route ที่ได้รับผลกระทบถูกใช้โจมตีก่อนแพตช์หรือไม่ โดยเวอร์ชันที่มีช่องโหว่มีให้ใช้มาตั้งแต่ Next.js 16.2 ออกเมื่อวันที่ 18 มีนาคม

ผลกระทบ

ช่องโหว่นี้กระทบเว็บแอปที่สร้างด้วย Next.js ซึ่งใช้ ImageResponse เพื่อสร้างภาพพรีวิวแบบไดนามิก และนำค่าที่ผู้เยี่ยมชมควบคุมได้ เช่น พารามิเตอร์ใน URL ไปประกอบเป็นภาพ เนื่องจาก Node.js runtime เป็นค่าเริ่มต้นและการสร้างภาพ Open Graph แบบไดนามิกเป็นรูปแบบที่ใช้กันแพร่หลาย ขอบเขตของแอปที่อาจเข้าข่ายจึงกว้าง การรันโค้ดบนเซิร์ฟเวอร์เปิดให้ผู้โจมตีเข้าควบคุมกระบวนการฝั่งเซิร์ฟเวอร์ได้ ซึ่งอาจต่อยอดไปสู่การเข้าถึงข้อมูลหรือระบบภายในอื่น ๆ จุดที่ทำให้ความเสี่ยงสูงขึ้นคือ เครื่องมือตรวจสอบมาตรฐานอย่าง npm audit ยังไม่ธงเตือนในช่วงแรก และช่องโหว่ยังไม่ปรากฏในฐานข้อมูลกลาง ทำให้ทีมพัฒนาหลายรายอาจไม่รู้ตัวว่าต้องรีบอัปเดต

คำแนะนำ

ทีมพัฒนาควรอัปเกรดเป็น Next.js 16.3.6 ทันที ซึ่งเป็นเวอร์ชันเดียวที่แก้ไขช่องโหว่ แอปที่อยู่บนสาย 16.2 ให้ย้ายไปเป็น 16.3.6 โดยตรงเพราะยังไม่มีรุ่นแก้บนสาย 16.2 หากยังอัปเกรดทันทีไม่ได้ วิธีบรรเทาตามคำแนะนำคือ อย่านำค่าที่ผู้โจมตีควบคุมได้เข้าไปในเนื้อหา แอตทริบิวต์ และสไตล์ของ SVG ที่ ImageResponse บน Node.js เรนเดอร์ ควรตรวจสอบโค้ดที่ import ImageResponse จาก next/og ทั้งใน route handlers และไฟล์ opengraph-image และตรวจเวอร์ชัน Next.js โดยตรงแทนการพึ่ง lockfile หรือ npm audit เพียงอย่างเดียว สำหรับผู้ที่ใช้ Satori โดยตรงให้อัปเดตเป็นเวอร์ชัน 0.33.5

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