Retbleed เป็นการโจมตีครั้งใหม่ต่อกลไกการดำเนินการเก็งกำไรของซีพียู Intel และ AMD

กลุ่มนักวิจัยจาก ETH Zurich ได้ระบุการโจมตีครั้งใหม่เกี่ยวกับกลไกการดำเนินการเก็งกำไรของการเปลี่ยนแปลงทางอ้อมใน CPU ซึ่งทำให้สามารถดึงข้อมูลจากหน่วยความจำเคอร์เนลหรือจัดการโจมตีระบบโฮสต์จากเครื่องเสมือน ช่องโหว่นี้มีชื่อรหัสว่า Retbleed (CVE-2022-29900, CVE-2022-29901) และมีลักษณะใกล้เคียงกับการโจมตี Spectre-v2 ความแตกต่างนั้นขึ้นอยู่กับองค์กรของการดำเนินการเก็งกำไรของโค้ดโดยพลการเมื่อประมวลผลคำสั่ง "ret" (return) ซึ่งจะดึงที่อยู่เพื่อข้ามจากสแต็กแทนที่จะข้ามทางอ้อมโดยใช้คำสั่ง "jmp" โดยโหลดที่อยู่จาก หน่วยความจำหรือการลงทะเบียน CPU

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

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

เพื่อป้องกันการโจมตีคลาส Spectre แบบคลาสสิกที่ใช้คำสั่งการกระโดดแบบมีเงื่อนไขและทางอ้อม ระบบปฏิบัติการส่วนใหญ่ใช้เทคนิค "retpoline" ซึ่งมีพื้นฐานมาจากการแทนที่การดำเนินการกระโดดทางอ้อมด้วยคำสั่ง "ret" ซึ่งโปรเซสเซอร์ใช้หน่วยทำนายสถานะสแต็กแยกต่างหาก . ไม่ได้ใช้บล็อกทำนายสาขา เมื่อ retpoline เปิดตัวในปี 2018 เชื่อกันว่าการจัดการที่อยู่แบบ Spectre นั้นไม่สามารถใช้งานได้จริงสำหรับการแตกแขนงแบบเก็งกำไรโดยใช้คำสั่ง "ret"

นักวิจัยที่พัฒนาวิธีการโจมตี Retbleed แสดงให้เห็นถึงความเป็นไปได้ในการสร้างเงื่อนไขทางสถาปัตยกรรมจุลภาคสำหรับการเริ่มต้นการเปลี่ยนแปลงแบบเก็งกำไรโดยใช้คำสั่ง "ret" และเผยแพร่เครื่องมือสำเร็จรูปเพื่อระบุลำดับของคำสั่ง (แกดเจ็ต) ที่เหมาะสมสำหรับการหาประโยชน์จากช่องโหว่ในเคอร์เนล Linux ซึ่งสภาวะดังกล่าวก็แสดงออกมาให้เห็น

ในระหว่างการวิจัย ได้มีการเตรียมช่องโหว่การทำงานที่ช่วยให้ระบบที่ใช้ CPU ของ Intel สามารถดึงข้อมูลที่กำหนดเองจากหน่วยความจำเคอร์เนลจากกระบวนการที่ไม่มีสิทธิพิเศษในพื้นที่ผู้ใช้ด้วยความเร็ว 219 ไบต์ต่อวินาทีและความแม่นยำ 98% บนโปรเซสเซอร์ AMD ประสิทธิภาพของช่องโหว่จะสูงกว่ามาก อัตราการรั่วไหลคือ 3.9 KB ต่อวินาที ตามตัวอย่างในทางปฏิบัติ เราจะแสดงวิธีใช้ช่องโหว่ที่เสนอเพื่อกำหนดเนื้อหาของไฟล์ /etc/shadow บนระบบที่ใช้ Intel CPU การโจมตีเพื่อกำหนดแฮชรหัสผ่านผู้ใช้รูทจะดำเนินการใน 28 นาที และบนระบบที่ใช้ CPU AMD - ใน 6 นาที

การโจมตีได้รับการยืนยันสำหรับโปรเซสเซอร์ Intel รุ่นที่ 6-8 ที่เปิดตัวก่อนไตรมาสที่ 3 ปี 2019 (รวมถึง Skylake) และโปรเซสเซอร์ AMD ที่ใช้สถาปัตยกรรมไมโคร Zen 1, Zen 1+ และ Zen 2 ที่เปิดตัวก่อนไตรมาสที่ 2021 ปี 3 ในโปรเซสเซอร์รุ่นใหม่เช่น AMD ZenXNUMX และ Intel Alder Lake รวมถึงโปรเซสเซอร์ ARM ปัญหาจะถูกบล็อกโดยกลไกการป้องกันที่มีอยู่ ตัวอย่างเช่น การใช้คำสั่ง IBRS (Indirect Branch Restricted Speculation) จะช่วยป้องกันการโจมตี

ชุดการเปลี่ยนแปลงที่เตรียมไว้สำหรับเคอร์เนล Linux และไฮเปอร์ไวเซอร์ Xen ซึ่งจะบล็อกปัญหาในซอฟต์แวร์บน CPU รุ่นเก่า แพทช์ที่นำเสนอสำหรับเคอร์เนล Linux เปลี่ยนแปลง 68 ไฟล์ เพิ่ม 1783 บรรทัด และลบ 387 บรรทัด น่าเสียดายที่การป้องกันนำไปสู่ต้นทุนค่าใช้จ่ายที่สำคัญ - ในข้อความที่ดำเนินการกับโปรเซสเซอร์ AMD และ Intel ประสิทธิภาพลดลงประมาณจาก 14% เป็น 39% จะดีกว่าถ้าใช้การป้องกันตามคำสั่ง IBRS ซึ่งมีอยู่ใน CPU Intel รุ่นใหม่ และได้รับการสนับสนุนตั้งแต่เคอร์เนล Linux 4.19 เป็นต้นไป

บนโปรเซสเซอร์ Intel การแทนที่ที่อยู่สำหรับการกระโดดทางอ้อมแบบเก็งกำไรนั้นดำเนินการด้วยคุณสมบัติที่ปรากฏขึ้นเมื่อมีการโอเวอร์โฟลว์เกิดขึ้นผ่านขอบเขตล่าง (อันเดอร์โฟลว์) ใน Return Stack Buffer เมื่อเงื่อนไขดังกล่าวเกิดขึ้น คำสั่ง "ret" จะเริ่มใช้ตรรกะการเลือกที่อยู่คล้ายกับที่ใช้สำหรับการข้ามทางอ้อมปกติ พบสถานที่มากกว่าหนึ่งพันแห่งในเคอร์เนล Linux ที่สร้างเงื่อนไขสำหรับการเริ่มต้นการไหลย้อนกลับและสามารถเข้าถึงได้ผ่านการเรียกของระบบ

บนโปรเซสเซอร์ AMD การดำเนินการเก็งกำไรของคำสั่ง "ret" จะดำเนินการโดยไม่มีการอ้างอิงถึงบัฟเฟอร์เฉพาะสแต็ก (Return Address Stack) และหน่วยการทำนายสาขาถือว่าคำสั่ง "ret" ไม่ใช่เป็นการส่งคืนการควบคุม แต่เป็นสาขาทางอ้อม และใช้ข้อมูลเพื่อคาดการณ์การเปลี่ยนแปลงทางอ้อม ภายใต้เงื่อนไขเหล่านี้ การดำเนินการ "ret" ใดๆ ก็ตามที่สามารถเข้าถึงได้ผ่านการเรียกของระบบสามารถนำมาใช้ประโยชน์ได้

นอกจากนี้ ยังมีการระบุปัญหาอื่นใน CPU ของ AMD (CVE-2022-23825, ความสับสนประเภทสาขา) ที่เกี่ยวข้องกับการใช้งานสาขาสมมติ - เงื่อนไขสำหรับการทำนายสาขาสามารถเกิดขึ้นได้แม้ว่าจะไม่มีคำสั่งสาขาที่จำเป็น ซึ่งช่วยให้มีอิทธิพลต่อบัฟเฟอร์การทำนายสาขา โดยไม่มีคำสั่ง " ret" คุณลักษณะนี้ทำให้การดำเนินการป้องกันมีความซับซ้อนอย่างมาก และต้องมีการทำความสะอาดบัฟเฟอร์การทำนายสาขามากขึ้น การเพิ่มการป้องกันเต็มรูปแบบให้กับเคอร์เนลคาดว่าจะเพิ่มค่าใช้จ่าย 209%

ที่มา: opennet.ru

เพิ่มความคิดเห็น