Reptar
(lock.cmpxchg8b.com)การค้นพบปริศนาใน CPU
- หากคุณสนใจข้อผิดพลาดที่อาจเกิดขึ้นภายใน CPU สมัยใหม่ แนะนำให้อ่านต่อ
- หากคุณเคยเขียนแอสเซมบลี x86 มาก่อน คุณน่าจะคุ้นเคยกับคำสั่ง
rep movsbที่ใช้ย้ายข้อมูลในหน่วยความจำ - หลังจากตั้งค่าต้นทาง ปลายทาง ทิศทาง และจำนวนครั้งแล้ว โปรเซสเซอร์จะจัดการรายละเอียดทั้งหมดให้เอง
การตีความคำนำหน้าคำสั่ง
- หนึ่งในลักษณะเด่นของ x86 คือการถอดรหัสคำสั่งโดยทั่วไปมีความยืดหยุ่นสูงมาก
- แม้จะใช้คำนำหน้าที่ไม่มีความหมายหรือขัดแย้งกับคำนำหน้าอื่น ส่วนใหญ่ก็มักจะถูกเพิกเฉย
- คอมไพเลอร์สามารถใช้คำนำหน้าที่ไม่จำเป็นเพื่อให้ตรงกับขอบเขตการจัดแนวที่ต้องการได้
คำนำหน้า REX
- i386 มีรีจิสเตอร์อเนกประสงค์ 8 ตัว จึงสามารถระบุรีจิสเตอร์ได้ด้วย 3 บิต
- x86-64 เพิ่มรีจิสเตอร์อเนกประสงค์อีก 8 ตัว ทำให้ต้องใช้บิตมากขึ้น
- คำนำหน้า rex ช่วยให้คำสั่งถัดไปยืมบิตเพิ่มเติมได้ ทำให้สามารถเข้ารหัสรีจิสเตอร์อเนกประสงค์ทั้ง 16 ตัวได้
กฎการเข้ารหัส
- คำนำหน้า rex เพิ่มพื้นที่ที่ใช้ได้สำหรับการเข้ารหัสโอเปอแรนด์
- คำนำหน้าที่ไม่จำเป็นหรือซ้ำซ้อนใน x86 ส่วนใหญ่มักจะถูกเพิกเฉย
- คำสั่ง
rex.rxb rep movsbไม่มีโอเปอแรนด์ ดังนั้นบิต rex จึงไม่มีความหมาย และโปรเซสเซอร์จะเพิกเฉยต่อคำนำหน้า rex
Fast Short Repeat Move (FSRM)
- FSRM เป็นฟีเจอร์ใหม่ที่เปิดตัวใน Ice Lake เพื่อแก้ข้อด้อยของ ERMS
- ส่วนที่ยากของการย้ายสตริงอย่างมีประสิทธิภาพใน ERMS คือการจัดแนวบัฟเฟอร์และใช้การจัดเก็บที่กว้างที่สุดเท่าที่เป็นไปได้
- FSRM มีเป้าหมายเพื่อย้ายสตริงสั้นที่มีขนาดไม่เกิน 128 ไบต์ให้เร็วขึ้น
การค้นพบ
- ใช้เทคนิคการตรวจสอบโปรเซสเซอร์ที่เรียกว่า Oracle Serialization เพื่อตรวจสอบว่าโปรแกรมที่สร้างแบบสุ่มสองรูปแบบมีสถานะสุดท้ายเหมือนกันหรือไม่
- ในเดือนสิงหาคม ระบบตรวจสอบพบกรณีที่การเพิ่มคำนำหน้า rex.r ที่ซ้ำซ้อนเข้าไปในงาน
rep movsที่ปรับแต่งด้วย FSRM ทำให้เกิดผลลัพธ์ที่คาดเดาไม่ได้ - ยืนยันได้ว่าเมื่อหลายคอร์กระตุ้นบั๊กเดียวกันพร้อมกัน โปรเซสเซอร์จะรายงาน machine check exception และหยุดทำงาน
การทำซ้ำให้เกิดเหตุการณ์
- เผยแพร่ผลการวิจัยไว้ในคลังงานวิจัยด้านความปลอดภัย
- สามารถใช้เครื่องมือ
icebreakเพื่อทำซ้ำช่องโหว่นี้ได้ - ในระบบที่ไม่ได้รับผลกระทบ ไม่ควรมีเอาต์พุตใด ๆ แต่ในระบบที่ได้รับผลกระทบ จะมีการพิมพ์
.ทุกครั้งที่ทำซ้ำสำเร็จ
การวิเคราะห์
- วิธีการทำงานของไมโครโค้ดในระบบสมัยใหม่ยังเป็นความลับ จึงทำได้เพียงตั้งทฤษฎีจากสิ่งที่สังเกตเห็น
- คาดว่าบั๊กนี้ทำให้ฟรอนต์เอนด์คำนวณขนาดของคำสั่ง
movsbผิดพลาด ส่งผลให้รายการถัดไปใน ROB (reorder buffer) ถูกเชื่อมโยงกับแอดเดรสที่ไม่ถูกต้อง
คำถาม
- อาจมีคำถามว่าในสถานะ "glitch" ที่ไม่คาดคิดนี้สามารถทำอะไรได้บ้าง
- ทราบแล้วว่าสามารถทำให้สถานะของระบบเสียหายมากพอที่จะก่อให้เกิด machine check error ได้ และเธรดหนึ่งสามารถส่งผลต่อการทำงานของโปรเซสเซอร์พี่น้องใน SMT ได้
- เนื่องจากไม่มีวิธีดีบักการทำงานของ μop จึงยังไม่ทราบว่าสามารถยกระดับสิทธิ์ได้หรือไม่
วิธีแก้ไข
- Intel ได้เผยแพร่ไมโครโค้ดที่อัปเดตแล้วสำหรับโปรเซสเซอร์ที่ได้รับผลกระทบทั้งหมด
- ผู้ให้บริการระบบปฏิบัติการหรือ BIOS อาจมีการปล่อยอัปเดตนี้ออกมาแล้วเช่นกัน
ทางเลือก
- หากไม่สามารถอัปเดตได้ สามารถปิดการทำงานของ fast strings ผ่านรีจิสเตอร์เฉพาะรุ่น IA32_MISC_ENABLE ได้
- แต่สิ่งนี้จะทำให้ประสิทธิภาพลดลงอย่างมาก จึงควรใช้เฉพาะเมื่อจำเป็นจริง ๆ เท่านั้น
ความเห็นของ GN⁺
ประเด็นสำคัญที่สุดของบทความนี้คือการค้นพบสถานะ "glitch" ที่ไม่คาดคิดซึ่งอาจเกิดขึ้นใน CPU สมัยใหม่ และการแสดงให้เห็นว่าสิ่งนี้สามารถนำไปสู่ช่องโหว่ด้านความปลอดภัยได้ บทความนี้น่าจะน่าสนใจสำหรับวิศวกรซอฟต์แวร์ และช่วยเพิ่มความตระหนักถึงความซับซ้อนของ CPU และความเปราะบางของระบบ นอกจากนี้ยังช่วยให้เข้าใจว่าการค้นพบลักษณะนี้สามารถนำไปสู่ภัยคุกคามด้านความปลอดภัยจริงได้อย่างไร พร้อมทั้งตอกย้ำความสำคัญของการอัปเดตไมโครโค้ด
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
ทีมของ Konrad Magnusson พบปัญหาที่เกี่ยวข้องกับ mimalloc
หลายทีมวิจัยภายใน Google ค้นพบบั๊กนี้แยกกันโดยอิสระ
โปรเซสเซอร์รายงาน machine check exception และหยุดทำงาน
ทำให้ตระหนักว่าตนเองยังเข้าใจฮาร์ดแวร์ไม่มากพอ
ชวนให้นึกถึงการวิเคราะห์ปัญหาของ qemu ตอนเจอปัญหา repz ret
ทั้งพนักงานของ Intel เองและพนักงาน Google เป็นผู้รายงานปัญหา
สนุกกว่าบทความของ Google มาก
ตั้งข้อสงสัยว่าจะออกแบบ CPU ที่ไม่ทำงานตามลำดับและทำ speculative execution ได้โดยไม่มีปัญหาด้านความปลอดภัยหรือไม่
คำอธิบายเกี่ยวกับประกาศด้านความปลอดภัยของ Intel