สภาพการแข่งขันในตัวรวบรวมขยะเคอร์เนล Linux ที่อาจนำไปสู่การยกระดับสิทธิ์

Jann Horn จากทีมงาน Google Project Zero ซึ่งครั้งหนึ่งเคยระบุช่องโหว่ Spectre และ Meltdown ได้เผยแพร่เทคนิคในการหาประโยชน์จากช่องโหว่ (CVE-2021-4083) ในตัวรวบรวมขยะเคอร์เนล Linux ช่องโหว่นี้เกิดจากสภาวะการแข่งขันเมื่อทำการล้างตัวอธิบายไฟล์บนซ็อกเก็ตยูนิกซ์ และอาจอนุญาตให้ผู้ใช้ที่ไม่มีสิทธิ์ในพื้นที่สามารถรันโค้ดของตนในระดับเคอร์เนลได้

ปัญหานี้เป็นที่น่าสนใจเนื่องจากกรอบเวลาที่สภาพการแข่งขันเกิดขึ้นนั้นน้อยเกินไปที่จะสร้างการหาประโยชน์ที่แท้จริง แต่ผู้เขียนการศึกษาแสดงให้เห็นว่าแม้แต่ช่องโหว่ที่น่าสงสัยในตอนแรกก็สามารถกลายเป็นแหล่งที่มาของการโจมตีจริงได้หากผู้สร้างช่องโหว่มี ทักษะและเวลาที่จำเป็น Yann Horn แสดงให้เห็นว่า ด้วยความช่วยเหลือจากการปรับเปลี่ยนลวดลาย คุณสามารถลดสภาวะการแข่งขันที่เกิดขึ้นเมื่อเรียกใช้ฟังก์ชัน close() และ fget() ไปพร้อมๆ กันจนกลายเป็นช่องโหว่แบบใช้แล้วทิ้งที่ไร้ประโยชน์อย่างเต็มรูปแบบ และบรรลุการเข้าถึงข้อมูลที่ว่างอยู่แล้ว โครงสร้างภายในเคอร์เนล

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

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

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

เทคนิคในการใช้ประโยชน์จากช่องโหว่ถูกเปิดเผยหลังจากระยะเวลาไม่เปิดเผย 90 วัน ปัญหาปรากฏขึ้นตั้งแต่เคอร์เนล 2.6.32 และได้รับการแก้ไขเมื่อต้นเดือนธันวาคม การแก้ไขนี้รวมอยู่ในเคอร์เนล 5.16 และยังถูกถ่ายโอนไปยังสาขา LTS ของเคอร์เนลและแพ็คเกจเคอร์เนลที่ให้มาในการแจกแจง เป็นที่น่าสังเกตว่ามีการระบุช่องโหว่ในระหว่างการวิเคราะห์ปัญหาที่คล้ายกัน CVE-2021-0920 ซึ่งปรากฏในตัวรวบรวมขยะเมื่อประมวลผลการตั้งค่าสถานะ MSG_PEEK

ที่มา: opennet.ru

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