ช่องโหว่ระดับ Critical ใน NGINX ทำให้ Worker Process ล่ม และอาจนำไปสู่การโจมตีแบบ Remote Code Execution

F5 ได้ออกแพตช์แก้ไขช่องโหว่ระดับ Critical ใน nginx ซึ่งอาจทำให้ผู้โจมตีจากภายนอกที่ไม่ต้องผ่านการยืนยันตัวตน สามารถทำให้เกิด Heap buffer overflow ใน Worker Process ได้ด้วยการส่ง HTTP Request ที่ถูกสร้างขึ้นมาเป็นพิเศษ โดยช่องโหว่ CVE-2026-42533 นี้ได้รับการแก้ไขไปแล้วเมื่อวันที่ 15 กรกฎาคม ใน nginx เวอร์ชัน 1.30.4 (Stable) และ 1.31.3 (Mainline) รวมถึงใน NGINX Plus เวอร์ชัน 37.0.3.1 ทั้งนี้ ผู้ที่ใช้งานเวอร์ชันก่อนหน้านี้ควรรีบอัปเดตโดยเร็วที่สุด

การโจมตีช่องโหว่นี้อาจทำให้ Worker Process ล่ม หรือรีสตาร์ท ซึ่งนำไปสู่สภาวะ DoS (Denial of Service) และในกรณีที่ ASLR ถูกปิดใช้งาน หรือสามารถถูก Bypass ได้ F5 ระบุว่า ช่องโหว่นี้อาจเปิดทางให้เกิดการโจมตีแบบ Remote Code Execution (RCE) ได้ด้วย

ช่องโหว่ Buffer overflow นี้อยู่ใน Script Engine ของ nginx ซึ่งเป็นส่วนของโค้ดที่ทำหน้าที่ประกอบสตริง (String) ต่าง ๆ ในขณะที่มีการ request เข้ามา โดยช่องโหว่จะเกิดขึ้นภายใต้การตั้งค่าแบบเฉพาะเจาะจงเท่านั้น คือการใช้ map ที่อ้างอิงกับ Regex ซึ่งตัวแปรผลลัพธ์ของมันถูกนำไปอ้างอิงใน String Expression ภายหลังจากการ Capture ค่าจากการจับคู่ Regex ก่อนหน้า

ภายใต้รูปแบบดังกล่าว กระบวนการประเมินผลแบบสองรอบ (Two-Pass) ของ Engine จะทำงานผิดพลาด โดยรอบแรกจะทำหน้าที่วัดว่าผลลัพธ์ต้องใช้พื้นที่กี่ไบต์ และจองพื้นที่ Buffer ให้พอดี ส่วนรอบที่สองจะเขียนข้อมูลไบต์เหล่านั้นลงไป ซึ่งทั้งสองรอบต่างอ่านค่าจาก Capture State ชุดเดียวกันที่ใช้ร่วมกัน และการประเมินผล Regex ของ map ในระหว่างสองรอบนี้เอง ที่ทำให้ค่าดังกล่าวถูกเขียนทับ

ดังนั้น รอบที่ทำหน้าที่วัดขนาดจึงกำหนดขนาด Buffer ตาม Capture เดิม ซึ่งเป็นค่าอ้างอิงอย่างเช่น $1 จากการจับคู่ location ในขณะที่รอบที่ทำหน้าที่เขียนข้อมูล กลับเติมข้อมูลจาก Capture อีกชุดหนึ่งที่มีขนาดตามที่ผู้โจมตีกำหนด ส่งผลให้ Buffer มีขนาดเล็กเกินไป และทั้งความยาว และเนื้อหาของข้อมูลส่วนที่เกินออกมานั้น ล้วนมาจาก Request ของผู้โจมตีโดยตรง

ช่องโหว่นี้ไม่ได้ส่งผลกระทบต่อเซิร์ฟเวอร์ nginx ทุกเครื่อง เนื่องจากความเสี่ยงขึ้นอยู่กับการตั้งค่า ไม่ใช่แค่เพียงเวอร์ชันที่ใช้งาน โดยประกาศแจ้งเตือนของ F5 ระบุว่า ช่องโหว่นี้ส่งผลกระทบต่อ NGINX Ingress Controller, Gateway Fabric, App Protect WAF และ Instance Manager นอกเหนือไปจากตัว Core Server และ NGINX Plus แม้ว่า ณ เวลาที่เผยแพร่ F5 จะยังไม่ได้ระบุเวอร์ชันที่แก้ไขแล้วสำหรับผลิตภัณฑ์ทั้งสี่รายการนี้ก็ตาม

F5 ได้ให้คะแนนระดับความรุนแรงของช่องโหว่นี้ไว้ที่ 9.2 บนมาตรฐาน CVSS v4 และ 8.1 บนมาตรฐาน v3.1 แบบเดิม พร้อมทั้งประเมินว่ามีความซับซ้อนในการโจมตีอยู่ในระดับสูง ทั้งนี้ nginx ทุกเวอร์ชันตั้งแต่ 0.9.6 ไปจนถึง 1.31.2 ล้วนได้รับผลกระทบ ซึ่งเป็นช่วงที่ย้อนกลับไปไกลถึงปี 2011 ซึ่งเป็นปีที่ฟีเจอร์ map เริ่มรองรับการใช้งาน Regex

ช่องโหว่ CVE-2026-42533 ถูกรายงานไปยัง F5 โดยนักวิจัยอิสระมากกว่าสิบรายติดต่อกัน ซึ่งทาง F5 ได้ขอบคุณนักวิจัยเหล่านั้นที่ได้นำประเด็นปัญหานี้มาแจ้งให้ทราบอย่างเป็นอิสระ โดยใน Changelog ของ nginx เองได้ให้เครดิตการแก้ไขช่องโหว่นี้แก่ Mufeed VH จาก Winfunc Research และ Maxim Dounin ผู้ดูแลโครงการ

หนึ่งในผู้รายงานช่องโหว่ ได้แก่ Stan Shaw ซึ่งเผยแพร่รายงานภายใต้ชื่อ cyberstan ได้เผยแพร่รายงานเชิงลึกที่ให้รายละเอียดมากกว่าในประกาศแจ้งเตือน โดย F5 ได้ตั้งเงื่อนไขว่า การโจมตีแบบรันโค้ดจะเกิดขึ้นได้ก็ต่อเมื่อ ASLR ถูกปิดใช้งาน หรือสามารถถูก Bypass ได้ แต่ Shaw แย้งว่า ตัวช่องโหว่เองนั้นเป็นตัวเปิดช่องทางในการ Bypass ให้ในตัว โดยเขาได้ระบุกับ The Hacker News ว่า การเขียนทับค่า Capture นั้นสามารถทำงานย้อนกลับได้เช่นกัน กล่าวคือ เมื่อค่า Capture ที่ถูกเขียนทับมีขนาดเล็กกว่าค่าเดิม Buffer ที่มีขนาดใหญ่เกินไปจะคืนค่าข้อมูล Heap ที่ยังไม่ได้กำหนดค่าเริ่มต้นกลับออกมา และบนระบบ Ubuntu 24.04 แบบค่าเริ่มต้น การส่ง GET request เพียงครั้งเดียวโดยไม่ต้องผ่านการยืนยันตัวตน ก็สามารถกู้คืน Address ที่จำเป็นต่อการสร้าง Payload ได้

Shaw ระบุว่า "ผู้ที่อ่านประกาศแจ้งเตือนของ F5 อาจสรุปได้ว่าช่องโหว่นี้เป็นเพียงแค่ DoS บนระบบที่ใช้ค่าเริ่มต้นเท่านั้น แต่ความจริงแล้วไม่ใช่เช่นนั้น" ซึ่งนับเป็นคำกล่าวอ้างที่หนักแน่นกว่าที่ F5 ระบุไว้ โดยเขาระบุว่า ช่องโหว่นี้ได้คะแนนเต็ม 10 จาก 10 จากการทดสอบของเขาเอง อย่างไรก็ตาม ในขณะนี้เขายังคงเก็บรายละเอียดของวิธีการโจมตี และ Proof-of-Concept (PoC) ไว้ก่อน จึงยังไม่มีใครสามารถตรวจสอบได้อย่างเป็นอิสระในตอนนี้

แนวทางการแก้ไขคือการอัปเกรดเป็น nginx เวอร์ชัน 1.30.4 หรือ 1.31.3 หรือ NGINX Plus เวอร์ชัน 37.0.3.1 สำหรับผู้ที่ไม่สามารถติดตั้งแพตช์ได้ในทันที F5 ได้แนะนำมาตรการแก้ไขชั่วคราวด้วยการเปลี่ยน Regex map ที่ได้รับผลกระทบให้ไปใช้ Named Captures แทน ซึ่ง Shaw ระบุว่า วิธีนี้สามารถปิดช่องทางการโจมตีหลักได้ และครอบคลุมการตั้งค่าส่วนใหญ่

อย่างไรก็ตาม เขาได้ระบุกับ The Hacker News ว่า มาตรการดังกล่าวยังคงเหลือช่องทางการโจมตีเปิดทิ้งไว้ กล่าวคือ map ที่กำหนด Named Group เดียวกันกับ location regex จะสามารถเข้าถึงช่องโหว่ Overflow เดียวกันได้ผ่านเส้นทางของโค้ดที่สอง ซึ่งเขาได้ยืนยันด้วยเครื่องมือ AddressSanitizer และเป็นสิ่งที่ประกาศแจ้งเตือนของ F5 ไม่ได้กล่าวถึง โดยเขาระบุว่า "การอัปเกรดเป็นเวอร์ชัน 1.30.4 / 1.31.3 เป็นวิธีการแก้ไขที่สมบูรณ์เพียงวิธีการเดียว"

รูปแบบความเสี่ยงที่ควรค้นหานั้นค่อนข้างจำเพาะเจาะจง ได้แก่ การใช้ Regex map ที่ตัวแปรของมันปรากฏอยู่ใน String Expression ร่วมกับ Numbered Capture ($1, $2) จาก Regex ก่อนหน้า โดยมีการเขียนค่า Capture นั้นไว้ก่อนหน้าตัวแปรของ map

เครื่องมือสแกนที่ Shaw พัฒนาขึ้นเองนั้น สามารถตรวจสอบรูปแบบดังกล่าวโดยอัตโนมัติทั่วทั้งไฟล์ Configuration ติดตามไฟล์ที่ถูก include เข้ามา และแจ้งเตือนเฉพาะลำดับการทำงานที่สามารถถูกโจมตีได้เท่านั้น ทั้งนี้ เครื่องมือดังกล่าวไม่ได้ทำการโจมตีใด ๆ แต่เนื่องจากเป็นเครื่องมือของผู้รายงานช่องโหว่ จึงไม่ถือเป็นผลิตภัณฑ์อย่างเป็นทางการจากผู้พัฒนา

ช่องโหว่นี้ถือเป็นช่องโหว่ Heap overflow รายการที่สามในส่วนของโค้ด Expression-Evaluation ของ nginx ที่ถูกเปิดเผยภายในระยะเวลาประมาณสองเดือน ต่อจากช่องโหว่ Rift (CVE-2026-42945) ในเดือนพฤษภาคม และช่องโหว่ประเภท Overlapping Captures ใน Rewrite Module (CVE-2026-9256) ในอีกไม่กี่วันถัดมา

ช่องโหว่ทั้งสามรายการล้วนเป็นช่องโหว่ประเภทเดียวกัน กล่าวคือ Script Engine แบบ Two-Pass ของ nginx จะกำหนดขนาด Buffer ในรอบหนึ่ง และเขียนข้อมูลลงไปในอีกรอบหนึ่ง โดยในแต่ละครั้ง การเขียนข้อมูลจะเกินกว่าขนาดที่วัดไว้ ทั้งนี้ ตัวที่ทำให้เกิดช่องโหว่นั้นแตกต่างกันไป ไม่ว่าจะเป็น Stale Flag ในกรณีของ Rift, การ Capture ที่ซ้อนทับกันในกรณีของ Rewrite Module และการเขียนทับค่า Capture State ในกรณีนี้ อย่างไรก็ตาม ช่องโหว่ร่วมกันตามที่นักวิจัยได้ตั้งข้อสังเกตไว้ ก็คือการออกแบบแบบ two-pass ที่เชื่อถือผลการวัดของตัวเองมากเกินไป

ณ วันที่ 20 กรกฎาคม ช่องโหว่ CVE-2026-42533 ยังไม่ถูกบรรจุอยู่ในรายการ Known Exploited Vulnerabilities (KEV) ของ CISA และยังไม่มีโค้ดสำหรับโจมตี (Exploit) ถูกปล่อยออกสู่สาธารณะ โดย Shaw ระบุว่า เขาจะเผยแพร่ Proof-of-Concept ของตนเองภายใน 21 วันหลังจากที่แพตช์ถูกปล่อยออกมา ทั้งนี้ ช่องโหว่ Rift ถือเป็นกรณีตัวอย่างที่ควรระวัง เนื่องจากโค้ดสำหรับโจมตีของมันถูกเปิดเผยสู่สาธารณะภายในไม่กี่วัน และถูกนำไปใช้ในการโจมตีจริงในเวลาต่อมาไม่นาน ซึ่งนี่คือเหตุผลว่าทำไมจึงควรรีบอัปเดตก่อนที่โค้ดโจมตีของช่องโหว่นี้จะปรากฏออกมา

The Hacker News ได้สอบถามไปยัง F5 ว่าการเปลี่ยนไปใช้ Named Captures นั้นสามารถปิดช่องโหว่ CVE-2026-42533 ได้อย่างสมบูรณ์หรือไม่ เมื่อพิจารณาจากช่องโหว่รูปแบบย่อยที่ Shaw ได้บันทึกไว้ รวมถึงสอบถามว่าเวอร์ชันที่แก้ไขแล้วสำหรับผลิตภัณฑ์ที่ได้รับผลกระทบจะถูกปล่อยออกมาเมื่อใด อย่างไรก็ตาม F5 ยังไม่ได้ตอบกลับมาจนกระทั่งถึงเวลาที่เผยแพร่ข่าวนี้

ที่มา : Thehackernews