ช่องโหว่ในเคอร์เนล Linux ที่ทำให้ไฟล์แบบอ่านอย่างเดียวเสียหาย

พบช่องโหว่ในเคอร์เนล Linux (CVE-2022-0847) ที่อนุญาตให้เขียนทับเนื้อหาของแคชเพจสำหรับไฟล์ใดๆ รวมถึงไฟล์ที่อยู่ในโหมดอ่านอย่างเดียว เปิดด้วยแฟล็ก O_RDONLY หรืออยู่ในระบบไฟล์ ติดตั้งในโหมดอ่านอย่างเดียว ในทางปฏิบัติ ช่องโหว่นี้สามารถใช้เพื่อแทรกโค้ดลงในกระบวนการที่กำหนดเองหรือทำให้ข้อมูลเสียหายในไฟล์ที่เปิดอยู่ ตัวอย่างเช่น คุณสามารถเปลี่ยนเนื้อหาของไฟล์ที่ได้รับอนุญาต_keys สำหรับกระบวนการ sshd มีต้นแบบของการใช้ประโยชน์สำหรับการทดสอบ

ปัญหานี้มีชื่อรหัสว่า Dirty Pipe ซึ่งคล้ายกับช่องโหว่ร้ายแรง Dirty COW ที่ระบุในปี 2016 สังเกตว่าในแง่ของระดับอันตราย Dirty Pipe อยู่ในระดับเดียวกับ Dirty COW แต่ใช้งานง่ายกว่ามาก ช่องโหว่ถูกระบุในระหว่างการวิเคราะห์ข้อร้องเรียนเกี่ยวกับความเสียหายเป็นระยะของไฟล์ที่ดาวน์โหลดผ่านเครือข่ายในระบบที่ดาวน์โหลดไฟล์เก็บถาวรที่บีบอัดจากเซิร์ฟเวอร์บันทึก (ความเสียหาย 37 ครั้งใน 3 เดือนบนระบบที่โหลด) ซึ่งการเตรียมการที่ใช้การดำเนินการ splice() และไปป์ที่ไม่มีชื่อ

ช่องโหว่นี้ปรากฏขึ้นโดยเริ่มจากเคอร์เนล Linux 5.8 ซึ่งเปิดตัวในเดือนสิงหาคม 2020 เช่น มีอยู่ใน Debian 11 แต่ไม่ส่งผลกระทบต่อเคอร์เนลพื้นฐานใน Ubuntu 20.04 LTS เคอร์เนล RHEL 8.x และ openSUSE/SUSE 15 นั้นมีพื้นฐานมาจากแบรนช์เก่า แต่เป็นไปได้ว่าการเปลี่ยนแปลงที่ทำให้เกิดปัญหานั้นจะถูกส่งกลับเข้าไปที่เคอร์เนลเหล่านั้น (ยังไม่มีข้อมูลที่แน่นอน) คุณสามารถติดตามการเผยแพร่การอัปเดตแพ็คเกจในการแจกจ่ายในหน้าเหล่านี้: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux มีการเสนอการแก้ไขช่องโหว่ในรุ่น 5.16.11, 5.15.25 และ 5.10.102 การแก้ไขยังรวมอยู่ในเคอร์เนลที่ใช้ในแพลตฟอร์ม Android ด้วย

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

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

การดำเนินการเกิดขึ้นที่การสร้างช่องที่ไม่มีชื่อและกรอกข้อมูลตามอำเภอใจเพื่อให้แน่ใจว่าการตั้งค่าสถานะ PIPE_BUF_FLAG_CAN_MERGE ได้รับการตั้งค่าในโครงสร้างวงแหวนทั้งหมดที่เกี่ยวข้อง ถัดไป ข้อมูลจะถูกอ่านจากช่องสัญญาณ แต่แฟล็กยังคงตั้งค่าไว้ในอินสแตนซ์ทั้งหมดของโครงสร้าง pipe_buffer ในโครงสร้างวงแหวน pipe_inode_info จากนั้นจะมีการเรียก splice() เพื่ออ่านข้อมูลจากไฟล์เป้าหมายไปยังไปป์ที่ไม่มีชื่อ โดยเริ่มต้นที่ออฟเซ็ตที่ต้องการ เมื่อเขียนข้อมูลไปยังไปป์ที่ไม่มีชื่อนี้ เนื่องจากการตั้งค่าสถานะ PIPE_BUF_FLAG_CAN_MERGE ข้อมูลในแคชของเพจจะถูกเขียนทับแทนการสร้างอินสแตนซ์ใหม่ของโครงสร้าง pipe_buffer

ที่มา: opennet.ru

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