
พบช่องโหว่ double-free ที่มีระดับความรุนแรงสูงใน NFT (netfilter) subsystem ของ Linux kernel โดยเฉพาะในโมดูลที่เรียกว่า pipapo set
ช่องโหว่ด้านความปลอดภัยระดับ Critical นี้ อาจทำให้ผู้โจมตีที่ไม่มีสิทธิ์ในระบบ สามารถยกระดับสิทธิ์ของตนเองขึ้นมาเพื่อควบคุมเครื่องได้ (local privilege escalation) โดยการสร้างความเสียหายให้กับหน่วยความจำของ kernel ผ่าน netlink messages ที่ถูกสร้างขึ้นมาเป็นพิเศษ
ช่องโหว่ Double Free ใน Linux Kernel
ช่องโหว่ดังกล่าวอยู่ในฟังก์ชัน nft_add_set_elem ซึ่งเป็นส่วนหนึ่งของไฟล์ net/netfilter/nf_tables_api.c โดยมีตัวแปรบน stack ที่ยังไม่ได้ถูกกำหนดค่าที่ชื่อ struct nft_set_elem elem ซึ่งเป็นต้นเหตุของช่องโหว่ดังกล่าว
จากรายงานของ SSD advisory ระบุว่า ปัญหานี้จะเกิดขึ้นเมื่อตัวเลือกการกำหนดค่า CONFIG_INIT_STACK_ALL_ZERO ถูกปิดการใช้งาน ส่งผลให้มีข้อมูลที่ยังไม่ได้กำหนดค่าค้างอยู่ใน stack และทำให้ element key เกิดการปะปนในระหว่างการประมวลผล
ในการทำงานของ code path ที่มีช่องโหว่นี้ ระบบจะประมวลผลข้อมูลจากผู้ใช้ที่ส่งผ่าน NFTA_SET_ELEM_KEY แต่จะกำหนดค่าในหน่วยความจำเท่ากับความยาวของ key (klen) เท่านั้น ทำให้ข้อมูลที่เหลือใน buffer จะยังคงเป็นข้อมูลเก่าที่ตกค้างอยู่บน stack ที่ไม่ได้ถูกล้างค่า
โดยข้อมูลในหน่วยความจำที่ไม่ได้ถูกล้างค่านี้ มักจะมี pointer หรือค่าต่าง ๆ จากการเรียกใช้ฟังก์ชันของ kernel ก่อนหน้า ซึ่งอาจทำให้เกิดสภาวะ double-free ได้ เมื่อระบบ pipapo set พยายามจะลบ element เหล่านั้นออกจากชุดข้อมูล

กระบวนการโจมตีช่องโหว่ดังกล่าว ใช้เทคนิคขั้นสูงในการควบคุมหน่วยความจำ (heap exploitation) เพื่อหลบเลี่ยงระบบป้องกัน KASLR (Kernel Address Space Layout Randomization) ได้ และสร้างสิทธิ์ในการเขียนข้อมูลไปยังตำแหน่งใดก็ได้ตามต้องการ
ผู้โจมตีสามารถใช้การโจมตีจากช่องโหว่นี้ได้ ตามขั้นตอนดังต่อไปนี้ :
- Initial Setup : การสร้าง netfilter table และ pipapo set พร้อมกำหนดค่า field แบบเฉพาะเจาะจง เพื่อทำให้เกิด uninitialized padding bytes
- First Free : การลบ element ออกจาก set จะทำให้เกิดการคืนหน่วยความจำของ elem->priv เป็นครั้งแรก แต่ตัว element ยังคงถูกอ้างอิงใน pipapo set
- Second Free : การลบ set ทั้งหมดทิ้ง จะทำให้เกิดการคืนหน่วยความจำซ้ำของพื้นที่เดียวกัน ส่งผลให้เกิด double-free
ช่องโหว่ดังกล่าวส่งผลกระทบต่อ Linux kernel ตั้งแต่เวอร์ชัน 5.6-rc1 ถึง 6.13-rc3 และต้องอาศัยการกำหนดค่า config ของ kernel แบบเฉพาะเจาะจง ได้แก่ CONFIG_NETFILTER=y, CONFIG_NF_TABLES=y, CONFIG_USER_NS=y และที่สำคัญที่สุดคือต้องตั้งค่า CONFIG_INIT_STACK_ALL_ZERO=n
การโจมตีดังกล่าวใช้ประโยชน์จากข้อเท็จจริงที่ว่าโครงสร้าง elem->priv สามารถมีขนาดได้ตั้งแต่ 32 ถึง 256 bytes ซึ่งทำให้ผู้โจมตีสามารถกำหนดเป้าหมายไปยัง kmalloc cache ที่เหมาะสมสำหรับการจัดการหน่วยความจำที่ต้องการได้
มาตรการลดความเสี่ยง
ช่องโหว่ดังกล่าวก่อให้เกิดความเสี่ยงด้านความปลอดภัยที่สำคัญอย่างยิ่ง เนื่องจากเป็นช่องโหว่ที่ผู้โจมตีสามารถใช้เทคนิค double-free ได้อย่างมีเสถียรภาพ เพื่อยกระดับสิทธิ์ของผู้โจมตีภายในเครื่องได้
การโจมตีครั้งนี้มีความเสถียรภาพสูง เนื่องจากใช้เทคนิค brute-force เพื่อค้นหาความยาวของ key ที่เหมาะสมที่สุดในการทำให้เกิดช่องโหว่บนการตั้งค่าของ kernel แต่ละแบบ
วิธีการป้องกันที่มีประสิทธิภาพคือ การเปิดใช้งานตัวเลือก CONFIG_INIT_STACK_ALL_ZERO ในตอนที่ kernel compilation ซึ่งจะทำให้ตัวแปรที่อยู่บน stack ถูกกำหนดค่าเริ่มต้นเป็นศูนย์ และช่วยป้องกันไม่ให้เกิดการปะปนของข้อมูลที่ยังไม่ได้กำหนดค่า
นอกจากนี้ การติดตั้งแพตช์ล่าสุดจากทีมพัฒนา netfilter ก็เป็นการแก้ไขที่ต้นตอของปัญหาโดยตรง ผ่านการกำหนดค่าเริ่มต้นให้กับโครงสร้าง elem อย่างถูกต้อง
ช่องโหว่ดังกล่าวมีลักษณะคล้ายกับช่องโหว่ CVE-2023-4004 ซึ่งแสดงให้เห็นถึงปัญหาที่ซ้ำซากในเรื่องการจัดการหน่วยความจำของ kernel โดยเน้นย้ำถึงความสำคัญของการกำหนดค่าเริ่มต้นให้กับตัวแปรอย่างถูกต้อง และการมีกลไกป้องกัน stack อย่างครอบคลุมในกระบวนการพัฒนา kernel
ที่มา : cybersecuritynews

You must be logged in to post a comment.