# 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

- ประเภท: ข่าว · หมวด: Software
- เผยแพร่: 2026-10-22T12:01:00.000Z · อัปเดต: 2026-10-22T12:01:00.000Z
- โดย: กองบรรณาธิการ THAI DATA, THAI DATA IT BUSINESS ENTERPRISE
- ที่มา: https://thaidata.co.th/software/node-js-cve-2026-111497-brotli-security-release/

## สรุปประเด็นสำคัญ

- โครงการ 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 ตามที่[ประกาศล่วงหน้าไว้](/software/node-js-26-lts-security-release-october-2026/) รายการร้ายแรงที่สุดคือ CVE-2026-111497 การเขียนข้อมูลเกินขอบเขตในตัวถอดรหัส Brotli ที่ Node.js ระบุว่าเปิดทางรันโค้ดจากระยะไกล และกระทบทุกสายที่ยังได้รับการดูแล

แพตช์รอบนี้แก้ช่องโหว่รวม 10 รายการ ระดับ High 4 รายการ Medium 3 รายการ และ Low 3 รายการ ทั้ง 10 รายการยังไม่มีบันทึกเผยแพร่บน cve.org ณ วันที่ 22 ตุลาคม จึงยังไม่มีคะแนน CVSS ให้อ้าง Node.js ใช้การจัดระดับของโครงการเอง และย้ำว่ารุ่นที่หมดอายุแล้วได้รับผลกระทบเสมอทุกครั้งที่มีแพตช์ความปลอดภัย

![รายการช่องโหว่ในประกาศ Node.js วันที่ 21 ตุลาคม 2026 รวม CVE-2026-111497 ช่องโหว่ Brotli ระดับ high ที่กระทบสาย 26.x, 24.x และ 22.x](https://thaidata-co-th.s3.ap-southeast-1.amazonaws.com/thaidata.co.th/images/articles/node-js-cve-2026-111497-brotli-security-release/node-js-cve-2026-111497-advisory-list.webp?v=7fecefdf) _(ภาพ: 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](https://www.cisa.gov/known-exploited-vulnerabilities-catalog) ฉบับวันที่ 21 ตุลาคม 2026 ยังไม่มีช่องโหว่นี้

![ประกาศของ Vercel เรื่อง CVE-2026-111497 ระบุว่ากฎ WAF บล็อกรูปแบบการโจมตีที่รู้จักแล้ว แต่ไม่ได้แทนการอัปเดต Node.js](https://thaidata-co-th.s3.ap-southeast-1.amazonaws.com/thaidata.co.th/images/articles/node-js-cve-2026-111497-brotli-security-release/vercel-node-js-cve-2026-111497-bulletin.webp?v=56947c3f) _(ภาพ: Vercel (ภาพหน้าจอ))_

## ช่องโหว่ทั้ง 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)

![จำนวนช่องโหว่ Node.js ที่แพตช์ 21 ตุลาคม 2026 แยกตามสายและระดับความร้ายแรง](https://thaidata-co-th.s3.ap-southeast-1.amazonaws.com/thaidata.co.th/images/articles/node-js-cve-2026-111497-brotli-security-release/node-js-october-2026-cves-by-line.webp?v=ae86d0e3) _(ภาพ: THAI DATA (ข้อมูล: Node.js))_

## ช่องโหว่ที่ควรดูต่อจาก 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 หลุด](/security/emudhra-intermediate-ca-key-compromise-root-distrust/)

![Release notes ของ Node.js 24.22.1 (LTS) วันที่ 21 ตุลาคม 2026 แสดงรายการ CVE ที่แก้ รวม CVE-2026-111497 และการอัปเดต OpenSSL 3.5.9](https://thaidata-co-th.s3.ap-southeast-1.amazonaws.com/thaidata.co.th/images/articles/node-js-cve-2026-111497-brotli-security-release/node-js-24-22-1-release-notes.webp?v=bc7e395f) _(ภาพ: Node.js (ภาพหน้าจอ))_

## ทำไมเรื่องนี้สำคัญ

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](/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](https://nodejs.org/en/blog/vulnerability/october-2026-security-releases) — Node.js
- [Node.js 24.22.1 (LTS)](https://nodejs.org/en/blog/release/v24.22.1) — Node.js
- [Node.js 22.23.4 (LTS)](https://nodejs.org/en/blog/release/v22.23.4) — Node.js
- [Node.js 26.12.1 (Current)](https://nodejs.org/en/blog/release/v26.12.1) — Node.js
- [Node.js security advisory: Brotli decoder RCE (CVE-2026-111497)](https://vercel.com/kb/bulletin/node-js-security-advisory) — Vercel
- [deps: brotli: cherry-pick 0ed4268a4401abcb44720963](https://github.com/nodejs/node/commit/a6040b50d958e489c501e9c16c60c0ce2c55ec70) — GitHub (nodejs/node)
