Node.js แพตช์ CVE-2026-111497 ช่องโหว่ Brotli รันโค้ดได้ และอีก 9 ช่องโหว่ในสาย 22–26
CVE-2026-111497 ช่องโหว่ระดับ High ในตัวถอดรหัส Brotli ของ Node.js ทำให้รันโค้ดได้ แพตช์แล้ว 21 ต.ค. 2026 ใน 22.23.4, 24.22.1 และ 26.12.1 พร้อมอีก 9 CVE
โดย กองบรรณาธิการ THAI DATA อ่าน 5 นาที

สรุปประเด็นสำคัญ
- โครงการ Node.js ออก 22.23.4, 24.22.1 และ 26.12.1 เมื่อ 21 ตุลาคม 2026 แก้ช่องโหว่ 10 รายการ ระดับ High 4 รายการ Medium 3 รายการ และ Low 3 รายการ
- CVE-2026-111497 เป็นการเขียนข้อมูลเกินขอบเขตในตัวถอดรหัส Brotli ที่ Node.js ระบุว่าเปิดทางรันโค้ดจากระยะไกล กระทบทั้งสาย 22.x, 24.x และ 26.x และ Node.js 20 ที่หมดอายุแล้วจะไม่ได้รับการแก้
- ประกาศของ Vercel วันที่ 21 ต.ค. ระบุว่าแอปจะเสี่ยงเมื่อโค้ดหรือไลบรารีถอดรหัสข้อมูล Brotli ที่ผู้โจมตีควบคุม ทั้งใน request body และ response ที่ดึงมา และนักวิจัยสาธิตการรั่วของหน่วยความจำและการรันคำสั่งได้แล้ว
- แพตช์ชุดนี้ยังปิดช่องโหว่ข้ามการตรวจชื่อโฮสต์ในใบรับรอง TLS 2 รายการ อัปเดต OpenSSL, c-ares, Undici และชุดใบรับรองต้นทางจากกรณี eMudhra Intermediate CA
โครงการ Node.js ออกรุ่นแก้ช่องโหว่ 22.23.4, 24.22.1 และ 26.12.1 เมื่อวันที่ 21 ตุลาคม 2026 ตามที่ประกาศล่วงหน้าไว้ รายการร้ายแรงที่สุดคือ CVE-2026-111497 การเขียนข้อมูลเกินขอบเขตในตัวถอดรหัส Brotli ที่ Node.js ระบุว่าเปิดทางรันโค้ดจากระยะไกล และกระทบทุกสายที่ยังได้รับการดูแล
แพตช์รอบนี้แก้ช่องโหว่รวม 10 รายการ ระดับ High 4 รายการ Medium 3 รายการ และ Low 3 รายการ ทั้ง 10 รายการยังไม่มีบันทึกเผยแพร่บน cve.org ณ วันที่ 22 ตุลาคม จึงยังไม่มีคะแนน CVSS ให้อ้าง Node.js ใช้การจัดระดับของโครงการเอง และย้ำว่ารุ่นที่หมดอายุแล้วได้รับผลกระทบเสมอทุกครั้งที่มีแพตช์ความปลอดภัย

CVE-2026-111497 คืออะไรและใครเสี่ยง
ประกาศของ Node.js ให้ข้อมูลสั้น ๆ ว่าช่องโหว่ทำให้ตัวถอดรหัส Brotli ของ Node.js เขียนข้อมูลเกินขอบเขตจนนำไปสู่การรันโค้ดจากระยะไกลได้ ผู้รายงานคือ Matteo Collina (mcollina) และผู้แก้คือ Antoine du Hamel (aduh95) คอมมิตที่แก้ใน repository ของ Node.js ระบุว่านำการแก้จากโครงการ Brotli ของ Google มาใส่ ซึ่งเป็นคอมมิตของ Evgenii Kliuchnikov ชื่อ "Detect and report invalid stream earlier" ลงวันที่ 27 กุมภาพันธ์ 2026 และโมดูล zlib ของ Node.js ยังเพิ่มรหัสข้อผิดพลาด BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH ให้รายงานได้ด้วย
Vercel ซึ่งมี runtime ของ Node.js ให้ลูกค้าใช้บนแพลตฟอร์ม ออกประกาศด้านความปลอดภัยวันเดียวกันที่อธิบายเงื่อนไขชัดกว่า
- Node.js ไม่ได้ถอดรหัส Brotli เอง แอปจะเสี่ยงเมื่อโค้ดของแอปหรือไลบรารีที่ใช้ถอดรหัสข้อมูล Brotli ที่ผู้โจมตีควบคุม
- ช่องทางมีทั้ง request body ที่ส่งเข้ามา และ response ที่แอปดึง จากเซิร์ฟเวอร์อื่น
- นักวิจัยสาธิตได้ทั้งการรั่วของหน่วยความจำและการรันคำสั่งใน process ของ Node.js บนสาย 22.x, 24.x และ 26.x ที่ยังไม่แพตช์ โดยคำสั่งรันด้วยสิทธิ์ของ process นั้น
- Next.js ที่ติดตั้งเองไม่ได้บล็อก response แบบ Brotli ในฟีเจอร์ image optimization จึงต้องอัปเดต Node.js เช่นกัน
ประกาศของ Node.js และ Vercel ไม่ได้ระบุว่า CVE-2026-111497 ถูกโจมตีจริงแล้ว และแค็ตตาล็อก KEV ของ CISA ฉบับวันที่ 21 ตุลาคม 2026 ยังไม่มีช่องโหว่นี้

ช่องโหว่ทั้ง 10 รายการและสายที่ได้รับผลกระทบ
| CVE | เรื่อง | ระดับ | สายที่กระทบ |
|---|---|---|---|
| CVE-2026-111497 | ตัวถอดรหัส Brotli เขียนข้อมูลเกินขอบเขต รันโค้ดได้ | High | 26.x, 24.x, 22.x |
| CVE-2026-105482 | dns.resolve ตัดชื่อที่มีอักขระ NUL |
High | 26.x, 24.x, 22.x |
| CVE-2026-105483 | ข้ามการตรวจชื่อโฮสต์ในใบรับรอง TLS เมื่อเขียน IP ด้วยตัวเลขแบบเต็มความกว้าง | High | 26.x, 24.x |
| CVE-2026-106069 | ข้ามการตรวจชื่อโฮสต์ในใบรับรอง TLS เมื่อชื่อโฮสต์ถูกตีความเป็น IP แบบหลวม ๆ | High | 26.x, 24.x, 22.x |
| CVE-2026-105481 | socket แบบ keep-alive ประมวลผล response ที่ถูกเขียนก่อนส่ง request | Medium | 26.x, 24.x, 22.x |
| CVE-2026-106072 | ตรวจใบรับรองผิดกับ IPv4 รูปแบบไม่มาตรฐาน ทำให้ชื่อ DNS ใน SAN ยืนยันปลายทางที่เป็น IP ได้ | Medium | 26.x, 24.x, 22.x |
| CVE-2026-106074 | แคชค่าสุ่มของ crypto.randomUUID() และ randomInt() ติดไปใน startup snapshot และ SEA ทุก process จึงได้ค่าซ้ำกัน |
Medium | 26.x, 24.x, 22.x |
| CVE-2026-106070 | ZipFile คืนไบต์ที่ผู้โจมตีกำหนดหลังตรวจ header ไม่ผ่าน | Low | 26.x |
| CVE-2026-106071 | Permission Model ให้สิทธิ์ไฟล์เกินผ่าน wildcard | Low | 26.x |
| CVE-2026-106073 | เลี่ยง Permission Model ผ่าน fs.realpathSync |
Low | 26.x, 24.x, 22.x |
เมื่อนับตามสาย สาย 26.x ได้รับผลกระทบครบ 10 รายการ (High 4, Medium 3, Low 3) สาย 24.x มี 8 รายการ (High 4, Medium 3, Low 1) และสาย 22.x มี 7 รายการ (High 3, Medium 3, Low 1)

ช่องโหว่ที่ควรดูต่อจาก CVE-2026-111497
ช่องโหว่ TLS ระดับ High สองรายการควรได้รับความสนใจรองจาก Brotli เพราะเป็นการข้ามการตรวจว่าใบรับรองตรงกับชื่อโฮสต์ที่เชื่อมต่อหรือไม่ ซึ่งเป็นหัวใจของการป้องกันการดักกลางทาง ส่วน CVE-2026-106074 กระทบแอปที่สร้าง startup snapshot หรือแพ็กเป็น Single Executable Application (SEA) โดยตรง เพราะค่า UUID และตัวเลขสุ่มอาจซ้ำกันทุก process
รุ่นที่ต้องอัปเดตและส่วนประกอบที่อัปเดตพร้อมกัน
| สาย | รุ่นที่แก้แล้ว | ส่วนประกอบที่อัปเดตในรุ่นนี้ |
|---|---|---|
| 26.x (Current) | 26.12.1 | c-ares 1.34.9, Undici 8.12.2, ใบรับรองต้นทาง NSS 3.131.1 |
| 24.x (LTS 'Krypton') | 24.22.1 | c-ares 1.34.9, OpenSSL 3.5.9, Undici 7.30.1, NSS 3.131.1 |
| 22.x (LTS 'Jod') | 22.23.4 | c-ares 1.34.9, OpenSSL 3.5.9, SQLite 3.53.4, Undici 6.29.1, NSS 3.131.1 |
ประกาศของ Node.js ระบุด้วยว่าทั้งสามสายอัปเดตชุดใบรับรองต้นทางจากกรณีกุญแจของ eMudhra Intermediate CA ถูกเปิดเผย และ release notes มีรายการปฏิเสธ chain ของใบรับรองที่มี public key ที่ถูกบล็อก อ่านเบื้องหลังได้ในข่าวกุญแจ eMudhra Intermediate CA หลุด

ทำไมเรื่องนี้สำคัญ
Brotli เป็นรูปแบบบีบอัดที่เว็บใช้กันกว้างขวาง แอป Node.js ที่รับข้อมูลบีบอัดจากผู้ใช้ หรือเรียก API ภายนอกแล้วคลายการบีบอัดคำตอบ จึงอาจเข้าเงื่อนไขโดยที่ทีมพัฒนาไม่รู้ตัว เพราะการถอดรหัสมักเกิดในไลบรารีชั้นล่าง Vercel ออกกฎ WAF บล็อกช่องทางขาเข้าให้ทุกโปรเจกต์ตั้งแต่วันที่ออกแพตช์ แต่ระบุชัดว่ากฎนี้ไม่ครอบคลุม response ที่ฟังก์ชันของลูกค้าดึงจากเซิร์ฟเวอร์อื่น และไม่ได้แทนการอัปเดต
อีกประเด็นคือ Node.js 20 หมดอายุแล้วและจะไม่ได้รับการแก้ CVE-2026-111497 ระบบที่ยังค้างอยู่บนสายนั้นมีทางเดียวคือย้ายไป 22.x หรือ 24.x
สิ่งที่องค์กรไทยควรทำ
- อัปเดตเป็น 22.23.4, 24.22.1 หรือ 26.12.1 ทุกที่ที่รัน Node.js ไม่ใช่แค่เซิร์ฟเวอร์ production แต่รวมถึง container image ที่ build เอง, runner ของ CI/CD และเครื่องของนักพัฒนา ตามรายการที่ Vercel แนะนำ
- ไล่หาระบบที่ยังใช้ Node.js 20 หรือเก่ากว่า ทั้งในแอป ฟังก์ชัน serverless และอิมเมจฐานของ Docker แล้ววางแผนย้ายไป 22.x หรือ 24.x ทันที
- เรียงลำดับตามความเสี่ยงของ CVE-2026-111497 เริ่มจากบริการที่รับข้อมูลบีบอัดจากภายนอกหรือดึงข้อมูลจาก API ภายนอกที่ควบคุมไม่ได้ จากนั้นตามด้วยบริการที่ใช้ TLS เชื่อมต่อด้วย IP โดยตรง
- rebuild อิมเมจจากอิมเมจฐานที่แพตช์แล้ว การอัปเดตแพ็กเกจในแอปอย่างเดียวไม่พอ เพราะช่องโหว่อยู่ในตัว runtime และตรวจผลด้วยคำสั่ง
node -vในอิมเมจที่ deploy จริง ติดตามข่าวซอฟต์แวร์และ Open Source อื่น ๆ ได้ที่หมวด Software
คำถามที่พบบ่อย
CVE-2026-111497 คืออะไร?
CVE-2026-111497 คือช่องโหว่ระดับ High ในตัวถอดรหัส Brotli ที่มากับ Node.js ข้อมูล Brotli ที่สร้างมาผิดรูปแบบทำให้เกิดการเขียนข้อมูลเกินขอบเขตหน่วยความจำ ซึ่ง Node.js ระบุว่าเปิดทางรันโค้ดจากระยะไกล โครงการแพตช์เมื่อ 21 ตุลาคม 2026
Node.js รุ่นใดแก้ CVE-2026-111497 แล้ว?
รุ่นที่แก้ CVE-2026-111497 แล้วคือ Node.js 22.23.4, 24.22.1 และ 26.12.1 ซึ่งออกวันที่ 21 ตุลาคม 2026 ทุกระบบที่ใช้สาย 22.x, 24.x หรือ 26.x ควรอัปเดตเป็นรุ่นเหล่านี้ ส่วน Node.js 20 หมดอายุแล้วและจะไม่ได้รับการแก้ ต้องย้ายไปสายที่ยังดูแลอยู่
แอปแบบไหนเสี่ยงจาก CVE-2026-111497?
Vercel อธิบายว่า Node.js ไม่ได้ถอดรหัส Brotli เอง แอปจะเสี่ยงจาก CVE-2026-111497 เมื่อโค้ดของแอปหรือไลบรารีที่ใช้ถอดรหัสข้อมูล Brotli ที่ผู้โจมตีควบคุมได้ ทั้งข้อมูลใน request body ที่รับเข้ามา และ response ที่แอปดึงจากเซิร์ฟเวอร์อื่น
WAF ป้องกัน CVE-2026-111497 แทนการอัปเดตได้หรือไม่?
ไม่ได้ทั้งหมด Vercel ออกกฎ WAF บล็อกรูปแบบการโจมตี CVE-2026-111497 ให้ทุกโปรเจกต์บนแพลตฟอร์ม แต่ระบุว่า WAF ครอบคลุมเฉพาะทราฟฟิกที่ผ่านเครือข่ายของ Vercel ไม่ครอบคลุม response ที่แอปดึงจากเซิร์ฟเวอร์อื่น จึงยังต้องอัปเดต Node.js
แหล่งอ้างอิง
- Wednesday, October 21, 2026 Security Releases — Node.js
- Node.js 24.22.1 (LTS) — Node.js
- Node.js 22.23.4 (LTS) — Node.js
- Node.js 26.12.1 (Current) — Node.js
- Node.js security advisory: Brotli decoder RCE (CVE-2026-111497) — Vercel
- deps: brotli: cherry-pick 0ed4268a4401abcb44720963 — GitHub (nodejs/node)
บุคคล องค์กร และสถานที่ในข่าวนี้
เลือกชื่อเพื่ออ่านข่าวทั้งหมดที่กล่าวถึง ตัวเลขคือจำนวนข่าว
พบข้อมูลคลาดเคลื่อน? แจ้งกองบรรณาธิการ