ต้องการคุยกับผู้ช่วยเหลือ
ไหมคะ 😊
  1. หน้าแรก
  2. ความปลอดภัยเว็บและแอป
  3. Node.js ต.ค. 2026
ระดับ High · 4 รายการ คู่มือเทคนิค อ่าน 7 นาที

ช่องโหว่ Node.js ต.ค. 2026: วิธีเช็คและอัปเดต CVE-2026-111497 และอีก 9 รายการ

ทีมวิศวกร Gramick House เผยแพร่ อัปเดตล่าสุด

เมื่อ 21 ตุลาคม 2569 Node.js ออก security release แก้ช่องโหว่ 10 รายการ ในสาย 22.x, 24.x และ 26.x ระดับ High 4 รายการ ตัวที่ร้ายแรงที่สุดคือ CVE-2026-111497 ช่องโหว่ out-of-bounds write ในตัวคลายข้อมูล Brotli ที่ประกาศทางการระบุว่าอาจนำไปสู่การรันโค้ดจากระยะไกล (RCE) รุ่นที่แก้แล้วคือ 22.23.4, 24.22.1 และ 26.12.1 ส่วน Node.js 20 หมดอายุแล้วและไม่ได้รับแพตช์

ช่องโหว่ทั้งหมด
10 รายการ (High 4 · Medium 3 · Low 3)
ตัวที่หนักที่สุด
CVE-2026-111497 · Brotli RCE
สายที่ได้รับผลกระทบ
22.x · 24.x · 26.x และรุ่นที่หมดอายุ
รุ่นที่แก้แล้ว
22.23.4 · 24.22.1 · 26.12.1

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 ออกจากรายการที่เชื่อถือ

ความรุนแรงสูงสุดของชุดนี้คือ High ไม่ใช่ Critical และประกาศทางการไม่ได้ระบุว่ามีการโจมตีจริง ณ วันที่ประกาศ จึงควรอัปเดตภายในไม่กี่วัน ไม่จำเป็นต้องปิดระบบฉุกเฉิน ต่างจากกรณี PHP2Shell ที่เป็นระดับวิกฤตและมีรายงานการโจมตีแล้ว

02ช่องโหว่ทั้ง 10 รายการ

CVEระดับรายละเอียดสายที่กระทบ
CVE-2026-111497HighBrotli decoder เขียนข้อมูลเลยขอบหน่วยความจำ (out-of-bounds write) อาจนำไปสู่ RCE26.x, 24.x, 22.x
CVE-2026-106069Highข้ามการตรวจ hostname ของ TLS ได้ เมื่อ host ถูกตีความหลวม ๆ ว่าเป็น IP address26.x, 24.x, 22.x
CVE-2026-105483Highข้ามการตรวจ hostname ของ TLS ได้ เมื่อเขียน IP ด้วยตัวเลขแบบ fullwidth26.x, 24.x
CVE-2026-105482Highdns.resolve ตัดชื่อที่มีอักขระ NUL ทิ้ง26.x, 24.x, 22.x
CVE-2026-105481Mediumsocket แบบ keep-alive ประมวลผล response ที่ถูกเขียนมาก่อนส่ง request26.x, 24.x, 22.x
CVE-2026-106072Mediumhostname IPv4 รูปแบบไม่มาตรฐาน ทำให้ DNS SAN ใช้ยืนยัน endpoint ที่เป็น IP ได้26.x, 24.x, 22.x
CVE-2026-106074Mediumcrypto.randomUUID() และ randomInt() ให้ค่าซ้ำกันในแอปที่ใช้ startup snapshot หรือ SEA26.x, 24.x, 22.x
CVE-2026-106070LowZipFile คืนไบต์ส่วนหัวที่ผู้โจมตีควบคุมได้ หลังตรวจ header ของ ZIP ไม่ผ่าน26.x
CVE-2026-106071LowPermission Model ให้สิทธิ์ไฟล์เกินจริงผ่านการค้นหาแบบ wildcard26.x
CVE-2026-106073Lowข้าม Permission Model ได้ด้วย fs.realpathSync26.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 2626.12.130 เม.ย. 2572จะเป็น LTS ตั้งแต่ 28 ต.ค. 2569 เหมาะกับโปรเจกต์ใหม่
Node.js 2424.22.130 เม.ย. 2571LTS ที่ใช้งานจริงได้ยาว แนะนำสำหรับระบบส่วนใหญ่
Node.js 2222.23.430 เม.ย. 2570อัปเดตได้เลย แต่ควรวางแผนย้ายไป 24 ภายในปีหน้า
Node.js 20ไม่มีหมดแล้ว 30 เม.ย. 2569ได้รับผลกระทบ ต้องย้ายไป 22 หรือ 24
Node.js 18 และเก่ากว่าไม่มีหมดอายุแล้วต้องย้ายรุ่น และตรวจ dependency ที่เลิกรองรับ

วันหมดอายุของแต่ละสายมาจากตาราง release schedule ทางการของ Node.js

05วิธีเช็ครุ่น Node.js

บนเซิร์ฟเวอร์หรือเครื่องที่รันแอป

Terminal
node -v

ถ้าใช้ nvm หรือมี Node หลายรุ่นในเครื่อง ให้เช็คจากผู้ใช้หรือ service ที่รันแอปจริง เช่นใน PM2 ใช้ pm2 describe <ชื่อแอป> ดูบรรทัด node.js version

ทุก container บนเครื่อง Docker

Terminal · แสดงรุ่น Node ของทุก container ที่รันอยู่
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 '-')"
done

container ที่ขึ้น - คือไม่มี Node อยู่ข้างใน ส่วนที่แสดงรุ่นต่ำกว่า 22.23.4, 24.22.1 หรือ 26.12.1 ต้อง build ใหม่

06วิธีอัปเดต

ทดสอบบนเครื่องทดสอบก่อนเสมอ โดยเฉพาะเมื่อย้ายข้ามสาย เช่น 20 ไป 22 หรือ 24

ติดตั้งผ่าน nvm

Terminal
nvm install 24.22.1
nvm alias default 24.22.1
node -v

ติดตั้งผ่าน apt (NodeSource หรือ repository ของ distro)

Ubuntu / Debian
sudo apt update
sudo apt install --only-upgrade nodejs
node -v

repository ของ distro บางตัวอาจยังไม่มีรุ่นใหม่ ให้เช็คเลขรุ่นหลังอัปเดตทุกครั้ง แล้วรีสตาร์ตแอป เช่น pm2 restart all หรือ sudo systemctl restart <ชื่อ service>

Docker

Dockerfile
# ระบุรุ่นที่แก้แล้วให้ชัด แทนการพึ่ง tag ลอย ๆ
FROM node:24.22.1-alpine
Terminal
docker 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

Terminal
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คำถามที่พบบ่อย

เมื่อ 21 ตุลาคม 2569 Node.js ออก security release แก้ช่องโหว่ 10 รายการในสาย 22.x, 24.x และ 26.x ระดับ High 4 รายการ ตัวที่ร้ายแรงที่สุดคือ CVE-2026-111497 ช่องโหว่ out-of-bounds write ในตัวคลายข้อมูล Brotli (Brotli decoder) ที่ประกาศทางการระบุว่าอาจนำไปสู่การรันโค้ดจากระยะไกล (Remote Code Execution: RCE) รุ่นที่แก้แล้วคือ Node.js 22.23.4, 24.22.1 และ 26.12.1 ส่วน Node.js 20 หมดอายุแล้วและไม่ได้รับแพตช์

ระดับสูงสุดของชุดนี้คือ High ไม่ใช่ Critical ตัวที่น่ากังวลที่สุดคือ CVE-2026-111497 ซึ่งอาจนำไปสู่ RCE แต่เกิดเฉพาะเมื่อแอปคลายข้อมูล Brotli ที่มาจากภายนอก ประกาศของ Node.js ไม่ได้ระบุว่ามีการโจมตีจริง ณ วันที่ประกาศ แต่ควรอัปเดตภายในไม่กี่วัน เพราะเมื่อแพตช์ออก ผู้โจมตีสามารถศึกษาจุดที่แก้ได้

ต้องอัปเดต เพราะ framework เหล่านี้ทำงานบน Node.js runtime ช่องโหว่อยู่ในตัว Node.js ไม่ได้อยู่ใน framework การอัปเดตแพ็กเกจใน package.json อย่างเดียวจึงไม่พอ ต้องเปลี่ยนรุ่น Node.js บนเซิร์ฟเวอร์หรือใน Docker image แล้ว build และ deploy ใหม่

Node.js 20 หมดอายุเมื่อ 30 เมษายน 2569 และ Node.js 18 หมดอายุก่อนหน้านั้น ทั้งสองรุ่นไม่ได้รับแพตช์ชุดนี้ และ Node.js ระบุว่ารุ่นที่หมดอายุได้รับผลกระทบเสมอ ต้องย้ายไป 22 หรือ 24 ซึ่ง 24 ได้รับการดูแลถึงเมษายน 2571 ส่วน 22 ถึงเมษายน 2570

ไม่ได้เอง tag ใน Docker Hub ถูกอัปเดตเป็นรุ่นที่แก้แล้วตั้งแต่ 22 ต.ค. 2569 แต่ image ที่ build ไว้ก่อนหน้ายังเป็น Node.js รุ่นเก่า ต้องสั่ง build ใหม่โดยดึง base image ล่าสุด เช่น docker build --pull แล้ว deploy ใหม่ จากนั้นเช็คด้วย node -v ใน container

แอปเหล่านี้มี Node.js อยู่ใน Docker image ของผู้พัฒนา จะได้รุ่นที่แก้แล้วก็ต่อเมื่อผู้พัฒนา build image ใหม่ ให้ติดตามประกาศรุ่นใหม่ของแต่ละโปรเจกต์ pull image ใหม่ แล้ว exec เข้า container เพื่อเช็ค node -v ถ้า image ถูก build ก่อน 21 ต.ค. 2569 ข้างในยังเป็นรุ่นเก่า

ถ้าอัปเดตภายในสายเดิม เช่น 22.x เป็น 22.23.4 ปกติไม่ต้อง rebuild ถ้าย้ายข้ามสาย เช่น 20 ไป 22 ต้อง rebuild native module อย่าง better-sqlite3, bcrypt หรือ sharp ด้วย npm rebuild หรือลบ node_modules แล้วติดตั้งใหม่ด้วย npm ci

แอปที่สร้างด้วย Electron มี Node.js ฝังอยู่ข้างใน ผู้ใช้อัปเดตเองไม่ได้ ต้องรอผู้ผลิตแต่ละแอปออกรุ่นใหม่ ให้เปิดการอัปเดตอัตโนมัติไว้และติดตั้งรุ่นใหม่เมื่อมี

09แหล่งอ้างอิง

  1. Node.js: Wednesday, October 21, 2026 Security Releases
  2. Node.js: Release schedule (วันหมดอายุของแต่ละรุ่น)
  3. Node.js: ดาวน์โหลดรุ่นล่าสุด
  4. Docker Hub: Official node image
ประกาศเตือนอื่น: PHP2Shell (CVE-2026-109618 / CVE-2026-109619) ช่องโหว่ระดับวิกฤตในตัว PHP — วิธีตรวจและแก้ →

ข้อมูลในคู่มือนี้รวบรวมจากประกาศของ Node.js และตาราง release schedule ทางการ ณ 22 ต.ค. 2569 เวลา 20:00 น. สถานการณ์อาจเปลี่ยนแปลง โปรดตรวจประกาศล่าสุดก่อนดำเนินการ