ต้นตอของบั๊กอยู่ในฟังก์ชัน vgic_its_invalidate_cache() ซึ่งเดินเข้าไปในแคชแปลที่อยู่ของแต่ละ ITS ด้วย xa_for_each() และเรียก vgic_put_irq() บนพอยน์เตอร์ที่วนอ่านเจอ แทนที่จะเป็นค่าที่ส่งคืนมาอย่างปลอดภัยจาก xa_erase() การทำงานในบริบทที่แตกต่างกันสามารถเข้าสู่ฟังก์ชันนี้ได้ภายใต้ล็อกที่แตกต่างกัน ดังนั้น Race นี้จึงสามารถถูกเรียกใช้ได้ทั้งหมดจากภายใน Guest VM โดยการผสมผสานคำสั่ง ITS, การเขียนค่าไปยัง GITS_CTLR และการเคลียร์ EnableLPIs ใน Redistributor
แม้ว่าช่องโหว่ที่ใช้หนีจาก Guest ไปยัง Host จะพบได้ยาก แต่มันคือบั๊กในไฮเปอร์ไวเซอร์ที่อันตรายที่สุด เพราะมันทำลายกำแพงการแยกส่วนที่ระบบคลาวด์คอมพิวติงต้องพึ่งพา ช่องโหว่หลบหนีจาก KVM ที่เคยเปิดเผยต่อสาธารณะก่อนหน้านี้มุ่งเป้าไปที่ x86 โดยมักจะผ่าน QEMU หรือโค้ดเฉพาะของ AMD ITScape เป็นช่องโหว่แรกที่สามารถใช้โจมตีได้จริง ซึ่งแสดงให้เห็นถึงการเจาะทะลวงจาก Guest VM บน arm64 ที่ไม่มีสิทธิ์พิเศษใด ๆ ผ่าน โค้ดภายในเคอร์เนล KVM โดยตรง โดยไม่ต้องพึ่งพาบั๊กในอีมูเลเตอร์ใน userspace เลย
สำหรับผู้ให้บริการคลาวด์ที่ใช้เครื่องแม่ข่าย Graviton, Ampere Altra หรือโฮสต์ KVM บน arm64 ใด ๆ ก็ตามที่รับเวิร์กโหลดแบบ Multi-Tenant Guest VM สามารถ:
ทีมความปลอดภัยส่วนใหญ่ให้คะแนนความรุนแรงของช่องโหว่นี้สูงกว่า CVSS 9.0 ซึ่งสะท้อนถึงระดับความร้ายแรงวิกฤต
โค้ดที่มีช่องโหว่อยู่ในขั้นตอนการล้างแคชแปลที่อยู่ของ LPI เมื่อเคอร์เนลต้องการล้างรายการในแคช มันจะวนอ่าน XArray ด้วย xa_for_each() และเรียก vgic_put_irq() เพื่อปล่อยจำนวนการอ้างอิงในแต่ละรายการ ปัญหาคือ xa_for_each() อาจคืนค่ารายการที่ถูกลบไปแล้วโดยการทำงานอื่นที่ขนานกัน เช่น คำสั่ง DISCARD ITS ที่ส่งมาจาก vCPU อีกตัวหนึ่ง ลูปการล้างแคชก็ยังคงลดการอ้างอิงของรายการที่ถูกลบไปแล้วนั้น ทำให้เกิดการปล่อยการอ้างอิงซ้ำซ้อน (Double-Put) และท้ายที่สุดคือ Use-After-Free
ก่อนหน้านี้มีช่องโหว่ในโค้ดส่วนเดียวกันคือ CVE-2024-26598 ซึ่งได้แก้ไขปัญหา UAF ในเส้นทางการเรียกดูแคชบางส่วน โดยการเพิ่มจำนวนอ้างอิงภายใน vgic_its_check_cache() ก่อนปล่อยล็อก แต่การแก้ไขนั้นไม่ได้ครอบคลุมถึงเส้นทางการล้างแคช ทำให้ยังคงสามารถใช้ประโยชน์จาก Race นี้ผ่านลำดับขั้นตอนอื่นได้
แพตช์จาก upstream ได้แก้ไข vgic_its_invalidate_cache() เพื่อให้ vgic_put_irq() ถูกเรียกใช้เฉพาะกับค่าที่ส่งคืนมาจาก xa_erase() เท่านั้น ไม่ใช่กับทุกรายการที่ iterator วนอ่านเจอ ข้อความของ commit ระบุว่า: "KVM: arm64: vgic-its: Drop the translation cache reference only for the erased entry"
เนื่องจาก xa_erase() จะทำการลบรายการและส่งคืนค่ารายการเก่าแบบ Atomically หรือส่งคืน NULL หากรายการนั้นหายไปแล้ว การแก้ไขนี้จึงรับประกันได้ว่าจำนวนการอ้างอิงจะถูกลดเพียงครั้งเดียว เป็นการปิดช่องโหว่ Double-Free แพตช์นี้ถูกผนวกเข้าในเคอร์เนล upstream ช่วงต้นเดือนมิถุนายน 2026 และถูกดึงเข้าไปในซีรีส์เสถียร 6.x อย่างรวดเร็วประมาณวันที่ 8-10 มิถุนายน 2026
ดิสทริบิวชันหลัก ๆ อย่าง Red Hat, SUSE และ Debian ก็ได้ออกแพตช์ย้อนหลัง (Backport) สำหรับสาขาเคอร์เนลที่พวกเขารองรับแล้ว
ฮยอนวู คิม เผยแพร่โค้ดโจมตีที่ใช้งานได้จริงบน GitHub ต่อสาธารณะ เมื่อประมาณวันที่ 9-10 มิถุนายน 2026 โดยใน Repository ประกอบด้วยซอร์สโค้ดฉบับเต็ม, คำแนะนำการทำซ้ำทีละขั้นตอน, และคำอธิบายทางเทคนิคของเทคนิคการโจมตี โค้ดนี้กระตุ้นให้เกิด Race โดยการประสานงานเธรดของ vCPU เพื่อส่งคำสั่ง DISCARD และค้นหาแคชแปลที่อยู่ของ LPI ไปพร้อม ๆ กัน ซึ่งจะทำให้เกิด Use-After-Free อย่างแม่นยำเพื่อรันโค้ดบนเครื่องโฮสต์
การที่ PoC ที่เชื่อถือได้ถูกเปิดเผยต่อสาธารณะ หมายความว่าสแกนเนอร์หาช่องโหว่ทั่วไปและนักโจมตีในโลกจริงสามารถนำช่องโหว่นี้ไปใช้เป็นอาวุธได้โดยง่ายดาย ทำให้ช่วงเวลาระหว่างการเปิดเผยข้อมูลและการโจมตีจริงสั้นลงอย่างมาก
หากคุณดำเนินการโครงสร้างพื้นฐาน KVM บน arm64 แบบ Multi-Tenant — ไม่ว่าจะเป็น AWS Graviton, Ampere Altra หรือแพลตฟอร์มอื่น ๆ ที่คล้ายคลึงกัน — จงถือว่านี่คือรอบการอัปเดตแพตช์ฉุกเฉินทันที
Comments
0 comments