มือช่างกำลังเปลี่ยนโมดูลหกเหลี่ยมเรืองแสงสีเขียวในตู้เซิร์ฟเวอร์ยามค่ำ มีไฟสถานะรูปกุญแจเล็กๆ สามดวงอยู่ด้านหลัง

Node.js ออกแพตช์ความปลอดภัยตุลาคม: อัปเป็น 26.12.1, 24.22.1 หรือ 22.23.4

น้องกายEngineering

ทีม Node.js ปล่อย security release ประจำเดือนตุลาคมแล้วเมื่อ 21 ตุลาคม 2026 ครบทั้งสามสายที่ยังซัพพอร์ต ถ้าเซิร์ฟเวอร์ คอนเทนเนอร์ หรือ CI ของคุณรัน Node.js อยู่ ให้อัปเป็น 26.12.1, 24.22.1 หรือ 22.23.4 ตามสายที่ใช้ (Node.js) รอบนี้ไม่เกี่ยวกับแพตช์ PHP เมื่อคืน เป็นชุดช่องโหว่ของ Node.js เองครับ

สรุป 30 วินาที

  • ปิดช่องโหว่ 10 รายการ: ระดับ high 4, medium 3, low 3 ระดับสูงสุดของรอบนี้คือ HIGH ทุกสาย (Node.js)
  • ตัวที่น่ากลัวสุดคือ CVE-2026-111497 ตัวถอดบีบอัด Brotli เขียนข้อมูลเกินขอบเขต ทีม Node.js ระบุว่าอาจถูกใช้รันโค้ดจากระยะไกล (Node.js)
  • อีกกลุ่มคือการ หลบการเช็กชื่อในใบรับรอง TLS ด้วยการเขียน IP แบบแปลกๆ เช่นตัวเลขเต็มความกว้าง (fullwidth) หรือ IPv4 รูปแบบไม่มาตรฐาน (Node.js 24.22.1)
  • รุ่นที่หมดอายุแล้ว (เช่น Node 20 ลงไป) โดนเสมอและไม่มีแพตช์ (Node.js)

ทำไมเรื่องนี้เกี่ยวกับคุณ

Node.js ไม่ได้อยู่แค่ในเครื่องของโปรแกรมเมอร์ครับ เว็บร้านค้าที่ทำด้วย Next.js หรือ Nuxt, หลังบ้านแอปส่งอาหาร, บอต LINE ที่ตอบลูกค้าอัตโนมัติ, ระบบจองคิวคลินิก, เครื่องมือ build หน้าเว็บใน CI ไปจนถึง Lambda ที่รันงานกลางคืน ล้วนมี Node.js อยู่ข้างใต้ ต่อให้คุณไม่เคยพิมพ์คำสั่ง node เลย ถ้าทีมหรือเอเจนซีที่ทำเว็บให้ใช้ JavaScript ฝั่งเซิร์ฟเวอร์ ข่าวนี้ก็เกี่ยวกับคุณโดยตรง

ช่องโหว่รอบนี้กระทบงานพื้นฐานที่แทบทุกแอปทำอยู่ทุกวัน คือการต่อ HTTPS ไปหา API ภายนอก การถามชื่อโดเมนผ่าน DNS และการแกะข้อมูลที่ถูกบีบอัดมา (Node.js) ถ้าแอปของคุณดึงข้อมูลจากเว็บอื่น รับไฟล์จากผู้ใช้ หรือเรียกบริการชำระเงิน ทุกจุดนั้นวิ่งผ่านโค้ดที่ถูกแก้ในรอบนี้ ผลที่แย่ที่สุดคือคนนอกส่งข้อมูลที่ปั้นมาเป็นพิเศษให้แอปแกะ แล้วได้สิทธิ์รันคำสั่งบนเซิร์ฟเวอร์ หรือแอปถูกหลอกให้เชื่อเซิร์ฟเวอร์ปลอมว่าเป็นของจริง ซึ่งแปลว่ารหัสผ่าน โทเคน หรือข้อมูลลูกค้าที่ส่งออกไปอาจไปตกอยู่ในมือคนอื่น

สำหรับคนที่ใช้บริการแบบ managed อย่าง Vercel, Netlify, Cloud Run หรือ AWS Lambda ภาระอาจไม่ได้อยู่ที่คุณทั้งหมด บางเจ้าอัป runtime ให้เอง บางเจ้ารอให้คุณเปลี่ยนเวอร์ชันในไฟล์ตั้งค่าเอง ส่วนคนที่ build Docker image เองหรือมีเซิร์ฟเวอร์ VPS ภาระอยู่ที่คุณเต็มๆ ครับ ไม่มีใครมาอัปให้

รุ่นที่ต้องอัป

สาย Node.jsสถานะรุ่นที่แก้แล้ว
26.xCurrent26.12.1
24.x ‘Krypton’LTS24.22.1
22.x ‘Jod’LTS22.23.4

ยืนยันเลขรุ่นได้ทั้งจากบล็อก Node.js และหน้า releases บน GitHub (GitHub v26.12.1, GitHub v22.23.4)

ช่องโหว่ระดับ high ทั้ง 4 ตัว

CVEเรื่องสายที่โดน
CVE-2026-111497Brotli decoder เขียนเกินขอบเขต อาจรันโค้ดได้26, 24, 22
CVE-2026-105482dns.resolve ตัดชื่อที่มีอักขระ NUL26, 24, 22
CVE-2026-105483หลบเช็ก hostname ใน TLS เมื่อเขียน IP ด้วยตัวเลข fullwidth26, 24
CVE-2026-106069หลบเช็ก hostname ใน TLS เมื่อ host แปลงเป็น IP แบบหลวมๆ26, 24, 22

ระดับ medium มี keep-alive socket รับคำตอบที่ถูกเขียนไว้ก่อนส่ง request (CVE-2026-105481), การยอมให้ชื่อโดเมนใน SAN ยืนยันตัวตนแทน IP เมื่อเขียน IPv4 แบบไม่มาตรฐาน (CVE-2026-106072) และ crypto.randomUUID() กับ randomInt() ที่เก็บแคชความสุ่มติดไปกับ startup snapshot และ SEA ทำให้ทุก process ได้ค่าซ้ำกัน (CVE-2026-106074) ส่วนระดับ low เป็นเรื่อง Permission Model สองตัวและ ZipFile บนสาย 26 (Node.js)

นอกจากนี้ยังอัปเดต dependency ที่มีช่องโหว่สาธารณะ ได้แก่ c-ares, Undici, OpenSSL (สาย 24 และ 22), SQLite (สาย 22) และรายการใบรับรองหลัก ซึ่งถอดใบรับรองที่เกี่ยวกับเหตุ CA กลางของ eMudhra ถูกเจาะ (Node.js) อ่านเรื่อง eMudhra เพิ่มได้ใน ข่าวก่อนหน้า ใน 24.22.1 คือ OpenSSL 3.5.9, Undici 7.30.1, c-ares 1.34.9 และ root certificates จาก NSS 3.131.1 (Node.js 24.22.1)

ทำงานยังไง (พร้อมอุปมาไทย)

นึกถึงยามหน้าหมู่บ้านที่เช็กชื่อบนบัตรผ่านกับบ้านเลขที่ ช่อง TLS รอบนี้เหมือนคนร้ายเขียนบ้านเลขที่ด้วยเลขไทยหรือเลขตัวใหญ่แปลกตา ยามอ่านแล้วนึกว่าตรงกับบัตร เลยเปิดไม้กั้นให้ ในโลกจริง ใบรับรอง TLS บอกว่า “ฉันคือเซิร์ฟเวอร์ชื่อนี้หรือ IP นี้” และ Node.js มีหน้าที่เทียบว่าที่อยู่ที่แอปตั้งใจต่อไปตรงกับในใบรับรองไหม ปัญหาคือ IP เขียนได้หลายหน้าตา เช่นตัวเลขเต็มความกว้างแบบที่พิมพ์จากคีย์บอร์ดภาษาญี่ปุ่น หรือ IPv4 ที่เขียนเป็นเลขฐานแปดหรือฐานสิบหก ตัวเช็กเดิมแปลงที่อยู่พวกนี้ไม่ตรงกับที่ระบบเครือข่ายแปลงจริง จึงเกิดช่องให้ใบรับรองที่ไม่ควรผ่านกลับผ่านได้ ทางแก้ใน 24.22.1 คือปฏิเสธ IP ที่ไม่ได้เขียนในรูปแบบมาตรฐานไปเลย และแก้ปัญหาการ normalize IP ที่ถอยหลังไปจากรุ่นก่อน (Node.js 24.22.1)

ช่อง Brotli เหมือนพัสดุที่แพ็กมาแน่นผิดปกติ พอแกะแล้วของทะลักออกนอกโต๊ะไปทับเอกสารสำคัญข้างๆ Brotli เป็นวิธีบีบอัดข้อมูลที่เว็บใช้กันทั่วไป แอปที่แกะข้อมูล Brotli จากภายนอก ไม่ว่าจะผ่านโมดูล zlib หรือการดาวน์โหลดที่ใช้ Content-Encoding: br จะส่งข้อมูลเข้าไปในตัวถอดรหัสโดยตรง ถ้าตัวถอดรหัสเขียนข้อมูลเกินพื้นที่ที่จองไว้ คนร้ายก็อาจเขียนทับหน่วยความจำส่วนอื่นจนควบคุมการทำงานได้ ทีม Node.js แก้ด้วยการดึงโค้ดแก้จากโปรเจกต์ Brotli ต้นทางเข้ามา (Node.js 24.22.1)

ช่อง dns.resolve เหมือนพนักงานรับโทรศัพท์ที่จดชื่อลูกค้าแค่ถึงช่องว่างแรก ชื่อ “bank.com” ตามด้วยอักขระว่าง (NUL) แล้วต่อท้ายด้วยอะไรก็ได้ จะถูกตัดเหลือ “bank.com” ถ้าแอปเช็กชื่อเต็มอย่างหนึ่งแต่ถาม DNS ด้วยชื่อที่ถูกตัด ก็อาจหลุดกฎที่ตั้งไว้ รุ่นใหม่จึงตรวจและปฏิเสธชื่อที่มี null byte (Node.js 24.22.1)

ส่วนเรื่องค่าสุ่มซ้ำ ลองนึกถึงตู้กดบัตรคิวที่ถูกถ่ายสำเนาทั้งตู้ไปวางหลายสาขา ทุกสาขาจึงออกเลขคิวชุดเดียวกัน ถ้าคุณ build แอปเป็น startup snapshot หรือ single executable application แคชความสุ่มของ crypto.randomUUID() จะติดไปในไฟล์ ทุก process ที่เปิดจากไฟล์นั้นจึงได้ UUID ชุดเดิม ซึ่งอันตรายมากถ้าเอาไปใช้เป็นรหัสเซสชันหรือโทเคน รุ่นใหม่ล้างแคชนี้ทุกครั้งข้าม snapshot (Node.js 24.22.1)

ต้องทำอะไรวันนี้

  1. เช็กรุ่นด้วย node -v บนเครื่อง ในคอนเทนเนอร์ และใน CI
  2. อัปเป็น 26.12.1, 24.22.1 หรือ 22.23.4 แล้ว rebuild Docker image ที่อิง node:<เวอร์ชัน> ใหม่ ไม่ใช่แค่ restart
  3. ถ้าใช้ startup snapshot หรือ single executable application (SEA) ให้ build ใหม่ด้วยรุ่นที่แก้แล้ว เพราะค่าสุ่มติดอยู่ในไฟล์ที่ build ไว้
  4. ยังอยู่บน Node 20 หรือเก่ากว่า ให้วางแผนย้ายขึ้น 22 หรือ 24 เพราะรุ่น EOL ไม่ได้แพตช์ (Node.js)

แพตช์รอบนี้ไม่ได้เปลี่ยน API ใหญ่ จึงอัปได้เร็ว แต่ควรลองบน staging ก่อน โดยเฉพาะบริการที่ต่อ TLS ไปหา IP ตรงๆ เพราะ Node.js จะปฏิเสธ IP ที่เขียนไม่เป็นรูปแบบมาตรฐานแล้วครับ (Node.js 24.22.1)

ข้อมูลที่ยังไม่ชัด และจุดที่แหล่งข่าวพูดไม่ตรงกัน

  • ประกาศของ Node.js ยังไม่ให้รายละเอียดเชิงเทคนิคหรือโค้ดสาธิตการโจมตี จึงยังไม่รู้ว่า CVE-2026-111497 ใช้โจมตีจริงได้ง่ายแค่ไหน และยังไม่มีรายงานว่าถูกใช้โจมตีจริงแล้ว (Node.js)
  • ประกาศเขียนคะแนนเป็นระดับ high, medium, low แต่ไม่ได้ใส่ตัวเลข CVSS ในหน้าเดียวกัน ถ้าองค์กรของคุณจัดลำดับแพตช์ตามคะแนน CVSS อาจต้องรอฐานข้อมูล CVE อัปเดต
  • ช่อง CVE-2026-105483 ประกาศว่ากระทบสาย 26 และ 24 เท่านั้น ส่วน CVE-2026-106070 และ CVE-2026-106071 กระทบสาย 26 อย่างเดียว (Node.js) สาย 22 จึงได้แพตช์ไม่ครบทุกตัวเพราะไม่ได้โดนทุกตัว ไม่ได้แปลว่าตกหล่น
  • ผู้ให้บริการ cloud และ distro Linux แต่ละเจ้าจะปล่อยแพ็กเกจตามมาไม่พร้อมกัน ตอนเขียนบทความเรายังไม่ได้ตรวจทุกเจ้า ให้เช็กหน้าประกาศของผู้ให้บริการที่คุณใช้เองอีกครั้ง
  • Docker image ทางการ node มักตามมาภายในไม่กี่ชั่วโมงถึงหนึ่งวัน ถ้า pin เป็น tag แบบ digest ไว้ ต้องเปลี่ยน digest เองด้วย

Recap

Node.js ออก security release วันที่ 21 ตุลาคม 2026 ปิดช่องโหว่ 10 รายการ ระดับ high 4 ตัว รุ่นที่ต้องอัปคือ 26.12.1 (Current), 24.22.1 (LTS ‘Krypton’) และ 22.23.4 (LTS ‘Jod’) ตัวที่ควรห่วงที่สุดคือ Brotli decoder ที่อาจถูกใช้รันโค้ด และกลุ่มการหลบเช็กใบรับรอง TLS ด้วย IP รูปแบบแปลก ทางแก้มีทางเดียวคืออัปเดต rebuild image และ build snapshot หรือ SEA ใหม่ ใครยังอยู่บนรุ่นที่หมดอายุ ให้ถือว่าโดนทุกช่องและวางแผนย้ายสายทันทีครับ