สรุปสั้น
โครงการ Node.js ออกอัปเดตความปลอดภัยประจำเดือนตุลาคม 2569 สำหรับสายรุ่น 26.x, 24.x และ 22.x แก้ช่องโหว่รวม 10 รายการ โดยรุ่นที่แก้แล้วคือ 26.12.1, 24.22.1 และ 22.23.4 ในจำนวนนี้มีช่องโหว่ระดับสูง (High) 4 รายการ ที่ร้ายแรงที่สุดคือ CVE-2026-111497 การเขียนข้อมูลเกินขอบเขตหน่วยความจำ (out-of-bounds write) ใน Brotli decoder ที่อาจนำไปสู่การรันโค้ดจากระยะไกล (RCE) และกระทบทั้ง 3 สายรุ่น ช่องโหว่ระดับสูงอีก 2 รายการเกี่ยวกับการตรวจชื่อโฮสต์ในใบรับรอง TLS ที่ถูกข้ามได้ และอีกรายการทำให้ dns.resolve ตัดชื่อที่มีอักขระ NUL
นอกจากนี้ยังมีช่องโหว่ระดับกลางเรื่องลำดับคำขอ-คำตอบของ HTTP keep-alive การตรวจใบรับรองกับชื่อโฮสต์ IPv4 รูปแบบไม่มาตรฐาน และค่าสุ่มเชิงวิทยาการเข้ารหัสลับที่ซ้ำกันในโปรเซสที่สร้างจาก startup snapshot ส่วนระดับต่ำเกี่ยวกับการตรวจ ZIP และการข้าม Permission Model ด้านระบบไฟล์ ยังไม่มีรายงานการโจมตีจริง และยังไม่มีรายละเอียดเงื่อนไขการโจมตี Brotli แต่แอปพลิเคชันที่รับข้อมูลบีบอัดแบบ Brotli จากแหล่งที่ไม่น่าเชื่อถือควรอัปเดตเป็นลำดับแรก
รายละเอียดข่าว
เว็บไซต์ Cybersecurity News รายงานเมื่อวันที่ 21 ตุลาคม 2569 ว่า Node.js ออกอัปเดตความปลอดภัยสำหรับสายรุ่น 26.x, 24.x และ 22.x เพื่อแก้ช่องโหว่ 10 รายการ รวมถึงช่องโหว่ระดับสูง 4 รายการที่กระทบการค้นหา DNS การตรวจใบรับรอง TLS และการคลายการบีบอัด Brotli Node.js กำหนดออกรุ่นเหล่านี้ในวันที่ 21 ตุลาคม 2569 และระบุว่าระดับความรุนแรงสูงสุดในทุกสายรุ่นคือ High
ศูนย์ HKCERT ของฮ่องกงออกประกาศเมื่อวันที่ 22 ตุลาคม 2569 ยืนยันรายการ CVE ทั้ง 10 รายการ และรุ่นที่ต้องอัปเดตคือ 22.23.4 (LTS), 24.22.1 (LTS) และ 26.12.1 (Current) พร้อมจัดผลกระทบเป็นการปฏิเสธการให้บริการ การรันโค้ดจากระยะไกล การเปิดเผยข้อมูล และการข้ามข้อจำกัดด้านความปลอดภัย
อัปเดตรอบนี้ยังรวมการอัปเดต component ที่ Node.js ใช้ ได้แก่ c-ares, ชุดใบรับรอง CA, Undici, OpenSSL และ SQLite ซึ่งครอบคลุมแต่ละสายรุ่นไม่เท่ากัน ข้อควรระวังเรื่องหลักฐานคือ Cybersecurity News ระบุในบทความเองว่าหน้าประกาศของ Node.js ที่ดึงมาระหว่างทำข่าวยังเป็นประกาศล่วงหน้าที่ไม่มีรายละเอียด CVE และแนะนำให้ตรวจกับประกาศฉบับเต็มอีกครั้ง ส่วนที่ยืนยันได้จาก HKCERT คือเลข CVE และรุ่นที่แก้ ส่วนคำอธิบายรายช่องโหว่มาจาก Cybersecurity News
อัปเดต 23 ต.ค. 2569: เงื่อนไขของช่องโหว่ Brotli, PoC ที่ยังไปไม่ถึง RCE และการบล็อกกุญแจ eMudhra
เว็บไซต์ The Hacker News รายงานเมื่อวันที่ 22 ตุลาคม 2569 ว่าโค้ด Brotli ที่มีช่องโหว่เป็นสำเนาที่ Node.js ฝังมาเอง ไม่ใช่โค้ดในโปรแกรมของผู้ใช้ และถูกเรียกทุกครั้งที่ Node.js คลายข้อมูล Brotli ทั้งเมื่อเรียกผ่านโมดูล node:zlib โดยตรง และเมื่อโค้ดเรียก fetch() แล้วได้คำตอบที่บีบอัดแบบ Brotli ซึ่ง Node.js คลายให้อัตโนมัติ แอปจึงเสี่ยงเมื่อคลายข้อมูล Brotli ที่ผู้โจมตีควบคุมได้ เช่น request body หรือคำตอบที่ดึงมาจากเซิร์ฟเวอร์อื่น แพตช์เป็นการแก้จากต้นน้ำของโครงการ Brotli ของ Google ที่ทำให้ decoder ตรวจพบอินพุตผิดรูปแบบและหยุดก่อนเขียนเลยบัฟเฟอร์ การแก้เดียวกันออกใน Brotli 1.2.1, 1.1.1 และ 1.0.10 เมื่อ 21 ตุลาคม ซอฟต์แวร์อื่นที่ฝัง Brotli จึงอาจต้องอัปเดตเช่นกัน โค้ดแก้ถูกเพิ่มในซอร์สของ Brotli ตั้งแต่กุมภาพันธ์ 2569 แต่เพิ่งออกเป็นรุ่นความปลอดภัยในเดือนตุลาคม
คำว่า “รันโค้ดจากระยะไกล” เป็นคำอธิบายของโครงการเอง และช่องโหว่ถูกจัดระดับสูง ไม่ใช่วิกฤต สิ่งที่พิสูจน์ได้จริงยังแคบกว่านั้น PoC สาธารณะที่เผยแพร่เมื่อ 22 ตุลาคมรันโค้ดได้เฉพาะกับ build ทดสอบที่จงใจลดการป้องกันลง บน Node.js รุ่นมาตรฐาน ผู้เขียน PoC รายงานว่าทำได้เพียงทำให้โปรเซสล่มและอ่านหน่วยความจำได้บางส่วน ยังไม่สามารถโจมตีจนรันโค้ดบน build ปกติได้ รุ่นที่แพตช์แล้วปฏิเสธอินพุตที่ PoC ใช้ และยังไม่มีรายงานการโจมตีจริง ณ 22 ตุลาคม ข้อสังเกตอีกจุดคือ Node.js จัด CVE-2026-105483 เป็นระดับสูง แต่ commit ที่แก้เรียกบั๊กนี้ว่าความรุนแรงต่ำและโจมตียาก
อัปเดตชุดเดียวกันยังทำให้ Node.js เลิกเชื่อถือกุญแจ CA ตัวกลาง 8 ดอกของ eMudhra ที่ถูกรายงานว่าหลุด (2026/10/190
, 2026/10/236
) Node.js ใช้รายการรากของ Mozilla แต่ไม่ตรวจการเพิกถอนเป็นค่าเริ่มต้น ก่อนอัปเดตสายใบรับรองที่ใช้กุญแจเหล่านี้จึงยังผ่านการตรวจ รุ่นใหม่เพิ่มการบล็อกกุญแจทั้ง 8 ไว้ในตัวและถอดราก emSign 3 ตัวออกจากชุดรากที่แนบมา แต่การเชื่อมต่อที่ resume จาก session ที่เริ่มก่อนอัปเดตจะไม่ถูกตรวจซ้ำจนกว่า session หมดอายุ และสายรุ่นที่หมดอายุไม่ได้รับการบล็อกนี้ ส่วน undici ไคลเอนต์ HTTP ที่อยู่เบื้องหลัง fetch() ถูกอัปเดตเป็นรุ่นที่แก้ advisory ระดับกลาง 3 รายการ คือการตรวจ Subresource Integrity และปัญหาหน่วยความจำหมด 2 รายการ หนึ่งในนั้นอยู่ใน WebSocket client ที่มากับ Node.js
ประกาศของ Node.js ไม่มีวิธีแก้ชั่วคราวสำหรับช่องโหว่ Brotli แอปที่อัปเดตทันทีไม่ได้จึงไม่มีทางเลือกสำรองภายใน Node.js เอง บริษัท Vercel ซึ่งรัน Node.js ให้ลูกค้า ระบุว่าเพิ่มกฎไฟร์วอลล์บล็อกการโจมตีในคำขอขาเข้าตั้งแต่ 21 ตุลาคม แต่กฎนี้ไม่ครอบคลุมคำตอบ Brotli ที่แอปดึงจากเซิร์ฟเวอร์อื่น และไม่ได้ใช้แทนการอัปเดต
รายละเอียดช่องโหว่
CVE-2026-111497 (High) — Brotli decoder RCE: decoder เขียนข้อมูลออกนอกพื้นที่หน่วยความจำที่กำหนด ซึ่งอาจนำไปสู่การรันโค้ดจากระยะไกล กระทบทั้ง 3 สายรุ่น แต่ประกาศไม่ได้อธิบายเงื่อนไขที่ต้องมีเพื่อโจมตีได้จริง แอปที่คลายการบีบอัดเนื้อหา Brotli จากผู้ใช้หรือเซิร์ฟเวอร์ภายนอกจึงควรได้รับความสำคัญก่อน
CVE-2026-105483 และ CVE-2026-106069 (High) — ข้ามการตรวจชื่อโฮสต์ใน TLS: รายการแรกเกิดเมื่อ IP address เขียนด้วยตัวเลขแบบเต็มความกว้าง (full-width digits) กระทบ 26.x และ 24.x รายการที่สองเกี่ยวกับชื่อโฮสต์ที่ถูกตีความหลวม ๆ ว่าเป็น IP address กระทบทั้ง 3 สายรุ่น ทั้งคู่ทำให้การตรวจว่าใบรับรองตรงกับปลายทางที่ตั้งใจเชื่อมต่อผิดพลาด ช่องโหว่กลุ่มนี้ตามหลังแพตช์ข้ามการยืนยันตัวตน TLS รอบก่อนของ Node.js ที่มีต้นเหตุจากความต่างของการจัดการชื่อโฮสต์เช่นกัน
CVE-2026-105482 (High) — DNS ตัดชื่อ: dns.resolve ตัดชื่อที่มีอักขระ NUL ทำให้ชื่อที่ถูกค้นหาจริงต่างจากชื่อที่แอปตรวจไว้ก่อน กระทบแอปที่ตรวจหรือกรองชื่อก่อนค้นหา DNS
| CVE | ระดับ | ช่องโหว่ | สายรุ่นที่กระทบ |
|---|---|---|---|
| CVE-2026-111497 | สูง | Brotli decoder เขียนเกินขอบเขต (RCE) | 26.x, 24.x, 22.x |
| CVE-2026-105483 | สูง | ข้ามการตรวจชื่อโฮสต์ TLS (ตัวเลข full-width) | 26.x, 24.x |
| CVE-2026-106069 | สูง | ข้ามการตรวจชื่อโฮสต์ TLS (ชื่อที่แปลงเป็น IP) | 26.x, 24.x, 22.x |
| CVE-2026-105482 | สูง | dns.resolve ตัดชื่อที่มี NUL | 26.x, 24.x, 22.x |
| CVE-2026-105481 | กลาง | socket keep-alive รับคำตอบที่เขียนก่อนส่งคำขอ | 26.x, 24.x, 22.x |
| CVE-2026-106072 | กลาง | ชื่อ DNS ในใบรับรองใช้ยืนยันปลายทาง IP ได้ (IPv4 ไม่มาตรฐาน) | 26.x, 24.x, 22.x |
| CVE-2026-106074 | กลาง | ค่าสุ่มซ้ำใน startup snapshot / single executable application | 26.x, 24.x, 22.x |
| CVE-2026-106070 | ต่ำ | ตรวจ ZIP ล้มเหลวแล้วคืนข้อมูลที่ผู้โจมตีควบคุม | 26.x |
| CVE-2026-106071 | ต่ำ | Permission Model ให้สิทธิ์ระบบไฟล์เกินผ่าน wildcard | 26.x |
| CVE-2026-106073 | ต่ำ | ข้าม Permission Model ผ่าน fs.realpathSync | 26.x, 24.x, 22.x |
CVE-2026-106074 น่าสนใจในเชิงการออกแบบ ค่าสุ่มที่ถูกแคชไว้ใน startup snapshot และ single executable application ทำให้ทุกโปรเซสที่สร้างจากไฟล์เดียวกันได้ค่าจาก crypto.randomUUID() และ crypto.randomInt() ซ้ำกัน ซึ่งกระทบระบบที่ใช้ค่าเหล่านี้เป็นตัวระบุหรือโทเคน
ผลกระทบ
Node.js เป็นรันไทม์ที่อยู่เบื้องหลังเว็บแอป API และเครื่องมือฝั่งนักพัฒนาจำนวนมาก ช่องโหว่ Brotli กระทบแอปที่รับเนื้อหาบีบอัดจากภายนอก ส่วนช่องโหว่ TLS กระทบการเชื่อมต่อขาออก เช่น การเรียก API ภายนอกหรือบริการภายในที่ตรวจใบรับรองด้วยชื่อโฮสต์ ซึ่งถ้าถูกข้ามได้ก็เปิดทางให้ดักกลางทาง (man-in-the-middle) แอปที่ไม่ได้อัปเดตเพราะรันอยู่ในอิมเมจคอนเทนเนอร์เก่าหรือ single executable application จะยังมีช่องโหว่อยู่จนกว่าจะ rebuild ส่วนสายรุ่นที่หมดอายุแล้วได้รับผลกระทบเสมอและไม่ได้รับแพตช์
คำแนะนำ
- อัปเดตเป็น Node.js 26.12.1, 24.22.1 หรือ 22.23.4 ตามสายรุ่นที่ใช้ แล้ว rebuild อิมเมจคอนเทนเนอร์และ single executable application และรีสตาร์ตบริการ
- จัดลำดับแอปที่คลายการบีบอัด Brotli จากแหล่งภายนอก (เช่น proxy, เว็บ crawler, บริการรับอัปโหลด) และแอปที่ทำ HTTPS ขาออกไปยังปลายทางที่กำหนดด้วย IP เป็นกลุ่มแรก
- ทดสอบหลังอัปเดตให้ครอบคลุมการเชื่อมต่อ HTTPS ขาออก การจัดการ DNS เนื้อหาบีบอัด และงานที่ใช้ Permission Model
- ถ้าใช้ startup snapshot หรือ single executable application ให้สร้างใหม่ด้วยรุ่นที่แก้แล้ว และพิจารณาออกโทเคนหรือตัวระบุที่สร้างจากรุ่นเดิมใหม่
- ย้ายออกจากสายรุ่นที่หมดอายุ (20.x และเก่ากว่า) เพราะไม่ได้รับทั้งแพตช์ Brotli และการบล็อกกุญแจ eMudhra
- ตรวจซอฟต์แวร์อื่นที่ฝังไลบรารี Brotli และอัปเดตเป็น 1.2.1, 1.1.1 หรือ 1.0.10
- หลังอัปเดต รีสตาร์ตโปรเซสเพื่อตัด TLS session ที่ resume จากก่อนอัปเดต ซึ่งยังไม่ถูกตรวจกับรายการบล็อกใหม่
แหล่งอ้างอิง
- Node.js Releases Security Updates to Fix High-Severity TLS, DNS, and Brotli Vulnerabilities — Cybersecurity News
- Node.js Multiple Vulnerabilities — HKCERT
- Node.js Brotli Decoder Bug Could Allow Remote Code Execution in All Supported Versions — The Hacker News
- Brotli v1.2.1 CHANGELOG — GitHub
- October 2026 Security Releases — Node.js
