ข้ามไปยังเนื้อหา
กลับหน้ารายการบทความ

serialize-javascript แก้ XSS กรณี function body จบที่แท็กปิด script ในรุ่น 7.1.3

CVE-2026-115754 เป็น XSS ใน serialize-javascript ที่เกิดเมื่อผู้โจมตีควบคุมข้อความต้นฉบับของฟังก์ชันและผลลัพธ์ถูกฝังใน HTML แก้แล้วใน 7.1.3

serialize-javascript แก้ XSS กรณี function body จบที่แท็กปิด script ในรุ่น 7.1.3

Yahoo เผยแพร่คำแนะนำสำหรับ CVE-2026-115754 ในแพ็กเกจ serialize-javascript ซึ่งนิยมใช้แปลงข้อมูล JavaScript ให้ฝังในหน้า HTML ได้อย่างปลอดภัย ช่องโหว่นี้เป็น cross-site scripting (XSS) แบบมีเงื่อนไขเฉพาะ: ข้อความต้นฉบับของ ฟังก์ชัน ที่ถูก serialize ต้องถูกผู้โจมตีควบคุม และลงท้ายด้วยลำดับอักขระที่ทำให้เบราว์เซอร์มองว่าแท็ก <script> กำลังสิ้นสุด เมื่อผลลัพธ์ถูกฝังในหน้าเว็บ โค้ดที่ตามมาอาจหลุดจากขอบเขตของสคริปต์และกลายเป็น HTML ที่ทำงานได้ ผู้ดูแลแก้ไขในรุ่น 7.1.3 แล้ว

จุดบกพร่องอยู่ที่ขอบเขต HTML ไม่ใช่ตัวรัน JavaScript

แพ็กเกจนี้ออกแบบให้ escape อักขระที่อาจทำให้ผลลัพธ์ออกจาก <script> หากใช้ส่งสถานะแอปจากเซิร์ฟเวอร์ไปยังเบราว์เซอร์ แต่ HTML parser ของเบราว์เซอร์มีกติกาการปิดแท็กของตัวเอง ซึ่งทำงานก่อน JavaScript engine จะตีความเนื้อหา คำแนะนำของ Yahoo ระบุว่าก่อน 7.1.3 การ escape ในส่วนของ function body จะจับลำดับ </script เฉพาะเมื่อมีอักขระที่ถือเป็นตัวคั่นตามหลังอยู่ภายใน body เดียวกัน เช่น ช่องว่างหรือเครื่องหมาย >

ถ้า body จบลงที่ </script พอดี โดยยังไม่มีตัวคั่นในข้อความส่วนนี้ ฟังก์ชัน escape เดิมจะปล่อยลำดับดังกล่าวออกไป เมื่อผลลัพธ์ที่ serialize ส่วนถัดไปเติมตัวคั่นหรือเครื่องหมายปิดแท็ก เบราว์เซอร์อาจมองว่า <script> จบแล้ว ข้อมูลถัดมาจึงถูกตีความเป็น markup ปกติและเปิดทางให้ XSS ได้ ผู้ดูแลแก้ regex ให้ตรวจรูปแบบที่อยู่ท้าย function body ด้วย ไม่ต้องรออักขระถัดไปภายใน body

ใครเสี่ยงจริง

เงื่อนไขสำคัญคือผู้โจมตีต้องกำหนดข้อความต้นฉบับของฟังก์ชันที่นำไป serialize ได้ โดยคำแนะนำยกกรณีการปลอม toString() ของฟังก์ชัน ฟังก์ชันทั่วไปที่เขียนตามปกติจะลงท้ายด้วย } และไม่ได้เข้ารูปแบบนี้ ข้อมูลที่ไม่ใช่ฟังก์ชัน รวมถึง string ที่มีข้อความคล้ายแท็กปิดสคริปต์ ถูก escape ถูกต้องตามคำแนะนำต้นทาง จึงไม่ควรตีความว่าทุกแอปที่มี dependency นี้สามารถถูกโจมตีด้วย string ธรรมดา

อีกเงื่อนไขคือผลลัพธ์ต้องถูกนำไปฝังใน <script> ของ HTML ที่ผู้ใช้เปิด หากแอป serialize ข้อมูลไปเก็บไฟล์หรือใช้ในช่องทางอื่นโดยไม่กลายเป็น HTML ที่เบราว์เซอร์แสดง ผลกระทบ XSS ตามกรณีนี้ก็ไม่เกิดขึ้นในจุดนั้น ทีมพัฒนาควรไล่ดูเส้นทางข้อมูลจริงว่าแอปรับ object หรือ function จากปลั๊กอิน เทมเพลต โค้ดที่โหลดภายนอก หรือระบบขยายที่ผู้โจมตีควบคุมได้หรือไม่ แล้วนำผล serialize ไปแทรกในหน้าเว็บอย่างไร

เวอร์ชันที่ได้รับผลกระทบและการรับมือ

คำแนะนำระบุแพ็กเกจ serialize-javascript ก่อน 7.1.3 ได้รับผลกระทบ และ 7.1.3 เป็นรุ่นแก้ ตรวจเวอร์ชันใน lockfile และ dependency tree ของแอปจริง เพราะไลบรารีอาจถูกดึงเข้ามาทางแพ็กเกจอื่น จากนั้นอัปเดตและทดสอบหน้าเว็บที่ฝังผล serialize โดยเฉพาะส่วนที่ส่งฟังก์ชันหรือใช้การแทนที่ toString() เอง

ถ้ายังอัปเดตไม่ได้ Yahoo แนะนำไม่ให้ serialize function value ที่ข้อความต้นฉบับหรือ toString() ถูกผู้โจมตีมีอิทธิพลได้ การตัดเส้นทางข้อมูลดังกล่าวเป็นมาตรการชั่วคราวเฉพาะกรณี แต่ไม่ควรใช้เป็นเหตุผลเลื่อนอัปเดตถ้า dependency ยังอยู่ใน production สำหรับแอปที่ต้องส่งข้อมูลจากเซิร์ฟเวอร์ไปยังหน้าเว็บ ให้แยกข้อมูลที่จำเป็นออกจากฟังก์ชันและทบทวนจุดที่แทรกข้อความลง HTML เพื่อให้ขอบเขตของเนื้อหาไม่คลุมเครือ

ลำดับเวลาจากต้นทาง

ข้อมูล npm ระบุว่า 7.1.3 เผยแพร่วันที่ 22 ตุลาคม 2026 เวลา 21:24:35 UTC คำแนะนำความปลอดภัยบน GitHub ของ Yahoo เผยแพร่ครั้งแรกวันเดียวกันเวลา 21:28:21 UTC และระเบียน CVE-2026-115754 เผยแพร่ครั้งแรกวันที่ 23 ตุลาคม 2026 เวลา 13:20:43 UTC ความรุนแรงในคำแนะนำจัดเป็นระดับต่ำ เนื่องจากต้องมีการควบคุมข้อความต้นฉบับของฟังก์ชันและการฝังผลใน HTML ตามเงื่อนไขข้างต้น

อ่าน คำแนะนำความปลอดภัยของ Yahoo, ระเบียน CVE และ รุ่น 7.1.3 บน npm