พบช่องโหว่ใหม่บน 7-Zip ที่อาจทำให้ผู้โจมตีเรียกใช้โค้ดตามที่ต้องการ และควบคุมระบบได้

มีการเปิดเผยถึงช่องโหว่ประเภท Heap Buffer Overflow ระดับ Critical ในโปรแกรม 7-Zip เวอร์ชัน 26.00 ซึ่งอาจทำให้ผู้โจมตีสามารถเรียกใช้โค้ด หรือคำสั่งใด ๆ ก็ได้ตามต้องการผ่านวิธีการ Vtable hijack โดยอาศัยการใช้ประโยชน์จากช่องโหว่ NTFS archive handler ของโปรแกรม (Hacking & Cracking)

ช่องโหว่ดังกล่าวมีหมายเลข CVE-2026-48095 และมีรหัสคำแนะนำคือ GHSL-2026-140 โดยช่องโหว่ดังกล่าวซ่อนอยู่ในฟังก์ชัน CInStream::GetCuSize() ภายในไฟล์ NtfsHandler.cpp ฟังก์ชันนี้จะคำนวณขนาด Buffer ของ NTFS compression-unit โดยใช้ Shift operation แบบ 32 bit: (UInt32)1 << (BlockSizeLog + CompressionUnit)

เมื่อไฟล์ NTFS image ที่ถูกสร้างขึ้นมาเป็นพิเศษ มีการกำหนดค่า ClusterSizeLog >= 28 (ซึ่งเป็นค่าที่ตัว Parser ยอมรับ) และ Compressed data attribute มีค่า CompressionUnit == 4 จะทำให้ Shift exponent มีค่าถึง 32 ซึ่งเป็นการ Trigger ให้เกิดพฤติกรรม Undefined Behavior (UB) ในระบบของภาษา C++ เมื่อประมวลผลบน Hardware สถาปัตยกรรม x86 พฤติกรรม UB ดังกล่าวจะส่งผลให้ _inBuf ถูก Allocate พื้นที่หน่วยความจำเพียงแค่ 1 byte เท่านั้น ซึ่งเป็นผลสืบเนื่องมาจากกลไกการทำ Masking ค่า Shift counts ในระดับ Hardware

Buffer ขนาด 1 byte ที่เล็กเกินไปนี้ จะถูกนำไปใช้ทันทีในฟังก์ชัน ReadStream_FALSE ซึ่งจะเขียนข้อมูลที่ควบคุมโดยผู้โจมตีขนาดสูงสุดถึง 256 MB ลงไปในพื้นที่หน่วยความจำที่ถูกจองไว้เพียง byte เดียวนั้น

เนื่องจาก Stream object CInStream ถูกจองพื้นที่หน่วยความจำไว้บน Heap ถัดจาก _inBuf ไปเพียง 304 bytes การอ่านข้อมูลรอบแรกขนาด 64 KB จึงล้นเข้าไปเขียนทับ Vtable pointer ของ Object ดังกล่าว

จากนั้นการทำงานในรอบที่สองจะถูกเรียกใช้งานผ่าน Vtable ที่พังไปแล้ว ซึ่งถือเป็นรูปแบบ Vtable hijack แบบ Classic โดยผู้โจมตีจะสามารถควบคุม Pointer ที่ถูกเขียนทับได้อย่างสมบูรณ์ ผ่านเนื้อหาภายใน NTFS cluster ที่ถูกสร้างขึ้นมาเพื่อโจมตีนั่นเอง

ช่องโหว่ดังกล่าวส่งผลกระทบต่อโปรแกรมทั้งรุ่น 32 bit และ 64 bit โดยบนระบบ 64 bit ที่มี RAM ตั้งแต่ 16 GB ขึ้นไป การเรียกใช้คำสั่ง _outBuf.Alloc(8 GB) จะทำงานได้สำเร็จ และกระบวนการจะเดินหน้าเข้าสู่การทำ Overflow โดยตรง ในขณะที่บนระบบที่มีหน่วยความจำน้อย การจองพื้นที่หน่วยความจำที่ไม่สำเร็จ (Allocation failure) จะช่วยจำกัดผลกระทบให้เหลือเพียงแค่การโจมตีแบบ Denial-of-Service (DoS) เท่านั้น

สิ่งที่อันตรายเป็นพิเศษสำหรับช่องโหว่นี้คือ รูปแบบการโจมตีที่ไม่สนใจนามสกุลไฟล์ เนื่องจาก NTFS handler ใช้วิธีการตรวจจับแบบ Fallback โดยอิงจาก Signature ซึ่งจะทำการจับคู่กับ Signature ข้อความ "NTFS " ที่ตำแหน่ง Byte offset ที่ 3

นั่นหมายความว่า หากมีการสร้าง NTFS image เพื่อการโจมตี และนำไปอำพรางด้วยนามสกุลไฟล์ใด ๆ ก็ตาม ไม่ว่าจะเป็น .7z, .zip, .rar หรือแม้กระทั่งไม่มีนามสกุลไฟล์เลย ไฟล์นั้นก็จะสามารถไปทำให้ Handler ที่มีช่องโหว่ให้ทำงานได้ หลังจากที่ Handler หลักที่ตรงกับนามสกุลนั้น ๆ ได้ปฏิเสธไฟล์ดังกล่าวไปแล้ว ผู้ใช้ไม่จำเป็นต้องมีการโต้ตอบหรือกระทำการใด ๆ อีก นอกจากการเปิดไฟล์ที่ถูกสร้างขึ้นมาเพื่อโจมตีนี้เท่านั้น

ช่องโหว่ดังกล่าวได้รับคะแนนความรุนแรง CVSS 3.1 ที่ 8.8 (ระดับสูง) ด้วย vector AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H และถูกจัดประเภทให้อยู่ในกลุ่ม CWE-787 (Out-of-Bounds Write) และ CWE-190 (Integer Overflow or Wraparound) โดย 7-Zip ทุกเวอร์ชันไปจนถึงเวอร์ชัน 26.00 จะได้รับผลกระทบทั้งหมด เนื่องจากช่องโหว่ในการคำนวณของฟังก์ชัน GetCuSize() นั้นมีมาตั้งแต่โปรแกรมเริ่มรองรับฟีเจอร์ NTFS compressed stream ในครั้งแรก

ช่องโหว่ดังกล่าวถูกค้นพบ และรายงานโดย Jaroslav Lobačevski (@JarLob) จากทีม GitHub Security Lab ช่องโหว่ดังกล่าวได้รับการยืนยันโดยใช้เครื่องมือ UBSan (UndefinedBehaviorSanitizer) ภายใต้ Compiler Clang บนระบบปฏิบัติการ Linux x64 ซึ่งตรวจพบสาเหตุที่แท้จริงคือปัญหาพฤติกรรม Undefined Behavior (UB) จากการ Shift ข้อมูลในไฟล์ NtfsHandler.cpp บรรทัดที่ 687 ส่งผลให้เกิด Invalid vtable dereference แบบต่อเนื่อง จนนำไปสู่ error ร้ายแรงแบบ SIGSEGV (Securityawareness training)

ขอแนะนำให้ผู้ใช้งานอัปเดตโปรแกรม 7-Zip เป็นเวอร์ชัน 26.01 ที่ได้รับการแก้ไขแล้วในทันที และหลีกเลี่ยงการเปิดไฟล์ Archive หรือ Disk images จากแหล่งที่ไม่น่าเชื่อถือ ไม่ว่าไฟล์เหล่านั้นจะมีนามสกุลอะไรก็ตาม จนกว่าจะมีการติดตั้งแพตช์แก้ไขเรียบร้อยแล้ว

ที่มาcybersecuritynews