01เกิดอะไรขึ้น
Node.js คือ runtime ที่ใช้รัน JavaScript ฝั่งเซิร์ฟเวอร์ อยู่เบื้องหลังเว็บที่สร้างด้วย Next.js, Nuxt, NestJS, Express รวมถึง backend ของแอปมือถือและเครื่องมืออย่าง n8n ช่องโหว่ชุดนี้อยู่ใน ตัว Node.js เอง จึงกระทบทุกแอปที่รันบนรุ่นที่ยังไม่แก้ ไม่ว่าจะใช้ framework ใด
ทีม Node.js ออกแพตช์พร้อมกันทั้ง 3 สายที่ยังได้รับการดูแล และอัปเดต dependency ที่ฝังอยู่ ได้แก่ OpenSSL (สาย 24 และ 22), Undici, c-ares, SQLite (สาย 22) และถอดใบรับรอง intermediate CA ของ eMudhra ที่ถูก compromise ออกจากรายการที่เชื่อถือ
02ช่องโหว่ทั้ง 10 รายการ
| CVE | ระดับ | รายละเอียด | สายที่กระทบ |
|---|---|---|---|
| CVE-2026-111497 | High | Brotli decoder เขียนข้อมูลเลยขอบหน่วยความจำ (out-of-bounds write) อาจนำไปสู่ RCE | 26.x, 24.x, 22.x |
| CVE-2026-106069 | High | ข้ามการตรวจ hostname ของ TLS ได้ เมื่อ host ถูกตีความหลวม ๆ ว่าเป็น IP address | 26.x, 24.x, 22.x |
| CVE-2026-105483 | High | ข้ามการตรวจ hostname ของ TLS ได้ เมื่อเขียน IP ด้วยตัวเลขแบบ fullwidth | 26.x, 24.x |
| CVE-2026-105482 | High | dns.resolve ตัดชื่อที่มีอักขระ NUL ทิ้ง | 26.x, 24.x, 22.x |
| CVE-2026-105481 | Medium | socket แบบ keep-alive ประมวลผล response ที่ถูกเขียนมาก่อนส่ง request | 26.x, 24.x, 22.x |
| CVE-2026-106072 | Medium | hostname IPv4 รูปแบบไม่มาตรฐาน ทำให้ DNS SAN ใช้ยืนยัน endpoint ที่เป็น IP ได้ | 26.x, 24.x, 22.x |
| CVE-2026-106074 | Medium | crypto.randomUUID() และ randomInt() ให้ค่าซ้ำกันในแอปที่ใช้ startup snapshot หรือ SEA | 26.x, 24.x, 22.x |
| CVE-2026-106070 | Low | ZipFile คืนไบต์ส่วนหัวที่ผู้โจมตีควบคุมได้ หลังตรวจ header ของ ZIP ไม่ผ่าน | 26.x |
| CVE-2026-106071 | Low | Permission Model ให้สิทธิ์ไฟล์เกินจริงผ่านการค้นหาแบบ wildcard | 26.x |
| CVE-2026-106073 | Low | ข้าม Permission Model ได้ด้วย fs.realpathSync | 26.x, 24.x, 22.x |
ช่องโหว่ TLS ทั้ง 2 ตัว หมายความว่าอะไร
CVE-2026-106069 และ CVE-2026-105483 ทำให้การตรวจว่าใบรับรองของเซิร์ฟเวอร์ตรงกับ hostname ถูกหลอกได้ เมื่อ host ถูกตีความหลวม ๆ ว่าเป็น IP หรือเขียน IP ด้วยตัวเลขแบบ fullwidth ผลคือแอปที่เป็นฝั่ง client อาจเชื่อมต่อกับเซิร์ฟเวอร์ปลอมโดยคิดว่าเป็นของจริง แอปที่เรียก API ภายนอกผ่าน HTTPS จึงควรอัปเดตด้วย แม้ไม่ได้ใช้ Brotli
crypto.randomUUID() ให้ค่าซ้ำ
CVE-2026-106074 กระทบเฉพาะแอปที่สร้างด้วย startup snapshot หรือ Single Executable Application (SEA) ค่า UUID หรือเลขสุ่มอาจซ้ำกันระหว่างโปรเซส ถ้าใช้ค่าเหล่านี้เป็น token หรือ ID ที่ต้องเดาไม่ได้ ควรสร้างค่าใหม่หลังอัปเดต
03Brotli RCE: ใครเสี่ยงที่สุด
Brotli เป็นวิธีบีบอัดข้อมูลที่ Google พัฒนา บีบได้เล็กกว่า gzip เว็บใช้กันแพร่หลายผ่าน header Content-Encoding: br ใน Node.js ตัวคลายข้อมูล (decoder) อยู่ในโมดูล zlib เช่น zlib.brotliDecompress() และ zlib.createBrotliDecompress()
CVE-2026-111497 ทำให้ decoder เขียนข้อมูลเลยขอบหน่วยความจำขณะคลายข้อมูล แอปที่ คลายข้อมูล Brotli ที่มาจากภายนอก จึงเสี่ยงที่สุด เช่น
- แอปที่เรียก
fetch()หรือ HTTP client ไปยังเซิร์ฟเวอร์ที่ควบคุมไม่ได้ แล้วคลาย response แบบbrอัตโนมัติ เช่น ระบบดึงข้อมูลจากเว็บอื่น webhook หรือ crawler - เซิร์ฟเวอร์ที่รับ request body ที่บีบอัดมา แล้วคลายเองผ่าน middleware
- แอปที่รับไฟล์บีบอัดจากผู้ใช้แล้วคลายด้วย
zlib
ประกาศทางการยังไม่เปิดเผยเงื่อนไขการโจมตีโดยละเอียด และไม่มีมาตรการชั่วคราวที่ทางการแนะนำ การอัปเดต Node.js จึงเป็นทางแก้หลัก
04รุ่นที่แก้แล้ว และควรใช้รุ่นไหน
| สาย | รุ่นที่แก้แล้ว | ได้รับการดูแลถึง | คำแนะนำ |
|---|---|---|---|
| Node.js 26 | 26.12.1 | 30 เม.ย. 2572 | จะเป็น LTS ตั้งแต่ 28 ต.ค. 2569 เหมาะกับโปรเจกต์ใหม่ |
| Node.js 24 | 24.22.1 | 30 เม.ย. 2571 | LTS ที่ใช้งานจริงได้ยาว แนะนำสำหรับระบบส่วนใหญ่ |
| Node.js 22 | 22.23.4 | 30 เม.ย. 2570 | อัปเดตได้เลย แต่ควรวางแผนย้ายไป 24 ภายในปีหน้า |
| Node.js 20 | ไม่มี | หมดแล้ว 30 เม.ย. 2569 | ได้รับผลกระทบ ต้องย้ายไป 22 หรือ 24 |
| Node.js 18 และเก่ากว่า | ไม่มี | หมดอายุแล้ว | ต้องย้ายรุ่น และตรวจ dependency ที่เลิกรองรับ |
วันหมดอายุของแต่ละสายมาจากตาราง release schedule ทางการของ Node.js
05วิธีเช็ครุ่น Node.js
บนเซิร์ฟเวอร์หรือเครื่องที่รันแอป
node -v
ถ้าใช้ nvm หรือมี Node หลายรุ่นในเครื่อง ให้เช็คจากผู้ใช้หรือ service ที่รันแอปจริง เช่นใน PM2 ใช้ pm2 describe <ชื่อแอป> ดูบรรทัด node.js version
ทุก container บนเครื่อง Docker
for c in $(docker ps -q); do
printf '%-40s %s\n' "$(docker inspect -f '{{.Name}}' "$c")" "$(docker exec "$c" node -v 2>/dev/null || echo '-')"
donecontainer ที่ขึ้น - คือไม่มี Node อยู่ข้างใน ส่วนที่แสดงรุ่นต่ำกว่า 22.23.4, 24.22.1 หรือ 26.12.1 ต้อง build ใหม่
06วิธีอัปเดต
ติดตั้งผ่าน nvm
nvm install 24.22.1 nvm alias default 24.22.1 node -v
ติดตั้งผ่าน apt (NodeSource หรือ repository ของ distro)
sudo apt update sudo apt install --only-upgrade nodejs node -v
repository ของ distro บางตัวอาจยังไม่มีรุ่นใหม่ ให้เช็คเลขรุ่นหลังอัปเดตทุกครั้ง แล้วรีสตาร์ตแอป เช่น pm2 restart all หรือ sudo systemctl restart <ชื่อ service>
Docker
# ระบุรุ่นที่แก้แล้วให้ชัด แทนการพึ่ง tag ลอย ๆ
FROM node:24.22.1-alpinedocker build --pull -t my-app:patched . docker run --rm my-app:patched node -v
แม้ใช้ tag อย่าง node:lts หรือ node:22 image ที่ build ไว้ก่อน 22 ต.ค. 2569 ก็ยังเป็นรุ่นเก่า การรีสตาร์ต container ไม่ได้อัปเดต Node ต้อง build ใหม่และ deploy ทุกตัว
Native module
อัปเดตภายในสายเดิม (เช่น 22.x เป็น 22.23.4) ปกติไม่ต้อง rebuild ถ้าย้ายข้ามสาย ต้อง rebuild native module เช่น better-sqlite3, bcrypt, sharp
npm rebuild
# หรือติดตั้งใหม่ทั้งหมด
rm -rf node_modules && npm ciแพลตฟอร์ม serverless และ PaaS
บริการอย่าง Vercel, Netlify, AWS Lambda หรือ Cloud Run ดูแล runtime ให้ตามรุ่นที่เลือกในการตั้งค่า ให้เช็คว่าโปรเจกต์ยังตั้งเป็น Node 20 หรือรุ่นเก่าอยู่หรือไม่ และดูประกาศของผู้ให้บริการว่าอัปเดต runtime แล้วหรือยัง
07แอป open source ที่ฝัง Node.js ไว้
นอกจากแอปที่เขียนเอง ยังมีแอป open source จำนวนมากที่รันบน Node.js และมักติดตั้งผ่าน Docker image ของผู้พัฒนา แอปเหล่านี้จะได้รุ่นที่แก้แล้วก็ต่อเมื่อ ผู้พัฒนา build image ใหม่ และคุณ pull image ใหม่มาใช้
- n8nautomation
- Node-REDautomation
- Uptime Kumamonitoring
- Dockgeจัดการ Docker
- GhostCMS
- Strapiheadless CMS
- Directusbackend
- Zigbee2MQTTsmart home
- Rocket.Chatchat
- NodeBBforum
ขั้นตอนคือ ติดตามประกาศรุ่นใหม่ของแต่ละโปรเจกต์ → pull image ใหม่ → สร้าง container ใหม่ → exec เข้าไปเช็ค node -v ถ้า image ถูก build ก่อน 21 ต.ค. 2569 ข้างในยังเป็นรุ่นเก่า
แอปบนเครื่องที่สร้างด้วย Electron
VS Code, Slack, Discord และแอปที่สร้างด้วย Electron มี Node.js ฝังอยู่ข้างใน ผู้ใช้อัปเดต Node เองไม่ได้ ต้องรอรุ่นใหม่จากผู้ผลิตแต่ละแอป ให้เปิดการอัปเดตอัตโนมัติไว้
08คำถามที่พบบ่อย
09แหล่งอ้างอิง
- Node.js: Wednesday, October 21, 2026 Security Releases
- Node.js: Release schedule (วันหมดอายุของแต่ละรุ่น)
- Node.js: ดาวน์โหลดรุ่นล่าสุด
- Docker Hub: Official node image
ข้อมูลในคู่มือนี้รวบรวมจากประกาศของ Node.js และตาราง release schedule ทางการ ณ 22 ต.ค. 2569 เวลา 20:00 น. สถานการณ์อาจเปลี่ยนแปลง โปรดตรวจประกาศล่าสุดก่อนดำเนินการ