นักวิจัยจากทีม Google Project Zero เปิดเผยเมื่อไม่กี่วันก่อนในบล็อกโพสต์ว่า ได้ระบุช่องโหว่ (CVE-2021-29657) ใน KVM hypervisor (ไฮเปอร์ไวเซอร์ที่ใช้ Linux แบบโอเพ่นซอร์สที่รองรับการจำลองเสมือนที่เร่งด้วยฮาร์ดแวร์บน x86, ARM, PowerPC และ S / 390) ที่ ช่วยให้คุณหลีกเลี่ยงการแยกระบบแขก และรันโค้ดของคุณที่ด้านสภาพแวดล้อมโฮสต์
โพสต์ระบุว่าปัญหา แสดงรายการจากเคอร์เนล Linux 5.10-rc1 ถึง v5.12-rc6 นั่นคือ ครอบคลุมเฉพาะเมล็ด 5.10 และ 5.11 (สาขาการแจกแจงที่เสถียรส่วนใหญ่ไม่ได้รับผลกระทบจากปัญหา) ปัญหามีอยู่ในกลไก nested_svm_vmrun ซึ่งดำเนินการโดยใช้ส่วนขยาย AMD SVM (Secure Virtual Machine) และอนุญาตให้เปิดใช้ระบบแขกที่ซ้อนกัน
ในบล็อกโพสต์นี้ ฉันอธิบายช่องโหว่ในโค้ด KVM เฉพาะของ AMD และอภิปรายว่าจุดบกพร่องนี้สามารถเปลี่ยนเป็นการหลบหนีของเครื่องเสมือนโดยสมบูรณ์ได้อย่างไร เท่าที่ฉันรู้ นี่เป็นการเขียนสาธารณะครั้งแรกของ KVM guest-to-host breakout ที่ไม่ต้องอาศัยข้อบกพร่องในส่วนประกอบ user-space เช่น QEMU
ข้อบกพร่องที่กล่าวถึงได้รับมอบหมาย CVE-2021-29657 มีผลกับเคอร์เนลเวอร์ชัน v5.10-rc1 ถึง v5.12-rc6 และได้รับการแก้ไขในปลายเดือนมีนาคม พ.ศ. 2021 เนื่องจากบั๊กสามารถใช้ประโยชน์ได้เฉพาะใน v5.10 และถูกค้นพบในอีกประมาณ 5 เดือนต่อมา การปรับใช้ KVM ในโลกแห่งความเป็นจริงส่วนใหญ่จึงไม่ได้รับผลกระทบ ฉันยังคิดว่าปัญหาคือกรณีศึกษาที่น่าสนใจในงานที่จำเป็นในการสร้างการหลบหนีจากแขกสู่โฮสต์ที่มีเสถียรภาพจาก KVM และฉันหวังว่าบทความนี้จะทำให้กรณีที่การประนีประนอมไฮเปอร์ไวเซอร์ไม่ได้เป็นเพียงปัญหาเชิงทฤษฎี
นักวิจัยกล่าวว่าสำหรับการใช้งานฟังก์ชันนี้อย่างถูกต้อง ไฮเปอร์ไวเซอร์ต้องสกัดกั้นคำสั่ง SVM ทั้งหมด ทำงานบนระบบแขก จำลองพฤติกรรมและซิงโครไนซ์สถานะกับฮาร์ดแวร์ ซึ่งเป็นงานที่ค่อนข้างยาก
หลังจากวิเคราะห์การนำ KVM ไปใช้แล้ว นักวิจัยs พบข้อผิดพลาดทางตรรกะที่อนุญาตให้เนื้อหาของ MSR (การลงทะเบียนเฉพาะรุ่น) ของโฮสต์ ได้รับอิทธิพลจากระบบแขกซึ่งสามารถใช้เพื่อรันโค้ดที่ระดับโฮสต์
โดยเฉพาะอย่างยิ่ง การรันการดำเนินการ VMRUN จากเกสต์ระดับที่ซ้อนกันที่สอง (L2 ถูกเรียกใช้จากผู้เยี่ยมชมรายอื่น) นำไปสู่การเรียกครั้งที่สองไปยัง nested_svm_vmrun และทำให้โครงสร้าง svm-> nested.hsave เสียหาย ซึ่งซ้อนทับกับข้อมูลจาก vmcb จากระบบเกสต์ L2 .
ด้วยเหตุนี้ สถานการณ์จึงเกิดขึ้นที่ระดับผู้เยี่ยมชม L2 เป็นไปได้ที่จะเพิ่มหน่วยความจำในโครงสร้าง svm-> nested.msrpm ซึ่งเก็บบิต MSR แม้ว่าจะยังคงใช้งานอยู่ และเข้าถึง MSR ของโฮสต์ สิ่งแวดล้อม. .
ซึ่งหมายความว่า ตัวอย่างเช่น สามารถตรวจสอบหน่วยความจำของแขกได้โดยการทิ้งหน่วยความจำที่จัดสรรของกระบวนการพื้นที่ผู้ใช้ หรือจำกัดทรัพยากรสำหรับเวลา CPU และหน่วยความจำได้อย่างง่ายดาย
นอกจากนี้ KVM ยังสามารถถ่ายงานส่วนใหญ่ที่เกี่ยวข้องกับการจำลองอุปกรณ์ไปยังส่วนประกอบพื้นที่ผู้ใช้
ปัญหามีอยู่ในรหัสที่ใช้กับระบบที่มีโปรเซสเซอร์ AMD (โมดูล kvm-amd.ko) และไม่ปรากฏบนโปรเซสเซอร์ Intel
นอกอุปกรณ์ที่ไวต่อประสิทธิภาพสองสามตัวที่เกี่ยวข้องกับการจัดการอินเตอร์รัปต์ โค้ดระดับต่ำที่ซับซ้อนทั้งหมดสำหรับการจัดหาดิสก์เสมือน เครือข่าย หรือการเข้าถึง GPU สามารถปรับใช้ในพื้นที่ของผู้ใช้ได้
นักวิจัยนอกจากจะอธิบายปัญหาแล้ว พวกเขายังเตรียมต้นแบบการทำงานของการเอารัดเอาเปรียบ ซึ่งอนุญาตให้เรียกใช้รูทเชลล์จากสภาพแวดล้อมแบบแขกในสภาพแวดล้อมโฮสต์บนระบบที่มีโปรเซสเซอร์ AMD Epyc 7351P และเคอร์เนล Linux 5.10
เป็นที่สังเกตว่า นี่เป็นแขกรายแรกที่โฮสต์ช่องโหว่ใน KVM hypervisor ตัวเองไม่เกี่ยวข้องกับข้อบกพร่องในส่วนประกอบพื้นที่ผู้ใช้เช่น QEMU การแก้ไขได้รับการยอมรับในเคอร์เนลเมื่อปลายเดือนมีนาคม
ในที่สุด หากคุณสนใจที่จะทราบข้อมูลเพิ่มเติม เกี่ยวกับหมายเหตุคุณสามารถตรวจสอบรายละเอียดได้ ในลิงค์ต่อไปนี้.