ไม่กี่วันที่ผ่านมา ได้ข่าวว่ามีการระบุจุดอ่อน (จัดหมวดหมู่ไว้แล้วภายใต้ CVE-2022-0185) และn บริบทของระบบไฟล์ API จัดให้โดย เคอร์เนลลินุกซ์ ซึ่งสามารถอนุญาตให้ผู้ใช้ในพื้นที่ได้รับสิทธิ์รูทบนระบบ
เป็นที่กล่าวขวัญกันว่า ปัญหาคือผู้ใช้ที่ไม่มีสิทธิ์จะได้รับสิทธิ์ดังกล่าวในคอนเทนเนอร์แยก หากเปิดใช้งานการรองรับเนมสเปซผู้ใช้บนระบบ
ตัวอย่างเช่น เนมสเปซผู้ใช้ถูกเปิดใช้งานโดยค่าเริ่มต้นบน Ubuntu และ Fedora แต่ไม่ได้เปิดใช้งานบน Debian และ RHEL (เว้นแต่จะใช้แพลตฟอร์มการแยกคอนเทนเนอร์) นอกจากการเพิ่มระดับสิทธิ์แล้ว ช่องโหว่ยังสามารถใช้เพื่อแยกคอนเทนเนอร์แยก หากคอนเทนเนอร์มีสิทธิ์ CAP_SYS_ADMIN
ช่องโหว่ มีอยู่ในฟังก์ชัน legacy_parse_param() ใน VFS และเกิดจากการขาดการตรวจสอบขนาดสูงสุดของพารามิเตอร์ที่ให้มาอย่างเหมาะสมบนระบบไฟล์ที่ไม่สนับสนุน API บริบทของระบบไฟล์
เมื่อเร็ว ๆ นี้เพื่อนหลายคนในทีม CTF Crusaders of Rust ของฉันและฉันพบเคอร์เนลฮีปลินุกซ์ 0 วันล้น เราพบจุดบกพร่องผ่านการ fuzzing กับ syzkaller และพัฒนาอย่างรวดเร็วจนสามารถใช้ประโยชน์จาก Ubuntu LPE ได้ จากนั้นเราเขียนใหม่เพื่อหลีกเลี่ยงและรูทโครงสร้างพื้นฐาน Kubernetes CTF ที่แข็งของ Google ข้อบกพร่องนี้ส่งผลต่อเคอร์เนลทุกเวอร์ชันตั้งแต่ 5.1 (กำลังดำเนินการ 5.16) และได้รับมอบหมาย CVE-2022-0185 เราได้รายงานสิ่งนี้ไปยังรายชื่อการส่งเมลการแจกจ่ายและการรักษาความปลอดภัยของ Linux และจุดบกพร่องได้รับการแก้ไขแล้วตั้งแต่เผยแพร่บทความนี้
การส่งพารามิเตอร์ที่มีขนาดใหญ่เกินไปอาจทำให้เกิดการล้นได้ ของตัวแปรจำนวนเต็มที่ใช้ในการคำนวณขนาดของข้อมูลที่เขียน รหัสมีการตรวจสอบบัฟเฟอร์ล้น "if (len > PAGE_SIZE - 2 - ขนาด)" ซึ่งจะไม่ทำงานหากค่าขนาดมากกว่า 4094 เนื่องจากจำนวนเต็มล้นผ่านขอบเขตล่าง (จำนวนเต็มล้น เมื่อแปลง 4096 – 2 – 4095 ไปยัง int ที่ไม่ได้ลงนาม ได้รับ 2147483648)
ข้อผิดพลาดนี้ช่วยให้เมื่อเข้าถึงอิมเมจ FS ที่สร้างขึ้นเป็นพิเศษ ทำให้เกิดบัฟเฟอร์ล้นและเขียนทับข้อมูลเคอร์เนลตามพื้นที่หน่วยความจำที่จัดสรร ในการใช้ประโยชน์จากช่องโหว่นี้ จำเป็นต้องมีสิทธิ์ CAP_SYS_ADMIN เช่น สิทธิ์ของผู้ดูแลระบบ
ในปี 2022 เพื่อนร่วมทีมของเราได้แก้ไขเพื่อหาวันที่ 0 ในปี 2022 เราไม่ค่อยแน่ใจว่าจะเริ่มต้นอย่างไร แต่เนื่องจากทีมของเรามีความคุ้นเคยกับช่องโหว่เคอร์เนลในระดับสูง เราจึงตัดสินใจซื้อเซิร์ฟเวอร์เฉพาะบางตัว และเรียกใช้ syzkaller fuzzer ของ Google ในวันที่ 6 มกราคม เวลา 22 น. PST chop30 ได้รับรายงานต่อไปนี้เกี่ยวกับความล้มเหลวของ KASAN ใน legacy_parse_param: slab-out-of-bounds เขียนใน legacy_parse_param ดูเหมือนว่า syzbot จะพบปัญหานี้เมื่อ 0 วันก่อนเมื่อ fuzzing Android แต่ปัญหาไม่ได้รับการจัดการและเราคิดอย่างไร้เดียงสาว่าไม่มีใครสังเกตเห็น
ท้ายที่สุด เป็นเรื่องที่ควรค่าแก่การกล่าวขวัญถึงปัญหาที่เกิดขึ้นตั้งแต่เคอร์เนลลินุกซ์เวอร์ชัน 5.1 และได้รับการแก้ไขในการอัปเดตที่เผยแพร่เมื่อไม่กี่วันก่อนในเวอร์ชัน 5.16.2, 5.15.16, 5.10.93, 5.4.173
นอกเหนือจากนั้น การอัปเดตแพ็คเกจช่องโหว่ได้รับการเผยแพร่แล้ว สำหรับ RHEL, debian, fedora และ อูบุนตู. ในขณะที่วิธีแก้ปัญหายังไม่มีให้บริการใน Arch ลินุกซ์, Gentoo, SUSE y openSUSE
ในกรณีเหล่านี้ มีการกล่าวถึงว่าเป็นโซลูชันการรักษาความปลอดภัยสำหรับระบบที่ไม่ใช้การแยกคอนเทนเนอร์ คุณสามารถตั้งค่าของ sysctl "user.max_user_namespaces" เป็น 0:
นักวิจัยที่พบปัญหาได้ตีพิมพ์ ตัวอย่างของการเอารัดเอาเปรียบ que อนุญาตให้เรียกใช้โค้ดเป็นรูทบน Ubuntu 20.04 ในการกำหนดค่าเริ่มต้น มีการวางแผนว่า โค้ดการเอารัดเอาเปรียบถูกเผยแพร่บน GitHub ภายในหนึ่งสัปดาห์หลังจากนั้น ที่แจกจ่ายออกการปรับปรุงที่แก้ไขช่องโหว่
ในที่สุด หากคุณสนใจที่จะทราบข้อมูลเพิ่มเติมคุณสามารถตรวจสอบรายละเอียดได้ในไฟล์ ลิงค์ต่อไปนี้
อีกเหตุผลหนึ่งที่จะไม่แตะสแน็ปด้วยไม้