ช่องโหว่ใน KVM อนุญาตให้มีการเรียกใช้โค้ดนอกระบบแขกบนโปรเซสเซอร์ AMD

นักวิจัยจากทีม 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 การแก้ไขได้รับการยอมรับในเคอร์เนลเมื่อปลายเดือนมีนาคม

ในที่สุด หากคุณสนใจที่จะทราบข้อมูลเพิ่มเติม เกี่ยวกับหมายเหตุคุณสามารถตรวจสอบรายละเอียดได้ ในลิงค์ต่อไปนี้.


แสดงความคิดเห็นของคุณ

อีเมล์ของคุณจะไม่ถูกเผยแพร่ ช่องที่ต้องการถูกทำเครื่องหมายด้วย *

*

*

  1. ผู้รับผิดชอบข้อมูล: Miguel ÁngelGatón
  2. วัตถุประสงค์ของข้อมูล: ควบคุมสแปมการจัดการความคิดเห็น
  3. ถูกต้องตามกฎหมาย: ความยินยอมของคุณ
  4. การสื่อสารข้อมูล: ข้อมูลจะไม่ถูกสื่อสารไปยังบุคคลที่สามยกเว้นตามข้อผูกพันทางกฎหมาย
  5. การจัดเก็บข้อมูล: ฐานข้อมูลที่โฮสต์โดย Occentus Networks (EU)
  6. สิทธิ์: คุณสามารถ จำกัด กู้คืนและลบข้อมูลของคุณได้ตลอดเวลา