Mayhem - การโจมตีความเสียหายของหน่วยความจำบิตเพื่อหลีกเลี่ยงการตรวจสอบสิทธิ์ sudo และ OpenSSH

นักวิจัยจาก Worcester Polytechnic Institute (USA) ได้เปิดตัวการโจมตี Mayhem รูปแบบใหม่ที่ใช้เทคนิคการบิดเบือนบิตหน่วยความจำเข้าถึงโดยสุ่มแบบไดนามิกของ Rowhammer เพื่อเปลี่ยนค่าของตัวแปรสแต็กที่ใช้เป็นแฟล็กในโปรแกรมเพื่อตัดสินใจว่าการตรวจสอบสิทธิ์และการตรวจสอบความปลอดภัยมีหรือไม่ ผ่าน. ตัวอย่างการโจมตีที่ใช้งานได้จริงแสดงให้เห็นเพื่อหลีกเลี่ยงการตรวจสอบสิทธิ์ใน SUDO, OpenSSH และ MySQL รวมถึงการเปลี่ยนแปลงผลลัพธ์ของการตรวจสอบที่เกี่ยวข้องกับความปลอดภัยในไลบรารี OpenSSL

การโจมตีนี้สามารถนำไปใช้กับแอพพลิเคชั่นที่ใช้การตรวจสอบเพื่อเปรียบเทียบค่าที่แตกต่างจากศูนย์ ตัวอย่างโค้ดที่มีช่องโหว่: int auth = 0; ... // รหัสยืนยันที่เปลี่ยนค่าการรับรองความถูกต้องในกรณีที่การรับรองความถูกต้องสำเร็จถ้า (auth != 0) ส่งคืน AUTH_SUCCESS; มิฉะนั้นส่งคืน AUTH_FAILURE;

ในบริบทของตัวอย่างนี้ สำหรับการโจมตีที่ประสบความสำเร็จ ก็เพียงพอที่จะสร้างความเสียหายให้กับบิตใดๆ ในหน่วยความจำที่เกี่ยวข้องกับตัวแปรการรับรองความถูกต้องแบบ 32 บิตบนสแต็ก หากบิตใดๆ ในตัวแปรเสียหาย ค่าจะไม่เป็นศูนย์อีกต่อไป และผู้ดำเนินการแบบมีเงื่อนไขจะกำหนดว่าการรับรองความถูกต้องเสร็จสมบูรณ์แล้ว รูปแบบการตรวจสอบความถูกต้องดังกล่าวพบได้ทั่วไปในแอปพลิเคชัน และพบได้ เช่น ใน SUDO, OpenSSH, MySQL และ OpenSSL

Mayhem - หน่วยความจำบิตโจมตีเพื่อเลี่ยงผ่านการตรวจสอบ sudo และ OpenSSH

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

Mayhem - หน่วยความจำบิตโจมตีเพื่อเลี่ยงผ่านการตรวจสอบ sudo และ OpenSSH

เพื่อบิดเบือนบิต จะใช้การแก้ไขอย่างใดอย่างหนึ่งของการโจมตีคลาส RowHammer เนื่องจากหน่วยความจำ DRAM เป็นอาร์เรย์สองมิติของเซลล์ ซึ่งแต่ละเซลล์ประกอบด้วยตัวเก็บประจุและทรานซิสเตอร์ การอ่านอย่างต่อเนื่องในพื้นที่หน่วยความจำเดียวกันส่งผลให้เกิดความผันผวนของแรงดันไฟฟ้าและความผิดปกติที่ทำให้สูญเสียประจุเล็กน้อยในเซลล์ข้างเคียง หากความเข้มในการอ่านสูงเซลล์ข้างเคียงอาจสูญเสียประจุจำนวนมากเพียงพอและวงจรการสร้างใหม่ครั้งต่อไปจะไม่มีเวลาในการฟื้นฟูสถานะดั้งเดิมซึ่งจะนำไปสู่การเปลี่ยนแปลงค่าของข้อมูลที่เก็บไว้ในเซลล์ . เพื่อป้องกัน RowHammer ผู้ผลิตชิปได้เพิ่มกลไก TRR (Target Row Refresh) ซึ่งจะบล็อกความเสียหายของเซลล์ในกรณีพิเศษ แต่ไม่ได้ป้องกันรูปแบบการโจมตีที่เป็นไปได้ทั้งหมด

เพื่อป้องกันการโจมตี Mayhem ขอแนะนำให้ใช้ในการเปรียบเทียบ ไม่ใช่การประเมินความแตกต่างจากศูนย์หรือความบังเอิญกับสิ่งหนึ่ง แต่เป็นการตรวจสอบการจับคู่โดยใช้ค่าเริ่มต้นแบบสุ่มกับออคเต็ตที่ไม่ใช่ศูนย์ ในกรณีนี้ ในการตั้งค่าตัวแปรที่ต้องการ จำเป็นต้องบิดเบือนบิตที่มีนัยสำคัญอย่างแม่นยำ ซึ่งไม่สมจริง ตรงกันข้ามกับการบิดเบือนบิตเดียว ตัวอย่างโค้ดที่ไม่สามารถโจมตีได้: int auth = 0xbe406d1a; ... // รหัสยืนยันที่ตั้งค่าการรับรองความถูกต้องเป็น 0x23ab8701 ในกรณีที่การรับรองความถูกต้องสำเร็จถ้า (auth == 0x23ab8701) ส่งคืน AUTH_SUCCESS; มิฉะนั้นส่งคืน AUTH_FAILURE;

นักพัฒนา sudo ใช้วิธีการป้องกันที่ระบุแล้ว และรวมอยู่ในรุ่น 1.9.15 เพื่อเป็นการแก้ไขช่องโหว่ CVE-2023-42465 พวกเขาวางแผนที่จะเผยแพร่ต้นแบบของโค้ดสำหรับดำเนินการโจมตีหลังจากทำการแก้ไขโครงการหลักที่มีช่องโหว่แล้ว

ที่มา: opennet.ru

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