สรุปสั้น
NGINX ออกเวอร์ชัน 1.30.6 (สาย stable) และ 1.31.7 (สาย mainline) เมื่อวันที่ 14 ตุลาคม 2569 แก้ช่องโหว่ 5 รายการ โดยหนึ่งในนั้นมีอยู่ในทุกรุ่นตั้งแต่เดือนพฤษภาคม 2548 กลุ่มแรกเป็นบั๊กหน่วยความจำ 3 ตัวที่บริษัท F5 เจ้าของ NGINX ระบุว่าทำให้ worker process ล่มหรืออาจรันโค้ดได้ ตัวที่สี่ทำให้ปลอม TLS session ที่อาจผ่านการตรวจใบรับรองไคลเอนต์ แม้ F5 จะบอกว่าการปลอมนี้เกิดแบบสุ่มและผู้โจมตีควบคุมไม่ได้ และตัวที่ห้าเปิดให้ไคลเอนต์ HTTP/3 แทรกไบต์ส่วนเกินเข้าไปในคำขอที่ NGINX ส่งต่อไปยัง backend
NGINX จัดระดับทั้ง 5 ช่องโหว่เป็น medium แต่ F5 ให้คะแนน CVSS v4.0 บั๊กหน่วยความจำทั้งสามที่ 9.2 (Critical) บั๊ก TLS ที่ 8.3 และบั๊ก HTTP/3 ที่ 6.9 จุดสำคัญคือทุกช่องโหว่ต้องอาศัย directive ที่ผู้ดูแลตั้งเอง เช่น alias คู่กับ rewrite, regex map, AIO คู่กับ SSI, shared TLS session cache หรือ HTTP/3 ซึ่งบางค่า เช่น shared session cache เป็นค่าที่เอกสารของ NGINX แนะนำเอง ณ วันที่ 15 ตุลาคม ยังไม่มีช่องโหว่ใดอยู่ในแคตตาล็อก KEV ของ CISA และทั้ง NGINX และ F5 ยังไม่พบการโจมตีจริง
ประเด็นที่ควรระวังเป็นพิเศษคือช่องโหว่ regex map ตัวใหม่ CVE-2026-93479 เกิดในโค้ดจัดการสตริงที่เพิ่งแพตช์ไปเมื่อเดือนกรกฎาคมสำหรับ CVE-2026-42533 เซิร์ฟเวอร์ที่อัปเดตเมื่อเดือนกรกฎาคมแล้วจึงยังอยู่ในช่วงที่ได้รับผลกระทบ ต้องอัปเกรดอีกรอบ
รายละเอียดข่าว
เว็บไซต์ The Hacker News รายงานเมื่อวันที่ 15 ตุลาคม 2569 ว่า NGINX ปล่อยเวอร์ชัน 1.30.6 และ 1.31.7 เพื่อแก้ช่องโหว่ 5 รายการ ประกอบด้วย CVE-2026-15176 (heap overflow ในจุดที่ใช้ alias ร่วมกับ rewrite), CVE-2026-93479 (heap overflow ใน regex map), CVE-2026-97205 (use-after-free เมื่อเปิด AIO ร่วมกับ SSI), CVE-2026-95101 (แทรกไบต์ในคำขอที่ proxy ผ่าน HTTP/3) และ CVE-2026-97629 (ปลอม TLS session จากการหมุนคีย์ session ticket อัตโนมัติ)
ช่องโหว่ TLS อยู่ในกลไกหมุนคีย์ session ticket ซึ่งตั้งแต่เวอร์ชัน 1.23.2 (ตุลาคม 2565) NGINX จะสร้างและหมุนคีย์เองเมื่อเปิด shared session cache โดยไม่โหลดคีย์จากไฟล์ แต่ละ worker เก็บคีย์ไว้ 3 ช่อง ขณะที่การหมุนคัดลอกไปเพียง 2 ช่อง ช่องที่สามจึงเป็นข้อมูลค้างในหน่วยความจำ และ ticket ที่อ้างช่องนั้นอาจถูกถอดรหัสและยืนยันได้ด้วยคีย์ที่ไม่ได้กำหนดค่า ทำให้เกิด “session ปลอม” ตามคำอธิบายใน commit แก้ไข การตั้งค่าที่เปิดช่องโหว่คือ ssl_session_cache shared:SSL:10m ซึ่งเป็นตัวอย่างในเอกสารทางการ และ NGINX เคยแก้ช่องโหว่ session reuse ที่ให้ผลคล้ายกัน คือ CVE-2025-23419 ไปเมื่อกุมภาพันธ์ 2568
F5 ให้เครดิตนาย Matt Suiche จากบริษัท Tolmo และนาย Mateusz Gierblinski สำหรับช่องโหว่ map นาย Hansol Lee จาก GOTROOT สำหรับช่องโหว่ HTTP/3 ทีม PhiNode Labs สำหรับช่องโหว่ TLS และนักวิจัยชื่อ Cyberlanc3r สำหรับช่องโหว่ AIO ส่วนช่องโหว่ alias นั้น F5 พบเอง นอกจากนี้ NGINX ยังออก njs 1.0.2 วันเดียวกัน แก้ช่องโหว่จัดการ XML ระดับ medium 2 รายการ (CVE-2026-101025 และ CVE-2026-101019) รอบนี้เป็นการออกแพตช์ความปลอดภัยครั้งที่ 8 ของ NGINX ในปี 2569
รายละเอียดช่องโหว่
| CVE | ผลกระทบ | การตั้งค่าที่เปิดช่องโหว่ | เวอร์ชันที่กระทบ | ทางแก้ชั่วคราว (F5) |
|---|---|---|---|---|
| CVE-2026-15176 | heap overflow ใน worker — ล่ม หรืออาจรันโค้ด | location ที่มี alias + rewrite ที่เปลี่ยน URI + มีสิ่งที่อ่าน $request_filename (return, set, if, add_header หรือ log format) | 0.1.29 – 1.31.6 | เลิกใช้ alias ใน location นั้น หรือเลิกใช้ $request_filename |
| CVE-2026-93479 | heap overflow ใน worker — ล่ม หรืออาจรันโค้ด | regex map ที่ capture ถูกอ้างโดย root หรือ log_format ก่อนตัวแปรผลลัพธ์ของ map | 1.30.0 – 1.30.5 และ 1.31.2 – 1.31.6 | ใช้ named capture และใช้เฉพาะในบล็อกที่ match regex |
| CVE-2026-97205 | use-after-free ใน worker — ล่ม หน่วยความจำเสียหาย หรืออาจรันโค้ด | เปิด aio และมีหน้า SSI ที่ใช้ include virtual (บางรูปแบบ) | 0.8.11 – 1.31.6 | ปิด aio หรือเลิกให้บริการหน้า SSI |
| CVE-2026-95101 | แทรกไบต์เกินในคำขอที่ proxy ต่อ หรือส่ง body เกิน client_max_body_size | HTTP/3 + proxy_request_buffering on (ค่าเริ่มต้น) | 1.25.0 – 1.31.6 | ตั้ง proxy_request_buffering off |
| CVE-2026-97629 | ปลอม TLS session ที่อาจข้ามการตรวจใบรับรองไคลเอนต์ (แบบสุ่ม ผู้โจมตีควบคุมไม่ได้) | ssl_session_cache shared:... โดยไม่มี ssl_session_ticket_key | 1.23.2 – 1.31.6 | ถอด shared cache หรือโหลดคีย์จากไฟล์ด้วย ssl_session_ticket_key (เซิร์ฟเวอร์ที่ตั้ง ssl_session_tickets off ไม่กระทบ) |
ช่องโหว่ alias เกิดในช่วงสั้น ๆ หลัง rewrite เปลี่ยน URI แต่ก่อนที่ NGINX จะเลือก location ถัดไป ถ้ามีสิ่งใดอ่าน $request_filename ในช่วงนั้น และ prefix ของ location ยาวกว่า URI ที่ถูก rewrite การแปลง URI เป็น path ไฟล์จะล้นบัฟเฟอร์
ช่องโหว่ map มีที่มาจากแพตช์เดือนกรกฎาคม แพตช์แรกเพิ่มการป้องกันการเขียนเกินบัฟเฟอร์ แต่ข้อมูลยังล้นเข้าไปในพื้นที่สำรองได้ และแพตช์ที่สองกลับคำนวณขนาดสตริงสุดท้ายจากความยาวที่ล้นนั้น สตริงจึงโตเกินบัฟเฟอร์ได้ commit แก้ไขระบุว่าการล้นจำกัดอยู่ที่ขนาดพื้นที่สำรองบน path ของ document root และเพียง null byte เดียวบน path ของ access log ก่อนหน้านี้นาย Stan Shaw นักวิจัย เคยเตือนตั้งแต่เดือนกรกฎาคมว่าทางแก้ชั่วคราวด้วย named capture ยังเหลือช่องแคบ ๆ และ “การอัปเกรดเป็นทางแก้ที่สมบูรณ์ทางเดียว”
ช่องโหว่ AIO เป็นปัญหาตัวนับ การดำเนินการแบบ asynchronous ที่ค้างอยู่แต่ละครั้งจะบวกค่าในฟิลด์ 8 บิตโดยไม่ตรวจขอบเขต เมื่อครบ 256 ค่าจะวนกลับเป็นศูนย์ คำขออาจถูกปล่อยหน่วยความจำทั้งที่ยังมีงานค้างชี้อยู่ ส่วนช่องโหว่ HTTP/3 เกิดจากฟิลด์เดียวในตัว parser ทำสองหน้าที่ คือเก็บความยาวที่เหลือของเฟรมที่ไม่รู้จักซึ่งกำลังข้าม และจำนวนไบต์ DATA ที่จะส่งเป็น body เมื่อเฟรมแตกข้ามการอ่านสองครั้ง ค่าที่เหลือจึงถูกนับเป็น body และส่งไป backend โดยไม่ผ่านการตรวจ client_max_body_size
ข้อมูลเพิ่มเติมจาก advisory ของ F5
เว็บไซต์ SecurityWeek รายงานเมื่อวันที่ 16 ตุลาคม 2569 ว่าในรอบเดียวกันนี้ บริษัท F5 ประกาศแก้ข้อบกพร่องด้านความปลอดภัยใน NGINX รวม 11 รายการ (advisory K000163408) มากกว่า 5 ช่องโหว่ที่ NGINX จัดเป็นแพตช์ความปลอดภัยของโอเพนซอร์ส โดย F5 จัด CVE-2026-15176 และ CVE-2026-93479 เป็นระดับ critical ที่ถูกใช้ได้โดยไม่ต้องยืนยันตัวตนผ่านคำขอ HTTP ที่สร้างขึ้นเฉพาะ ภายใต้เงื่อนไขที่อยู่นอกเหนือการควบคุมของผู้โจมตี การล้นบัฟเฟอร์จะทำให้ worker รีสตาร์ต และ หาก ASLR ถูกปิดหรือถูกข้ามได้ ผู้โจมตีอาจรันโค้ดได้ ส่วน CVE-2026-97205 อาจทำให้หน่วยความจำเสียหายหรือ worker หยุดทำงาน และอาจถึงขั้นรันโค้ดได้หากปิด ASLR
ข้อบกพร่องที่เหลือใน advisory ของ F5 อาจเปิดให้ข้ามการตรวจสอบยืนยัน อ่านข้อมูลอ่อนไหว ปลอมแปลงคุณสมบัติของคำขอ แทรกข้อมูลในคำขอที่ proxy ต่อ ทำให้หน่วยความจำโตไม่จำกัด หรือเข้าถึง path ที่ป้องกันไว้ก่อนการยืนยันตัวตน ทั้ง F5 และ SecurityWeek ไม่ได้ระบุว่ามีรายการใดถูกใช้โจมตีจริง
ผลกระทบ
NGINX เป็นเว็บเซิร์ฟเวอร์และ reverse proxy ที่ใช้กันกว้างขวางที่สุดตัวหนึ่ง แต่ความเสี่ยงรอบนี้ขึ้นกับการตั้งค่าเป็นหลัก ช่องโหว่ที่น่ากังวลที่สุดในเชิงปริมาณคือ CVE-2026-97629 เพราะการตั้ง shared session cache เป็นค่าที่เอกสารแนะนำ ระบบที่ใช้ mutual TLS ตรวจใบรับรองไคลเอนต์จึงควรประเมินก่อน ขณะที่ CVE-2026-95101 กระทบทุกระบบที่เปิด HTTP/3 เพราะเงื่อนไขอีกข้อเป็นค่าเริ่มต้น และอาจถูกใช้ลักลอบส่ง body ขนาดเกินกำหนดหรือข้อมูลแปลกปลอมไปยังแอปพลิเคชันหลังบ้าน
ประวัติที่ต้องนำมาประกอบการตัดสินใจคือ ช่องโหว่ rewrite ที่ NGINX แพตช์เมื่อพฤษภาคม (CVE-2026-42945) ถูกนำไปโจมตีภายในไม่กี่วันหลังเปิดเผยตามข้อมูลของ VulnCheck และ NGINX แก้เฉพาะสาย 1.30 และ 1.31 สายเก่าอย่าง 1.28 จึงยังอยู่ในช่วงที่กระทบ แพ็กเกจของ distro จะปลอดภัยก็ต่อเมื่อ distro นั้น backport แพตช์แล้วเท่านั้น สำหรับลูกค้า NGINX Plus และผลิตภัณฑ์ของ F5 อย่าง Ingress Controller, Gateway Fabric, Instance Manager และ WAF บางตัวยังไม่มี build ที่แก้ไข ณ วันที่ 15 ตุลาคม
คำแนะนำ
- อัปเกรดเป็น NGINX 1.30.6 (stable) หรือ 1.31.7 (mainline) — เซิร์ฟเวอร์ที่เพิ่งอัปเดตเมื่อกรกฎาคมก็ต้องอัปเกรดซ้ำ
- ใช้
nginx -Tพิมพ์ config ที่รันจริง แล้วค้นหาaliasคู่กับrewrite, regexmapที่ถูกใช้ในroot/log_format,aioคู่กับssi, บรรทัดlisten ... quicและssl_session_cache sharedที่ไม่มีssl_session_ticket_key - ถ้ายังอัปเกรดไม่ได้ ใช้ทางแก้ชั่วคราวของ F5 ตามตาราง เช่น โหลดคีย์ session ticket จากไฟล์ หรือตั้ง
proxy_request_buffering offสำหรับ HTTP/3 - ระบบที่พึ่ง mutual TLS ให้ทบทวนว่ามีการตรวจสิทธิ์ชั้นอื่นซ้อนอยู่หรือไม่ ไม่ควรพึ่งใบรับรองไคลเอนต์เป็นชั้นเดียว
- ผู้ใช้ NGINX Plus และผลิตภัณฑ์ F5 ให้ติดตาม advisory ของ F5 (K000162416, K000162606-K000162613) เพราะบางผลิตภัณฑ์ยังไม่มี build แก้ไข
- ตรวจว่าเซิร์ฟเวอร์เปิด ASLR อยู่ (ค่าเริ่มต้นของ Linux สมัยใหม่) เพราะเป็นเงื่อนไขที่ F5 ระบุว่ากั้นไม่ให้บั๊กหน่วยความจำกลายเป็นการรันโค้ด
- ตรวจแพ็กเกจของ distro ว่า backport แพตช์แล้ว และอัปเดต njs เป็น 1.0.2 หากใช้โมดูล JavaScript
