พบช่องโหว่ใน OpenBSD Kernel ที่มีอายุนานกว่า 37 ปี สามารถใช้โจมตีเพื่อยกระดับสิทธิ์เป็น Root ได้

มีการเผยแพร่ Proof-of-Concept (PoC) Exploit ที่สามารถยกระดับสิทธิ์เป็น Root บน OpenBSD ด้วยการใช้ช่องโหว่ 2 รายการใน Kernel ร่วมกัน โดยช่องโหว่หลักมีต้นกำเนิดย้อนหลังไปประมาณ 37 ปี ตั้งแต่ Source Code ดั้งเดิมของ BSD

นักวิจัยด้านความปลอดภัยจาก Calif ระบุว่า ช่องโหว่นี้ยังคงอยู่มาเป็นเวลานาน เนื่องจากตัวนับจำนวนการเชื่อมต่อ Shared Memory ที่ชื่อ shm_nattch ใช้ตัวแปรจำนวนเต็มแบบ Signed 16-bit

OpenBSD ได้แก้ไขช่องโหว่ทั้ง 2 รายการก่อนที่ Calif จะเผยแพร่ Exploit ในวันที่ 16 ตุลาคม 2026 โดยงานวิจัยที่เผยแพร่ครอบคลุมการโจมตีแบบ Local Privilege Escalation และไม่มีรายงานว่าช่องโหว่ดังกล่าวถูกนำไปใช้โจมตีจริง

ช่องโหว่ OpenBSD ที่มีอายุนานกว่า 37 ปี

ช่องโหว่แรกส่งผลกระทบต่อการจัดการ Shared Memory แบบ System V โดยผู้ใช้งานภายในระบบสามารถสร้าง Process ใหม่ซ้ำ ๆ ด้วยการ Fork Process ที่มีข้อมูล Shared Memory เพื่อเพิ่มค่าตัวนับให้เกินค่าสูงสุดที่ 32,767

เมื่อค่าตัวนับเกินขีดจำกัด ค่าจะวนกลับกลายเป็นจำนวนติดลบ ทำให้เกิด Integer Overflow ซึ่งอาจนำไปสู่ Race Condition และส่งผลให้เกิดช่องโหว่ Use-After-Free ใน Kernel

ขณะเดียวกัน ช่องโหว่ที่สองทำให้สามารถเขียนข้อมูลออกนอกขอบเขตหน่วยความจำ (Out-of-Bounds Write) ได้ภายใต้เงื่อนไขบางประการ ทำให้นักวิจัยสามารถควบคุมการทำงานได้มากเพียงพอที่จะเปลี่ยนปัญหา Memory Corruption ให้กลายเป็นการเข้าถึงระบบด้วยสิทธิ์ Root

Exploit ของ Calif เริ่มจากการ Map Shared Memory จำนวน 127 Segment จากนั้นยกเลิก Mapping และ Fork Process จำนวน 259 Process เพื่อบังคับให้ค่าตัวนับวนกลับเมื่อเกินขีดจำกัด

หลังจากนั้น Exploit จะจัดรูปแบบการใช้งานหน่วยความจำ Kernel Heap และตรวจสอบข้อมูลของ Memory Allocator ผ่าน sysctl(KERN_MALLOCSTATS)

Process หนึ่งจะทำเครื่องหมาย Shared Memory Object เพื่อลบออกด้วย IPC_RMID ขณะที่ Helper Process อีกตัวพยายามเชื่อมต่อกับ Shared Memory Segment ใหม่ในจังหวะเวลาที่เหมาะสม

หากสามารถควบคุม Race Condition นี้ได้สำเร็จ จะทำให้เกิดการจัดสรรหน่วยความจำใน Kernel ที่มีความสับสนเกี่ยวกับขนาดของข้อมูล (Size Confusion)

จากนั้นนักวิจัยจะจัดวาง IP Socket Object ไว้ใกล้กับพื้นที่หน่วยความจำที่ถูกปล่อยคืนแล้ว และใช้ IP_MULTICAST_TTL เพื่อสร้าง Object ชนิด struct ip_moptions ที่ยังคงอยู่ในหน่วยความจำ

การเขียนข้อมูลแบบ Out-of-Bounds จะเปลี่ยนค่าตัวนับ Membership จำนวน 2 ค่าในโครงสร้างดังกล่าว

เมื่อปิด Socket ระบบจะเริ่มเปลี่ยนค่าตัวนับแบบ Atomic ซึ่งส่งผลต่อการ Map Page Table แบบอ้างอิงตัวเอง (Self-Referencing Page-Table Mapping) ของ OpenBSD

การเปลี่ยนแปลงนี้ทำให้ Mapping จาก User Space สามารถเข้าถึงได้ใน Supervisor Mode และเปิดทางให้ Exploit เขียนทับ Kernel Pointer ที่สามารถคาดการณ์ตำแหน่งได้

หลังจากนั้น Exploit จะรัน Code ภายใน Kernel ซ่อมแซม Pointer ที่ถูกเปลี่ยนแปลง และเปิด Shell ด้วยสิทธิ์ Root

การโจมตีรูปแบบนี้สามารถทำงานได้แม้ OpenBSD จะเปิดใช้งานระบบป้องกัน KARL, SMAP และ SMEP โดยไม่จำเป็นต้องอาศัยช่องโหว่ Information Leak แยกต่างหาก

KARL เป็นกลไกที่เปลี่ยนตำแหน่ง Address ของ Kernel Code และข้อมูลระหว่างการ Boot ระบบ อย่างไรก็ตาม Calif พบว่าบางส่วนของ Kernel Memory Allocator ยังคงสามารถคาดการณ์ตำแหน่งได้เมื่อทำงานบน Hardware เดิม

Object ที่ถูกสร้างขึ้นในช่วงต้นของการ Boot อาจถูกจัดวางในตำแหน่งหน่วยความจำที่คงที่ ทำให้ Exploit สามารถกำหนดเป้าหมายไปยัง Pointer ของ ioctl Handler สำหรับ lo0 และ enc0 ได้

OpenBSD ได้แก้ไขปัญหา Integer Overflow ผ่าน Errata 018 และแก้ไขช่องโหว่ Use-After-Free ที่เกี่ยวข้องกับ Reference Counting ผ่าน Errata 026

หน้า Errata ของ OpenBSD 7.9 ระบุว่า การแก้ไขทั้ง 2 รายการครอบคลุม Architecture ทั้งหมด โดยมี Binary Update ผ่าน syspatch สำหรับระบบ amd64, i386 และ arm64

ผู้ดูแลระบบควรติดตั้ง Patch ที่มีให้ทั้งหมด และ Reboot ระบบเพื่อให้ Kernel ที่ได้รับการแก้ไขเริ่มทำงาน

นอกจากนี้ Calif ยังเสนอแนวทางป้องกันเพิ่มเติมในวงกว้าง ได้แก่ การตรวจสอบ Safe Unlink สำหรับ Linked List การสุ่มตำแหน่งของ Page-Table Map และการทำให้ตำแหน่งการจัดสรรหน่วยความจำใน Kernel คาดการณ์ได้ยากขึ้น

ฟีเจอร์ของ Compiler เช่น การตรวจสอบขอบเขต Array (Array Bounds Checks) และการแยกพื้นที่การจัดสรรหน่วยความจำ (Allocation Isolation) อาจช่วยให้การใช้ประโยชน์จากช่องโหว่หน่วยความจำลักษณะเดียวกันทำได้ยากขึ้น

ปัจจุบัน Source Code ของ PoC ถูกเผยแพร่สู่สาธารณะแล้ว โดย Repository ของ Calif ระบุว่างานวิจัยนี้เป็นส่วนหนึ่งของโครงการวิจัยด้านความปลอดภัย MAD Bugs

กรณีนี้แสดงให้เห็นว่าการตัดสินใจออกแบบระบบในอดีตสามารถสร้างปัญหาที่ซ่อนอยู่ภายใน Code ของระบบปฏิบัติการที่ได้รับความไว้วางใจมาเป็นเวลาหลายทศวรรษ

ก่อนหน้านี้ มีการรายงานเกี่ยวกับช่องโหว่ Authentication ใน OpenBSD ที่มีอายุนาน 27 ปี รวมถึงช่องโหว่ Double-Free ในระบบ NFS ของ OpenBSD ด้วย

ที่มา: Cybersecuritynews