Kernel ส่วนประกอบสำคัญในระบบปฏิบัติการ Linux พบช่องโหว่ Buffer Overflow ระดับความรุนแรงสูง ทำให้ข้อมูลสูญหาย ร้ายแรงอาจถึงขั้นระบบหยุดทำงาน

เมื่อวันที่ 7 สิงหาคม 2564 MITRE ได้ออกประกาศถึงช่องโหว่ Buffer Overflow บน Linux Kernel (CVE-2021-38160) โดยมีระดับความรุนแรง CVSSv3 Score อยู่ที่ 6.0 คะแนน ซึ่งถือว่าเป็นความรุนแรงระดับสูง (High)

โดยช่องโหว่ CVE-2021-38160 นี้เกิดขึ้นบน Linux ที่ใช้งาน Kernel ก่อนเวอร์ชัน 5.13.4 โดย Path และไฟล์ที่เป็นสาเหตุของปัญหาคือ Drivers/Char/Virtio_Console.C เมื่อมีการใส่ค่า Input เกินขนาดของ Buffer จะส่งผลให้เกิด Memory Corruption

ผลกระทบ

เมื่อเกิด Memory Corruption จะทำให้ข้อมูลสูญหายหรือถึงขั้นทำให้ระบบหยุดการทำงาน

ผลิตภัณฑ์ที่ส่งผลกระทบ

Linux ที่ใช้งาน Kernel เวอร์ชันก่อนหน้า 5.13.4 ทั้งหมด

วิธีการป้องกัน

อัปเกรด Kernel ให้เป็นเวอร์ชันที่สูงกว่า 5.13.4 ซึ่งมาการแก้ไขช่องโหว่นี้แล้ว โดยสามารถดาวน์โหลดได้ที่ cdn.kernel.org

 

Buffer-Overflow Attacks เกิดขี้นเมื่อมีการเขียนข้อมูลเกินขอบเขตที่กำหนด ผลที่เกิดขึ้นคือข้อมูลที่เขียนล้นเข้าไปทับข้อมูลอื่นที่อยู่ในระบบ จึงเกิดความเป็นไปได้ตั้งแต่ ทำให้โปรแกรมประมวลผลข้อมูลผิดพลาด Segmentation False หรืออาจจะร้ายแรงถึงขั้นเปลี่ยนการทำงานของระบบให้ประมวลผล Code ใด ๆ ก็ได้ตามที่ Attackers ต้องการ

 

 

Buffer-Overflow Attacks แบบเบื้องต้น

โปรแกรมที่เขียนขึ้นจากภาษา C ถ้าเกิดเหตุการณ์ Overflow จะทำให้การทำงานบางอย่างผิดไปจากเดิม ตัวอย่างเช่น ตัวแปร age ซึ่งเป็นตัวแปรที่เก็บข้อมูลชนิดตัวเลขเมื่อมีการใส่ค่าจนทำให้เกิด Overflow เมื่อทำการประมวลผล ผลลัพธ์ที่ได้ก็จะมีค่าที่ไม่ถูกต้อง จะพบว่าเลขอายุเปลี่ยนจาก 15 เป็น 49 ดังภาพ

Buffer Overflow

Buffer Overflow จะพบว่าเลขอายุเปลี่ยนจาก 15 เป็น 49

สามารถอธิบายได้ดังนี้

    1. คำสั่ง gets(name) ซึ่งรับข้อมูล input มีขนาด 10 ตัว ได้แก่ “P01”และ 1 terminator เก็บไว้ในตัวแปร name แต่ตัวแปร name นั้นกำหนดขนาดเพียง 8 ตัวอักษรเท่านั้น
    2. ทำให้ข้อมูลที่เกินมา 2 ตัวอักษร ทำให้เกิด Overflow ไปทับพื้นที่ในหน่วยความจำของตัวแปร age ผลที่ตามมาคือตัวแปร age ซึ่งเดิมเก็บตัวเลข 15 ถูกเปลี่ยนเป็นเก็บตัวอักษร ‘1’ แทน
    3. เมื่อตัวแปร age ถูกอ้างอิงอีกครั้ง ตัวอักษร ‘1’ จึงถูกอ้างอิงเป็นตัวเลขและเปลี่ยนค่า จาก 15 เป็น 49 ตามมาตรฐานรหัส ASCII

 

Kernel คืออะไร?

Kernel เป็นส่วนประกอบหลักของระบบปฏิบัติการ Linux ซึ่งคอยดูแลบริหารทรัพยากรของระบบ และทำหน้าที่เชื่อมการทำงานระหว่าง Software และ Hardware เข้าด้วยกันเพื่อให้ทำงานได้อย่างถูกต้อง โดยเริ่มทำงานตั้งแต่ Boot Server ตลอดจนการ Start/Stop Program และ Input/Output จาก Software ทั้งหมด

ส่วนที่เป็น Code สำคัญของ Kernel จะถูกโหลดเก็บไว้ในหน่วยความจำแยกที่จองไว้ให้โดยเฉพาะ เพื่อป้องกันการเขียนทับจากแอพพลิเคชั่นหรือซอฟต์แวร์ส่วนอื่นๆ ขณะที่เครื่องคอมพิวเตอร์ทำงาน

ระบบและทรัพยากร ทำงานร่วมกับ Kernel

ระบบและทรัพยากร ทำงานร่วมกับ Kernel

Central processing unit หรือ CPU

ทำหน้าที่ควบคุมจัดการโปรแกรมที่กำลังทำงาน หน้าที่ของ Kernel จะรับผิดชอบในการตัดสินใจว่าโปรแกรม แต่ละตัว จะจองหน่วยประมวลผล Core/CPU ไหน และจำนวนของ Core/CPU เท่าไหร่ในการประมวลผล

Random-access memory (RAM)

ใช้ในการเก็บข้อมูลของโปรแกรมที่มีการเรียกใช้งาน หน้าที่ของ Kernel จะรับผิดชอบในการตัดสินใจว่าหน่วยความจำใดที่แต่ละกระบวนการสามารถใช้ได้ และกำหนดว่าจะทำอย่างไรเมื่อมีหน่วยความจำไม่เพียงพอ

Input/Output (I/O) devices

I/O ของแต่ละอุปกรณ์ รวมถึงอุปกรณ์ต่อพ่วง เช่น Keyboard, Mouse, Disk, Printer, USB, Network Adapter หรือ จอ Monitor เป็นต้น Kernel จะเป็นตัวกลางในการควบคุมสื่อสารระหว่าง Software และ Hardware ให้แต่ละคำสั่งจาก Software ส่งไปยังอุปกรณ์ที่เหมาะสม ด้วยวิธีที่สะดวก

 

ประเภทของ Kernel
Monolithic Kernels

เกิดขึ้นในยุดเริ่มแรกของ Kernel โดยระบบพื้นฐานทั้งหมด เช่น การจัดการ Process และ Memory จะถูกรวมอยู่ใน Module เดียวกัน ซึ่งส่งผลทำให้ Kernel มีขนาดใหญ่ และ ยากต่อการดูแล

ผลิตภัณฑ์ออกแบบตาม monolithic

– Linux

– MS-DOS

– Microsoft Windows 9x Series

– Agnix

 

Micro Kernels

จากปัญหาในเรื่องขนาดของ Kernel ที่โตขึ้นเรื่อยๆ ของ Monolithic ทำให้มีการแยกส่วนของระบบพื้นฐาน เช่น Driver และ Protocol Stack รวมถึง File system ออกมาประมวลผลข้างนอก ทำให้ลดขนาดของ Kernel ลง เพิ่มความปลอดและเสถียรภาพให้กับระบบปฏิบัติการมากขึ้น

ผลิตภัณฑ์ออกแบบตาม microkernel

– AIX

– AmigaOS

– Amoeba

– Android OS

– Chorus microkernel

– EROS

– Haiku

 

Hybrid Kernels

เป็นการการรวมกันระหว่าง Monolithic Kernel กับ Micro Kernel เข้าด้วยกันทำให้สามารถที่จะประมวลผลแยกส่วนสำหรับโปรแกรมที่ไม่ใช้ส่วนของระบบปฏิบัติการหลัก ทำให้การทำงานมีความเร็ว ความปลอดภัยมากยิ่งขึ้น

ผลิตภัณฑ์ออกแบบตาม Hybrid kernels

– Microsoft Windows NT 3.1, NT 3.5, NT 3.51, NT 4.0, 2000, XP, Vista, 7, 8, 8.1 and 10

– macOS

 

เอกสารอ้างอิง

https://vuldb.com/?id.180295

https://en.wikipedia.org/wiki/Memory_corruption

https://saixiii.com/what-is-kernel/

https://www.cpe.ku.ac.th/~paruj/204554/memory_safety.pdf

https://en.wikipedia.org/wiki/Kernel_(operating_system)